Будьте осторожны, объединяя слишком много разных вещей. У вас есть логическая стоимость запроса, основанная на количестве проверяемых строк, (возможно) меньшая логическая стоимость, основанная на количестве фактически возвращенных строк, и несвязанная физическая стоимость, основанная на количестве страниц, которые необходимо изучить.
Три связаны, но не сильно.
Количество проверенных строк является наибольшим из этих затрат и наименее простым в управлении. Строки должны соответствовать алгоритму соединения. Это также наименее актуально.
Количество возвращаемых строк обходится дороже, поскольку это пропускная способность ввода-вывода между клиентским приложением и базой данных.
Количество прочитанных страниц является наиболее дорогостоящим, поскольку это еще большее количество физических операций ввода-вывода. Это наиболее затратно, поскольку нагрузка на базу данных влияет на всех клиентов.
SQL-запрос с одной таблицей: O ( n ). Это количество строк. Это также O ( p ) в зависимости от количества страниц.
С более чем одной таблицей проверяются строки O (n m ...). Это алгоритм вложенных циклов. Однако в зависимости от количества элементов отношения набор результатов может быть таким маленьким, как O ( n ), поскольку все отношения равны 1: 1. Но каждая таблица должна быть проверена на соответствие строк.
Hash Join заменяет O (n * log (n)) на индекс + чтение таблицы с O (n) прямым поиском хеша. Вам все еще нужно обработать O ( n ) строк, но вы пропускаете некоторые операции чтения индекса.
Соединение слиянием заменяет O (n m) вложенных циклов на операцию сортировки O (log (n + m) (n + m)).
С индексами стоимость физического может быть уменьшена до O (log (n) m), если таблица просто проверяется на наличие. Если строки необходимы, индекс ускоряет доступ к строкам, но все соответствующие строки должны быть обработаны. O (n m), потому что это размер набора результатов, независимо от индексов.
Страницы, проверенные для этой работы могут быть меньше, в зависимости от селективности индекса.
Смысл индекса не в том, чтобы так сильно уменьшать количество проверяемых строк. Это позволяет снизить стоимость ввода-вывода при извлечении строк.