1

我发生了一件奇怪的事情。我在 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
4

2 回答 2

1

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

希望这可以帮助,

账单

于 2009-06-06T07:54:38.547 回答
0

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

于 2009-06-08T04:57:37.683 回答