作为索引优化中的练习(阅读:面试问题),我需要一个对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