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 に答える