#sql #sql-server
Вопрос:
Эй, у меня проблемы с производительностью, и я действительно теряюсь, почему это происходит.
Проблема заключается в этом WHERE
пункте. Я хочу выбрать самую последнюю доступную дату, доступную в наборе данных. Если я создам VARCHAR(8)
(или Date
тип данных, на самом деле не имеет значения) и установлю для него значение типа 20210303
, а затем отфильтрую этот параметр, запрос займет около 30 секунд. Однако, когда я использую MAX
функцию в наборе данных и получаю то же значение ( 20210303
) и фильтрую его с помощью подзапроса, это занимает примерно в ДЕСЯТЬ раз больше времени.
Конечно, очевидным замечанием было бы то, что, возможно, применение MAX
функции занимает очень много времени, но это не так, потому что, когда я запускаю подзапрос сам по себе, у меня не возникает этой проблемы. И самое безумное, когда я заменяю параметр буквальным значением (в данном случае это было бы 20210303
), это также резко снижает производительность?!
Я действительно теряюсь в этом вопросе. Столбец, к которому я применяю фильтр, кстати, проиндексирован, так что это тоже не может быть проблемой.
Был бы очень признателен за некоторую помощь, и я бы с радостью дал больше информации, если кому-то это нужно.
ИЗМЕНИТЬ: не могу добавить фактический запрос, однако я могу дать его краткое описание:
SELECT
A.val1,
A.val2,
B.val1,
C.val1,
etc,
SUM(A.Value)
FROM A
INNER JOIN B
ON A.FK_B = B.FK_A
AND A.Date = B.Date
AND A.Location = B.Location
LEFT JOIN C
ON C.FK_C = B.FK_C
AND C.Date = A.Date
AND C.Location = A.Location
INNER JOIN D
ON A.FK_D = D.FK_A
AND A.Date = D.Date
AND A.Location = D.Location
--other joins that are very similar to the ones above
WHERE 1=1
AND A.Date = @Date
AND A.Location IN (Loc1, Loc2, ...)
AND A.Filter1 = Filter1
AND etc.
GROUP BY
A.val1,
A.val2,
B.val1,
C.val1,
etc,
HAVING
SUM(A.VALUE) <> 0
Все таблицы имеют Date
индексированный столбец. Если вам нужна дополнительная информация, пожалуйста, скажите об этом.
Комментарии:
1. Проблемы с производительностью без запроса скорее похожи на … ну, забудьте об аналогии. Без кода вопрос будет неполным.
2. да , пожалуйста , предоставьте свой запрос ( весь), а не только часть, с которой у вас возникли проблемы, также, возможно, предоставьте план выполнения, используйте вставить план
3. Также можете ли вы сообщить нам, есть ли у вас индекс в этом поле, и предоставить некоторую базовую структуру таблицы для таблицы.
4. » Если я создам VARCHAR(8) (или тип данных даты, на самом деле не имеет значения) » — наоборот. Это очень важно. Никогда не сохраняйте значения даты (или даты/времени) в
varchar
столбцах. Этот сайт полон людей, ищущих помощи из-за такого рода неправильных действий5. Пожалуйста, отметьте, какая версия sql server, и укажите 1. Запрос, 2, схема всех задействованных таблиц, 3, индексы и любые ограничения на таблицы, проблемный план выполнения с помощью PasteThePlan