2009-09-10 9 views
5

インデックスの最適化でエクササイズ(読み込み:インタビューの質問)するには、SQL2005の標準AdventureWorksデータベースでは遅いクエリが必要です。私が試したすべてのクエリは約1秒かかるので、効率的に最適化できるように複数の秒を要するクエリを使用することをお勧めします。AdventureWorks(SQL 2005)で低速のクエリが必要

ここで誰もこのようなクエリを作成したり、低速クエリを作成する方法の参考になれますか?私はちょうど私のクエリが非パフォーマンス作るように見えることはできません:)

+2

未熟な非最適化は、すべてのルートです... –

答えて

9

ここでは、ほとんどの行を持つデータベーステーブルのリストを持っている:

Tables - Rows count 
Sales.SalesOrderDetail - 121317 
Production.TransactionHistory - 113443 
Production.TransactionHistoryArchive - 89253 
Production.WorkOrder - 72591 
Production.WorkOrderRouting - 67131 
Sales.SalesOrderHeader - 31465 
Sales.SalesOrderHeaderSalesReason - 27647 
Person.Contact - 19972 
Person.Address - 19614 
Sales.CustomerAddress - 19220 
Sales.Customer - 19185 
Sales.ContactCreditCard - 19118 
Sales.CreditCard - 19118 
Sales.Individual - 18484 
Sales.CurrencyRate - 13532 

あなたがそのテーブルを使用してさまざまなバリエーションを試すことができます。たとえば、次のクエリ:

SELECT * FROM Sales.SalesOrderDetail s 
INNER JOIN Production.Product p ON s.ProductID = p.ProductID 

私のコンピュータで9秒間実行されます。

あなたはこのを実行することができます。

SELECT * FROM Production.TransactionHistory th 
INNER JOIN Production.TransactionHistoryArchive tha ON th.Quantity = tha.Quantity 

インナーインデックス付けされていないテーブルに結合します。非常に人工的な例ですが、現在のところ、マシンをロールするのに2分以上かかります。今 - 20分以上。今すぐ - 1時間20分

+0

さらに、 "WHERE ListPrice> 1000"または何かをインデックスに追加されていない列に追加します。 – BradC

+0

@ Lukasz - テーブルをスキャンしようとして忙しいからではなく、100,000以上の行を返すため、クエリは9秒間(私のマシン上では3回)実行されます。両方のテーブルには既にProductIDのインデックスがありますので、あまり改善できませんでした。 – rein

+0

@BradC - これは正しいアプローチです(インデックスのない列によるフィルタリング、またはより良いインデックス付けされていない列による結合)ですが、残念ながら私が探しているパフォーマンスが悪い。 – rein

0

これらのテーブルまたはカーソルの1つに対して相関サブクエリを使用してみます。