В выводе команды объяснения я обнаружил два термина «последовательное сканирование» и «растровое сканирование кучи». Может кто-нибудь подскажет, в чем разница между этими двумя типами сканирования? (Я использую PostgreSql)


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);
Теперь мы можем легко получить последовательное сканирование:
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)
Мы можем читать это так:
[Да, эти планы запросов глупы, но это потому, что мы не смогли проанализировать test. Если бы мы проанализировали его, все они были бы последовательными сканированиями, поскольку есть 5 крошечных строк]
Или сканирование растрового изображения также может быть подмножеством сканирований индекса.
@derobert, что ты имеешь в виду под "поиском"? Нигде не могу найти упоминания об этом ...
@Zapadlo Поиск как при поиске по диску, например, произвольный доступ вместо последовательного.
Сканирование кучи Bitmap Postgresql не вернется к произвольному доступу. Растровое изображение - это набор физических местоположений для сканирования, и сканирование Bitmap Heap Scan будет сканировать их в отсортированном порядке физического местоположения. Кроме того, каждая страница, на которую ссылается растровое изображение, будет посещена только один раз при сканировании.
Проще говоря, «последовательное сканирование» не использует индексы (обычно медленнее), а все другие сканирования пытаются использовать индексы, определенные в таблице.