Примеры оценки строк
В приведенных ниже примерах используются таблицы из базы данных регрессионного тестирования PostgreSQL. Представленные результаты взяты из версии 8.3.. Поведение более ранних (или более поздних) версий может отличаться. Также обратите внимание, что поскольку ANALYZE
использует случайную выборку при созд ании статистики, результаты немного изменятся после любого нового ANALYZE
.
Начнем с очень простого запроса:
EXPLAIN SELECT * FROM tenk1;
QUERY PLAN
-------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)
Количество страниц и строк указано в pg_class
:
SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';
relpages | reltuples
----------+-----------
358 | 10000
Эти числа актуальны на момент последнего VACUUM
или ANALYZE
в таблице. Затем планировщик получает фактическое текущее количество страниц в таблице (это недорогая операция, не требующая сканирования таблицы). Если это отличается от relpages
, то reltuples
масштабируется соответствующим образом, чтобы получить текущую оценку количества строк. В приведенном выше примере значение relpages
актуально, поэтому количество строк совпадает с reltuples
.
Перейдем к примеру с условием диапазона в предложении WHERE
:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;
QUERY PLAN
--------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=24.06..394.64 rows=1007 width=244)
Recheck Cond: (unique1 < 1000)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..23.80 rows=1007 width=0)
Index Cond: (unique1 < 1000)