2009-09-10 55 views
5

作爲索引優化中的練習(閱讀:面試問題),我需要一個對SQL2005中的標準AdventureWorks數據庫很慢的查詢。我嘗試過的所有查詢都需要1秒左右的時間,我寧願有一個需要幾秒鐘的查詢纔能有效地進行優化。我需要對AdventureWorks進行緩慢查詢(SQL 2005)

任何人都可以在這裏創建這樣一個查詢或給我指針如何創建一個緩慢的查詢?我似乎無法讓我的查詢非高性能:)

+2

過早的去優化是所有的根源... – 2009-09-11 14:15:22

回答

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 2009-09-10 13:55:18

+0

@Lukasz - 查詢運行9秒(在我的機器上運行3次),因爲它返回了超過100000行,而不是因爲它忙於嘗試掃描表。兩個表都已經有了ProductID的索引,所以我不能提高那麼多。 – rein 2009-09-10 13:58:49

+0

@BradC - 這是正確的方法(通過未索引列進行過濾,或者更好,通過未索引列進行連接),但不幸的是,我無法達到某種程度,因爲這會導致我尋找不好的性能。 – rein 2009-09-10 13:59:46

0

嘗試對這些表或遊標之一使用相關的子查詢。