Оптимизация запросов ADO.NET - PullRequest
1 голос
/ 04 июня 2009

У меня происходит что-то странное. Первый запрос, который я получил от запуска профилировщика в приложении C # ADO.NET. То, что он делает, не так интересно, как способ передачи параметров - этот запрос занимает 250+ секунд, но когда я изменяю его (запрос 1), меняя способ передачи параметров (см. Запрос 2) тогда для завершения требуется <0,001 секунды. </p>

Что здесь происходит? Что мы можем сделать, чтобы заставить ADO.NET генерировать более оптимальный запрос?

-----------------------------------------------------------------------
-- Query 1
-----------------------------------------------------------------------
exec sp_executesql N'
SELECT 
    * 
FROM 
    BSM.Instruments 
WHERE 
    DataBlockId=@0 AND 
    InstrumentId IN (
        SELECT 
            DISTINCT InstrumentId 
        FROM 
            BSM.InstrumentPositions 
        WHERE 
            DataBlockId=@0 AND 
            PortfolioId IN (
                SELECT 
                    DISTINCT PortfolioId 
                FROM 
                    BSM.PortfolioLeaves(@1,@2)
            )
    )'
,N'@0 uniqueidentifier,@1 uniqueidentifier,@2 uniqueidentifier'
,@0='B1C69A98-50D3-11DE-A173-00155DE1F500'
,@1='ABADF5F7-50D3-11DE-A173-00155DE1F500'
,@2='ABADFF41-50D3-11DE-A173-00155DE1F500'

-----------------------------------------------------------------------
-- Query 2
-----------------------------------------------------------------------
declare @0 uniqueidentifier = 'B1C69A98-50D3-11DE-A173-00155DE1F500'
declare @1 uniqueidentifier = 'ABADF5F7-50D3-11DE-A173-00155DE1F500'
declare @2 uniqueidentifier = 'ABADFF41-50D3-11DE-A173-00155DE1F500'

exec sp_executesql N'
SELECT 
    * 
FROM 
    BSM.Instruments 
WHERE 
    DataBlockId=@0 AND 
    InstrumentId IN (
        SELECT 
            DISTINCT InstrumentId 
        FROM 
            BSM.InstrumentPositions 
        WHERE 
            DataBlockId=@0 AND 
            PortfolioId IN (
                SELECT 
                    DISTINCT PortfolioId 
                FROM 
                    BSM.PortfolioLeaves(@1,@2)
            )
    )
'
,N'@0 uniqueidentifier,@1 uniqueidentifier,@2 uniqueidentifier'
,@0
,@1
,@2

Ответы [ 2 ]

1 голос
/ 06 июня 2009

Лучший способ гарантировать оптимальную производительность - поместить ваш запрос в хранимую процедуру. Затем используйте анализатор запросов для анализа плана запроса и убедитесь, что оптимизатор SQL Server использует значимые индексы (в отличие от сканирования таблиц) для извлечения данных.

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

Bill

0 голосов
/ 08 июня 2009

Вам также следует избавиться от SELECT * и заменить его на SELECT и определения столбцов. Также использование GUID будет медленнее, чем использование int при запросе данных.

...