ADO.NET查询优化

时间:2009-06-04 12:06:01

标签: .net sql-server ado.net query-optimization

我发生了一些奇怪的事情。我在C#ADO.NET应用程序上运行探查器时获得的第一个查询。它所做的事情并不像传递参数那样有趣 - 这个查询需要250多秒才能完成,但是当我通过改变参数的传递方式来修改它(查询1)时(参见查询2),那么完成需要<0.001秒。

这里有什么用?我们可以做些什么来强制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 个答案:

答案 0 :(得分:1)

保证最佳性能的最佳方法是将查询放入存储过程。然后使用查询分析器分析查询计划并验证SQL Server优化器是否正在使用有意义的索引(而不是表扫描)来检索数据。

希望这有帮助,

比尔

答案 1 :(得分:0)

您还应该删除SELECT *并将其替换为SELECT和列定义。在查询数据时,使用GUID也比使用int慢。