我发生了一些奇怪的事情。我在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
答案 0 :(得分:1)
保证最佳性能的最佳方法是将查询放入存储过程。然后使用查询分析器分析查询计划并验证SQL Server优化器是否正在使用有意义的索引(而不是表扫描)来检索数据。
希望这有帮助,
比尔
答案 1 :(得分:0)
您还应该删除SELECT *并将其替换为SELECT和列定义。在查询数据时,使用GUID也比使用int慢。