SQL-запрос становится слишком медленным - PullRequest
0 голосов
/ 01 февраля 2011

Несколько дней назад я написал один запрос, и он быстро выполняется, но теперь дни занимают 1 час. Этот запрос выполняется на моем сервере SQL7 и занимает около 10 секунд. Этот запрос существует на другом сервере SQL7, и до прошлой недели он занимал около 10 секунд. Конфигурация обоих серверов одинакова. Только оборудование отличается.

Теперь на втором сервере этот запрос занимает около 30 минут, чтобы извлечь Все детали, но кто-нибудь изменил какие-либо детали.

Если я выполню этот запрос без Где, он покажет мне детали в 7 секунд. Этот запрос все еще занимает примерно то же время, если проблема есть

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

Не зная, сколько данных входит в ваши таблицы, и не зная вашей схемы, трудно дать однозначный ответ, но на что нужно посмотреть:

  1. Попробуйте запустить UPDATE STATS или DBCC REINDEX.
  2. Есть ли у вас индексы на таблицах? Если нет, попробуйте добавить индексы к столбцам, используемым в предложениях WHERE и предикатах JOIN.
  3. Избегайте кросс-таблиц OR предложений (т. Е. Где вы делаете WHERE table1.col1 = @somevalue OR table2.col2 = @someothervalue). SQL не может эффективно использовать индексы с этой конструкцией, и вы можете повысить производительность, разбив запрос на две части и UNION получив результаты.
  4. Что делают ваши функции (UDF) и как вы их используете? Стоит отметить, что удаление их в части запроса в столбцах становится дорогим, так как функция выполняется для каждой возвращаемой строки: таким образом, если функция выполняет выборку для базы данных, то в итоге вы выполняете n + 1 запросов к базе данных (где n = количество строк, возвращаемых в основной выбор). Попробуйте и спроектируйте функцию, если это возможно.
  5. Убедитесь, что ваши СОЕДИНЕНИЯ верны - там, где вы используете LEFT JOIN, пересмотрите логику и посмотрите, должен ли он быть ЛЕВЫМ или его можно превратить во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Иногда люди используют LEFT JOIN, но когда вы исследуете логику в оставшейся части запроса, иногда может быть очевидно, что LEFT JOIN вам ничего не дает (потому что, например, кто-то, возможно, добавил предикат WHERE col IS NOT NULL к объединенной таблице ). ВНУТРЕННИЕ СОЕДИНЕНИЯ могут быть быстрее, поэтому стоит рассмотреть все из них.

Было бы намного проще предложить что-то, если бы мы могли видеть запрос.

0 голосов
/ 01 февраля 2011

Не видя запроса и, вероятно, данных, я ничего не могу сделать, кроме как предложить советы.

  1. Можете ли вы наложить больше ограничений на запрос.Если вы сможете уменьшить объем задействованных данных, это ускорит запрос.
  2. Посмотрите на столбцы, используемые в ваших объединениях, где и с предложениями и упорядочением по.Убедитесь, что таблицы, к которым относятся столбцы, содержат индексы для этих столбцов.
  3. Вам нужно использовать пользовательскую функцию или это можно сделать другим способом?
  4. Используете ли вы подзапросы?Если это так, можно ли их вывести в отдельные представления?

Надеюсь, это поможет.

...