Необходимо улучшить производительность SQL запросов - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть 3 таблицы a, b, c.

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-запросов.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 19 декабря 2011

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

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

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

2 голосов
/ 19 декабря 2011

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

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

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

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

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

0 голосов
/ 22 декабря 2011
  1. Избегайте использования *.Явно упомяните имена столбцов.
  2. Используйте некластеризованный индекс для таблиц с большим количеством записей.
  3. Используйте объединения вместо подзапросов.
  4. Используйте " SetNoCount On"в хранимых процедурах.
  5. Вы можете использовать временные таблицы.Вставьте необходимые данные и, наконец, выполните их.Не забудьте сбросить его перед выходом из хранимой процедуры.
0 голосов
/ 19 декабря 2011

Вы также можете попробовать использовать существует вместо 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 голосов
/ 19 декабря 2011

Можете ли вы выразить свои запросы как:

select * from b where b.aid = a.id and a.somefield = 'value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...