3

現在、Microsoft SQL Server 2008 R2 のパフォーマンスの高速化に取り組んでいます。クエリを分析すると、Microsoft データベース エンジン チューニング ツールが起動して、次のクエリでインデックスを作成します。

CREATE NONCLUSTERED INDEX [samplelocation1] ON [dbo].[sample_location]  
(
    [sample_id] ASC,
    [sample_code] ASC
) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]

これにより、バックアップから復元されたデータベースを使用して、テスト サーバー (同じバージョンの SQL サーバー 2008 R2 を実行) でのクエリの実行時間が 17 秒から 5 秒に短縮されます。

ただし、本番サーバーでは、実行時間が 17 秒から 1 分 40 秒に増加します。どうしたの?

クエリ:

select * 
from sample_view  
where version_date >= '<date>' 
  and version_date - 0.9999999 <= '<date>' 
  and (cus_id in (select company_id 
                  from company_emp_relation_view 
                  where user_id = '<userid>') 
       or 
       fac_id in (select company_id 
                  from company_emp_relation_view 
                  where user_id = '<userid>'))  
  and sample_code in (select min(sample_code)  
                      from sample_location 
                      group by sample_id) 
  and (rfq_status<>'I') 
  and location <> 'D'  
order by 
  version_date desc

クエリは私が作成したものではなく、非常に複雑に見えますが、クエリを変更せずにこれを解決したいと考えています。私が最も驚いたのは、インデックスの効果がシステム間で同じではないということです。

4

2 に答える 2

2

テストと実稼働システムのデータの量と分布はまったく異なる可能性があります。したがって、数百行のテスト システムで決定したことは、数百行の本稼働システムでは同じように機能しない可能性があります。何千行もの..

データの量と分布は、クエリ オプティマイザーがインデックスを使用するかどうか (または代わりにテーブル スキャンを行うかどうか) を決定する際の重要な要素です。そのため、パフォーマンス チューニングは実際のデータ (またはそのコピー) に対して実行する必要があります。データの一部しかない「ダミー」の開発またはテスト システムでは実行できません。

于 2012-11-28T05:46:51.257 に答える