2011-12-19 6 views
0

У меня 3 таблицы a, b, c.Необходимо улучшить производительность запросов sql

select * from a 

select * from b where aid in (select id from a) 

select * from c where bid in (select Id from b where aid in (select id from a)) 

Эти запросы в sp и работают нормально, но в качестве производительности мне нужно их оптимизировать. Не могли бы вы предложить, как улучшить производительность или любые инструменты, доступные для , оптимизировать SQL-запросы.

Спасибо.

+1

«отлично работает» - так почему, по-вашему, у вас проблема с производительностью? –

+0

работает отлично, давая правильный результат, но в третьем запросе я прохожу два подзапроса. в этом случае идентификатор id потомка b, который будет выполняться, так что время будет альтернативным способом. – Areeb

+0

Я бы предположил, что SQL Server 2008 имеет достаточно хороший оптимизатор, чтобы разобраться в реализации вашего нелепоэффективного кода sql, используя внутренние соединения, которые предложил Тудор Константин. Поэтому я был бы более готов поспорить, что вы увидите улучшение производительности, указав правильные индексы, как предлагал Anders UP. В любом случае, пожалуйста, сообщите нам, что произошло после того, как вы пробовали эти предложения. –

ответ

0

Вы можете выразить свои запросы, как:

select * from b where b.aid = a.id and a.somefield = 'value' 
3

Я думаю, что вы могли бы переписать запросы с помощью INNER JOIN:

select * from c 
INNER JOIN b ON b.id = c.bid 
INNER JOIN a ON a.id = b.aid 

, если у вас есть индексы ид, ставку и помощь все должно быть прекрасно

2

Может быть много причин, по которым ваши запросы медленные. Из того, что вы описали, несколько отправных точек могут быть:

  • Пропущенные или неверные индексы. По крайней мере, у вас должны быть индексы по столбцам, к которым вы присоединяетесь или фильтруетесь.
  • Статистика для индексов должна быть актуальной
  • В некоторых случаях индексы могут иметь больше полей в виде столбцов.
  • Правильное количество возвращенных данных - как в терминах столбцов, так и в строках. Если вы вернетесь слишком много, вы наполните различные буферы и уменьшите общую производительность.

Возможно, вы захотите использовать Tuning Advisor и/или SQL Server Profiler - оба будут доступны в меню Performance Tools в вашей папке SQL Server при запуске.

Кроме того, изучение возможностей отчетности Studios, а также ознакомление с планами исполнения являются хорошими отправными точками.

Для более продвинутых учащихся начните включать статистику для ввода-вывода запроса (в окне Query Window), используя монитор производительности Windows, чтобы следить за соответствующими счетчиками SQL Server и т. Д. Хорошее объяснение для некоторых из них можно найти здесь: http://www.sql-server-performance.com/2005/sql-server-performance-monitor-coutners/

0

Вы также можете попробовать использовать существующий вместо IN: s. Если выделить из данных, которые могут помочь: использование

SELECT 
    * 
FROM 
    a 

SELECT 
    * 
FROM 
    b 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      a 
     WHERE 
      a.id=b.aid 
    ) 

SELECT 
    * 
FROM 
    c 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      b 
     WHERE 
      c.bid=b.Id 
      AND EXISTS 
      (
       SELECT 
        NULL 
       FROM 
        a 
       WHERE 
        b.aid=a.id 
      ) 
    ) 
0
  1. Избегайте от *. Упоминайте явно имена столбцов.
  2. Используйте Non Clustered Index для таблиц с большим количеством записей.
  3. Используйте соединения вместо Sub Queries.
  4. Используйте «Set NoCount On» в Хранимой процедуре.
  5. Вы можете использовать таблицы Temp. Вставьте необходимые данные и завершите их. Не забывайте бросать его перед тем, как выйти из хранимой процедуры.
Смежные вопросы