2009-09-10 56 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

尝试对这些表或游标之一使用相关的子查询。