В чем разница между Seq Scan и сканированием кучи Bitmap в postgres?

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


person Sunil    schedule 04.01.2009    source источник
comment
Проще говоря, последовательное сканирование не использует индексы (как правило, медленнее), а все остальные сканирования пытаются использовать индексы, определенные в таблице.   -  person Gnudiff    schedule 04.01.2009


Ответы (1)


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)

Мы можем прочитать это как:

  1. Создайте растровое изображение строк, которые мы хотим для a = 4. (сканирование растрового индекса)
  2. Создайте растровое изображение строк, которые мы хотим для a = 3. (сканирование растрового индекса)
  3. Или два растровых изображения вместе (BitmapOr)
  4. Найдите эти строки в таблице (сканирование кучи растровых изображений) и убедитесь, что a = 4 или a = 3 (перепроверьте условие)

[Да, эти планы запросов глупы, но это потому, что мы не смогли проанализировать test Если бы мы проанализировали это, все они были бы последовательными сканированиями, так как есть 5 крошечных строк]

person derobert    schedule 04.01.2009
comment
Или сканирование растрового изображения также может быть подмножеством сканирования индекса. - person WolfmanDragon; 04.01.2010
comment
@derobert, что ты имеешь в виду под поиском? Нигде не могу найти упоминания об этом... - person Vadim Samokhin; 03.08.2012
comment
@Zapadlo Поиск, как при поиске по диску, например, произвольный доступ вместо последовательного. - person derobert; 03.08.2012
comment
Сканирование кучи растровых изображений Postgresql не вернется к произвольному доступу. Растровое изображение представляет собой набор физических местоположений для сканирования, и сканирование кучи растровых изображений будет сканировать их в отсортированном порядке физического расположения. Кроме того, каждая страница, на которую ссылается растровое изображение, будет посещена только один раз при сканировании. - person simonp; 14.04.2014