Производительность запросов к SQL Server - PullRequest
3 голосов
/ 07 мая 2010

У меня есть хранимая процедура в загруженной базе данных, которая постоянно выходит на первое место в списке дорогих запросов (каким-то образом). Запрос очень прост, он принимает один параметр (@ID, int), который является первичным ключом таблицы, и выбирает запись, соответствующую этому идентификатору. Первичный ключ - это поле идентификаторов с кластеризованным индексом, поэтому я не знаю, как это оптимизировать дальше?

Запрос выглядит следующим образом

CREATE PROCEDURE [dbo].[P_Call_Get]

    @ID int = null

AS

    select ID,
        AppID,
        AgentID,
        AgentLogin,
        Ext,
        VDN,
        VDNName,
        Skill,
        SkillName,
        CallFrom,
        TelNoFrom,
        ParentCallID,
        CallStart,
        ACWStart,
        CallEnd,
        Outcome,
        StageID,
        TxTo,
        TxSuccess,
        ServiceID,
        DiallerID,
        CRC,
        TSCallID,
        CallDirection,
        [Manual],
        CallBackAgent,
        CallBackDateTime,
        Notes
    from P_Call
    where (ID = @ID or @ID is null)

Не уверен, что лучший способ опубликовать план выполнения - все, что он показывает, это то, что 100% операции выполняется при сканировании кластерного индекса

Ответы [ 4 ]

8 голосов
/ 07 мая 2010

Я думаю, что с помощью where (ID = @ID or @ID is null) вы получаете неоптимальный план. Разделите это на 2 отдельных запроса, чтобы в случае, если @Id не равен NULL, он просто просматривал его напрямую, и вы получали поиск, а не сканирование в плане. Вы можете создать представление с нужными вам столбцами, чтобы избежать повторения (т. Е. Запроса без предложения where)

select ID,
    AppID,
    AgentID,
    AgentLogin,
    Ext,
    VDN,
    VDNName,
    Skill,
    SkillName,
    CallFrom,
    TelNoFrom,
    ParentCallID,
    CallStart,
    ACWStart,
    CallEnd,
    Outcome,
    StageID,
    TxTo,
    TxSuccess,
    ServiceID,
    DiallerID,
    CRC,
    TSCallID,
    CallDirection,
    [Manual],
    CallBackAgent,
    CallBackDateTime,
    Notes
from P_Call
1 голос
/ 07 мая 2010

Попробуйте очистить кэш процедур и буферы памяти:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Выполнение этого перед проверкой производительности вашей процедуры предотвратит использование кэшированных планов выполнения и кэша предыдущих результатов.

0 голосов
/ 08 мая 2010

Сколько строк в таблице? Вы понимаете, что «сканирование кластеризованного индекса» = полное сканирование таблицы.

0 голосов
/ 07 мая 2010

вы можете использовать таблицу разделов. это может решить проблему.

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