Мне нужен медленный запрос на AdventureWorks (SQL 2005)
-
05-07-2019 - |
Вопрос
В качестве упражнения (читай: вопрос интервью) по оптимизации индекса мне нужен запрос, который выполняется медленно в стандартной базе данных AdventureWorks в SQL2005. Все запросы, которые я пробовал, занимают около 1 секунды, и я бы предпочел, чтобы запрос занимал несколько секунд, чтобы его можно было эффективно оптимизировать.
Может ли кто-нибудь здесь создать такой запрос или дать мне подсказки, как создать медленный запрос? Я просто не могу сделать мои запросы неработоспособными:)
Решение
Здесь у вас есть список таблиц базы данных с наибольшим количеством строк:
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 минут .
Другие советы
попробуйте использовать коррелированный подзапрос для одной из этих таблиц или курсора.