Я не уверен в других базах данных, но для SQL Server я рекомендую план выполнения. Он очень четко (хотя и с большим количеством вертикальной и горизонтальной прокрутки, если у вас нет монитора 400), показывает, какие шаги вашего запроса втягивают время.
Если у вас есть один шаг, сумасшедший 80%, то, возможно, индекс может быть добавлен, а затем, после настройки индекса, повторите план выполнения, чтобы найти следующий самый большой шаг.
После пары настроек вы можете обнаружить, что действительно нет шагов, которые стоят из других, т. е. все они по 1-2%. Если это так, тогда вам может понадобиться выяснить, есть ли способ сократить объем данных, включенных в ваш запрос, сделать эти четыре миллиона закрытые заказы на продажу должны быть включены в запрос «Активные заказы на продажу»? Нет, поэтому исключить всех из них с помощью STATUS = 'C' ... или что-то вроде этого ,
Еще одно улучшение, которое вы увидите из Плана выполнения, - это поиск по закладкам, в основном он находит совпадение в индексе, но затем SQL Server должен быстро перетащить таблицу, чтобы найти нужную запись. Эта операция может время от времени занимать больше времени, чем просто сканирование таблицы в первую очередь, если бы это было так, вам действительно нужен этот индекс?
С индексами, и особенно с SQL Server 2005, вы должны посмотреть на предложение INCLUDE, это в основном позволяет вам иметь столбец в индексе без фактического индекса, поэтому, если все данные, которые вам нужны для вашего запроса, в вашем индексе или включенном столбце, тогда SQL Server не должен даже смотреть на таблицу, большой выбор производительности.
Выглядит очень похож на [более ранний вопрос] (http://stackoverflow.com/questions/39331/what-generic-techniques-can-be-applied-to-optimize-sql-queries#39344). – Unsliced 2008-09-14 07:23:53