http://www.postgresql.org/docs/8.2/static /using-explain.html
По принцип последователното сканиране отива до действителните редове и започва четене от ред 1 и продължава, докато заявката бъде удовлетворена (това може да не е цялата таблица, напр. в случай на ограничение)
Сканирането на степ от растерни изображения означава, че PostgreSQL е намерил малко подмножество от редове за извличане (напр. от индекс) и ще извлече само тези редове. Това, разбира се, ще има много повече търсене, така че е по-бързо само когато се нуждае от малко подмножество от редове.
Вземете пример:
create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);
Сега можем лесно да получим seq сканиране:
explain select * from test where a != 4
QUERY PLAN
---------------------------------------------------------
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12)
Filter: (a <> 4)
Той направи последователно сканиране, защото смята, че ще грабне по-голямата част от масата; стремежът да се направи това (вместо голямо четене без търсене) би било глупаво.
Сега можем да използваме индекса:
explain select * from test where a = 4 ;
QUERY PLAN
----------------------------------------------------------------------
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 4)
И накрая, можем да получим някои операции с растерни изображения:
explain select * from test where a = 4 or a = 3;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12)
Recheck Cond: ((a = 4) OR (a = 3))
-> BitmapOr (cost=8.52..8.52 rows=2 width=0)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 4)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 3)
Можем да прочетем това като:
- Изградете растерно изображение на редовете, които искаме за a=4. (Сканиране на индекс на растерно изображение)
- Изграждане на растерно изображение на редовете, които искаме за a=3. (Сканиране на индекс на растерно изображение)
- Или двете растерни изображения заедно (BitmapOr)
- Погледнете тези редове в таблицата (сканиране на растерна графика) и проверете дали a=4 или a=3 (проверете отново cond)
[Да, тези планове за заявки са глупави, но това е, защото не успяхме да анализираме test
Ако го бяхме анализирали, всички щяха да са последователни сканирания, тъй като има 5 малки реда]