2011-02-01 2 views
0

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

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

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

+3

Показать запрос, который вы выполняете, пожалуйста. –

+0

запрос слишком длинный, так что я не могу его опубликовать. но это использует внутреннее объединение левой внешней связи и пользовательской функции и соединение в другой базе данных также – sanjiv

+0

вы обновили статистику по всем таблицам и индексам? – Karl

ответ

0

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

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

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

0

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

  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. Убедитесь, что ваши JOINs верны - где вы используете LEFT JOIN, перейдите к логике и посмотрите, должно ли оно быть LEFT или можно ли его превратить в INNER JOIN. Иногда люди используют LEFT JOINs, но когда вы изучаете логику в остальной части запроса, иногда бывает очевидно, что LEFT JOIN ничего не дает (потому что, например, кто-то мог добавить предикат WHERE col IS NOT NULL к объединенной таблице). INNER JOINs может быть быстрее, поэтому стоит рассмотреть все эти проблемы.

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

Смежные вопросы