PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Каква е разликата между Seq Scan и Bitmap heap сканиране в postgres?

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)

Можем да прочетем това като:

  1. Изградете растерно изображение на редовете, които искаме за a=4. (Сканиране на индекс на растерно изображение)
  2. Изграждане на растерно изображение на редовете, които искаме за a=3. (Сканиране на индекс на растерно изображение)
  3. Или двете растерни изображения заедно (BitmapOr)
  4. Погледнете тези редове в таблицата (сканиране на растерна графика) и проверете дали a=4 или a=3 (проверете отново cond)

[Да, тези планове за заявки са глупави, но това е, защото не успяхме да анализираме test Ако го бяхме анализирали, всички щяха да са последователни сканирания, тъй като има 5 малки реда]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да се пагинира изберете на slick + postgresql

  2. psycopg2:вмъкване на няколко реда с една заявка

  3. Как да добавя нова колона в таблица след 2-ра или 3-та колона в таблицата с помощта на postgres?

  4. Yii Framework:Таблицата за клас активен запис не може да бъде намерена в базата данни

  5. Плъзгаща се средна въз основа на времеви печати в PostgreSQL