Проблема с производительностью, Где Оговорка

#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