Первое, что я делаю в этом случае, это изолирую, является ли это объемом данных, которые я возвращаю, это проблема или нет (проблема ввода / вывода). Простой ненаучный способ сделать это - изменить свой запрос, просто вернув счетчик:
select count(*) --just return a count, no data!
from MyTable
inner join MyOtherTable on ...
where ...
Если это выполняется очень быстро, это говорит о том, что ваши индексы в порядке (при условии, что в предложении WHERE
нет подвыборов). Если нет, то вам нужно поработать с индексами , предложением WHERE
или самой конструкцией запроса (выполняются JOINs и т. Д.).
Как только это удовлетворительно, добавьте обратно в ваше предложение SELECT
. Если он медленный, вам нужно взглянуть на ваш шаблон доступа к данным:
- Можете ли вы вернуть меньше столбцов?
- Можете ли вы вернуть меньше строк одновременно?
- Можно ли выполнять кэширование на уровне приложений?
- Является ли этот запрос кандидатом для секционированных / материализованных представлений (если ваша база данных поддерживает их)?