подзапросы работают хуже после обновления версии базы данных - PullRequest
4 голосов
/ 22 сентября 2010

Со времен SQL Server 2000 мы использовали несколько вложенных запросов для отчетов.

select * from 
 (select * from t1) t1 
  inner join
 (select * from t2) t2
 on........

Недавно мы обновили нашу базу данных до SQL Server 2008 Standard с SQL Server 2000 Enterprise. Мы замечаем, что некоторые из этих старых запросов сейчас выполняются очень медленно или даже по тайм-ауту. Размер базы данных действительно сильно не изменился.

Мы исправили вышеуказанную проблему, заменив некоторые из вложенных запросов временными таблицами.

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

Любое понимание или мысли будут полезны.

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

Как правило, один запрос будет медленнее, чем использование временных таблиц и нескольких запросов.Таким образом, может показаться, что обновленный SQL Server может не иметь текущих знаний о данных.

После обновления SQL Server вы должны убедиться, что информация о ваших базах данных обновлена.Одна вещь, которую вам определенно следует сделать, - обновить статистику таблиц базы данных.

Вы также можете обнаружить, что могут быть более эффективные способы выполнения запросов с более новой версией SQL Server.Поэтому после обновления статистики вы можете ознакомиться с новыми функциями текущей версии SQL Server.

1 голос
/ 22 сентября 2010

Я надеюсь, что вы упростили свой пример запроса для целей этого поста. В противном случае, я не понимаю, почему вы бы select * from каждая таблица в подзапросах, когда вы могли бы просто сделать это вместо:

select * 
    from t1 
        inner join t2
            on........
1 голос
/ 22 сентября 2010

Если бы я был на вашем месте, я бы начал с оценки плана выполнения, чтобы увидеть, каковы основные накладные расходы.Оттуда вы действительно можете определить истинную причину.

1 голос
/ 22 сентября 2010

Как правило, оптимизаторы запросов в MSSQL 2000 и 2008 очень разные. Таким образом, вполне возможно, что некоторые запросы будут выполняться значительно быстрее по одному из них - в основном, вам придется заново оптимизировать все ваши тяжелые запросы (возможно, с использованием некоторых новых функций - CTE, оконных функций, индексов с включенными данными, чтобы назвать несколько ).

По моему опыту, MSSQL 2008 обычно лучше "понимает" вложенные запросы, хотя в вашем случае это может быть иначе. Если ваша временная таблица идентична результату вложенного запроса, было бы очень странно, если бы вариант временной таблицы был быстрее (поскольку серверу нужно выполнить больше работы для получения того же результата).
Пока что я предполагаю, что вы не правы в том, что вложенные запросы являются причиной проблемы с производительностью, но я не могу сказать, что на самом деле является ее причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...