Member 10379103 Ответов: 1

Запрос с использованием dateadd выполняется очень долго


Я пытаюсь показать магазины, которые не обновляли свой товарный запас в течение x дней.

Районный менеджер хочет ввести номер (например, 90 или 365) и получить список всех магазинов и последних запасов, которые они заказали. Таким образом, если 90 магазинов ничего не заказывали за последние 90 дней, необходимо отобразить название магазина и все товары, которые они заказывали в последний раз.

Если я использую это:
WHERE MerchLastShippedDate = DATEADD("d", -@Days, CONVERT(VARCHAR(10),Getdate(),101)) 
мой запрос выполняется в нормальном количестве времени. Но это не показывает мне всего, что мне нужно. Это когда я использую нижеприведенное, чтобы показать мне все, что старше, чем количество дней, которые я ввожу, что запрос занимает слишком много времени для выполнения.

Как я могу исправить это и заставить мой запрос работать быстрее?

Вот мой код:
IF object_id('tempdb..#ActiveStores') is not null
BEGIN
    DROP TABLE #ActiveStores
END

SELECT DISTINCT
	Storename,
	StoreId
	INTO #ActiveStores
FROM 
	StoresTable
Where Storestatus = 1
	and Storename <> '  '
Order by
	StoreID


IF object_id('tempdb..#MerchDays') is not null
BEGIN
    DROP TABLE #MerchDays
END
  

Create Table #MerchDays
(StoreID varchar(100),
StoreName varchar(100),
MerchID varchar(50),
Manager  varchar(100),
MerchLastShippedDate datetime,
MerchNumber varchar(100),
QtyMerchShipped float,
AmtMerchShipped float

)

INSERT INTO #MerchDays
(StoreID, StoreName, MerchId, Manager, MerchLastShippedDate, MerchNumber, QtyMerchShipped, AmtMerchShipped)
SELECT StoreID, StoreName, MerchId, Manager, MerchLastShippedDate, MerchNumber, QtyMerchShipped, AmtMerchShipped
FROM MainStoredInventoryMerchTbl 
 
WHERE MerchLastShippedDate <= DATEADD("d", -@Days, CONVERT(VARCHAR(10),Getdate(),101)) 
 GROUP BY StoreID, StoreName, MerchId, Manager, MerchLastShippedDate, MerchNumber, QtyMerchShipped, AmtMerchShipped
ORDER BY StoreID

</<pre lang="SQL">

What I have tried:

MSDN, Google search, stackoverflow

RossMW

Dateadd работает над полями типа даты, почему вы преобразуете его в varchar.

Кроме того, один запрос имеет "=", а другой - "<=". Если MerchLastShippeddate является полем datetime, то вероятность его равенства очень мала и, вероятно, поэтому никакие записи не возвращаются

Member 10379103

В этом случае есть записи, возвращаемые при использовании"=". Это поле отформатировано так же, как и другое. Мне нужно захватить все, что не попадает в эти дни.

1 Ответов

Рейтинг:
1

Graeme_Grant

Мой SQL немного заржавел, но похоже, что вы вычисляете фиксированную дату внутри цикла, а не снаружи. т. е.: вычислять один раз, а не для каждой записи?


Valery Possoz

Это поможет.
Кроме того, временные таблицы печально известны своей медлительностью... Избегайте, если производительность вызывает беспокойство! может быть, попробуйте заменить их переменными таблицами или даже лучше вообще не использовать временные таблицы.
В этом довольно простом фрагменте кода, похоже, нет никаких причин использовать временные таблицы, вы можете получить тот же результат напрямую.

Member 10379103

Мне было поручено использовать временные таблицы. Пойди разберись, ладно?

Как можно было бы переписать запрос без временных таблиц? Используя соединение?