作爲索引優化中的練習(閱讀:面試問題),我需要一個對SQL2005中的標準AdventureWorks數據庫很慢的查詢。我嘗試過的所有查詢都需要1秒左右的時間,我寧願有一個需要幾秒鐘的查詢纔能有效地進行優化。我需要對AdventureWorks進行緩慢查詢(SQL 2005)
任何人都可以在這裏創建這樣一個查詢或給我指針如何創建一個緩慢的查詢?我似乎無法讓我的查詢非高性能:)
作爲索引優化中的練習(閱讀:面試問題),我需要一個對SQL2005中的標準AdventureWorks數據庫很慢的查詢。我嘗試過的所有查詢都需要1秒左右的時間,我寧願有一個需要幾秒鐘的查詢纔能有效地進行優化。我需要對AdventureWorks進行緩慢查詢(SQL 2005)
任何人都可以在這裏創建這樣一個查詢或給我指針如何創建一個緩慢的查詢?我似乎無法讓我的查詢非高性能:)
這裏有最行數據庫表的列表:
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分鐘。
更好,在未索引的列上添加「WHERE ListPrice> 1000」或其他東西。 – BradC 2009-09-10 13:55:18
@Lukasz - 查詢運行9秒(在我的機器上運行3次),因爲它返回了超過100000行,而不是因爲它忙於嘗試掃描表。兩個表都已經有了ProductID的索引,所以我不能提高那麼多。 – rein 2009-09-10 13:58:49
@BradC - 這是正確的方法(通過未索引列進行過濾,或者更好,通過未索引列進行連接),但不幸的是,我無法達到某種程度,因爲這會導致我尋找不好的性能。 – rein 2009-09-10 13:59:46
嘗試對這些表或遊標之一使用相關的子查詢。
過早的去優化是所有的根源... – 2009-09-11 14:15:22