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