2011-02-09 10 views
0

私は、SQLサーバーインストールのパフォーマンス上の問題を助けるように求められました。私はSQL Serverのエキスパートではありませんが、見てみることにしました。私たちは、問題なく動作するように見えるクローズドソースアプリケーションを使用しています。しかし、2000年から2005年にかけてSQL Serverをアップグレードした後、アプリケーションのパフォーマンスが著しく低下したと報告されています。私はSQLプロファイラを実行し、実行するために約30秒かかる次のクエリ(無実を保護するためにフィールド名が変更された)をキャッチしました。私の最初の考えは、私はクエリを最適化する必要がありました。しかし、アプリケーションがクローズドソースであり、ベンダーが役に立たないことを考えると、これは不可能です。ですから、私はこのクエリを変更せずにすばやく実行させる方法を理解しようとしています。また、古いSQL Server 2000製品でこのクエリがどのように速く実行されたかについてもわかりません。おそらく、新しいSQLサーバー上で実行されなかったり、動作しなかったりするインスタンスに、ある種のパフォーマンスチューニングが適用されていた可能性があります。 DBCC PINTABLEが気になります。Microsoft SQL Server:ダムクエリのパフォーマンスを向上させる方法

とにかく、ここで問題のクエリは次のとおりです。

select min(row_id) from Table1 where calendar_id = 'Test1' 
and exists 
    (select id from Table1 where calendar_id = 'Test1' and 
     DATEDIFF(day, '12/30/2010 09:21', start_datetime) = 0 
    ) 
and exists 
    (select id from Table1 where calendar_id = 'Test1' and 
     DATEDIFF(day, end_datetime, '01/17/2011 09:03') = 0 
    ); 

表1は、およそ6200のエントリを持っており、このようになります。私は効果のない様々な指標を作成しようとしました。

id     calendar_id start_datetime end_datetime 
int, primary key varchar(10) datetime  datetime 
1     Test1  2005-01-01... 2005-01-01... 
2     Test1  2005-01-02... 2005-01-02... 
3     Test1  2005-01-03... 2005-01-03... 
... 

誰かがこの謎を解決することができれば非常に感謝します。

ありがとうございます。

+0

このコードはストアドプロシージャ内にありますか? SPパラメータは駆動されていますか? –

答えて

1

インデックスが変換を行ったことを確認してください。統計を更新します。

+0

インデックスは実際にここで違いはありますか? Where句に関数を置くと、実行されるたびにテーブルスキャンが強制されませんか? – Thomas

1

古いSQL Serverの実行計画と新しいSQL Serverの実行計画の違いを確認します。

create index <indexname> 
    on table (calendar_id, id) 
    include (start_datetime, end_datetime); 

これは、min(row_id)ソートをcalendar_id = 'Test1'述語を満足させると、非SARG可能なDATEFIFF述語を評価するための材料を提供します:助けるべきhttp://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx

2

一つのことはCALENDAR_ID上の被覆指数であります。テーブルに他の列がない場合は、おそらく必要なクラスタ化インデックスであり、idプライマリキーはクラスタ化されていないものにする必要があります。

+0

各行でDateDiffを評価するためにテーブルスキャンを実行する必要はありませんか? – Thomas

+1

@トーマス:私が言ったように、DATEDIFFはSARGに対応していません。 –

0

Remus Rusanuのインデックス提案を超えてできることは、SQL Server 2005と2008 Enterprise Editionの両方で、より高度なスキャン機能を備えたエンタープライズ版にアップグレードすることです。テーブルスキャン。

それ以外では、クエリを変更できない場合は何もできないと思います。理由は、クエリがWhere句の関数結果との比較を行っているためです。これは、SQL Serverが実行されるたびにTable1でテーブルスキャンを実行させることを意味します。

Reading Pages (more info about Advanced Scanning)

関連する問題