Каково различие между Сканированием Seq и Растровым сканированием "кучи" в пост-ГРЭС?

Убедитесь, что таблицы базы данных используют механизм хранения InnoDB и уровень изоляции транзакций READ-COMMITTED.

Вы можете проверить это с помощью SELECT @@ GLOBAL.tx_isolation, @@ tx_isolation; на консоли mysql.

Если он не установлен для READ-COMMITTED, вы должны его установить. Перед установкой убедитесь, что у вас есть привилегии SUPER в mysql.

Вы можете воспользоваться справкой из http://dev.mysql.com/doc/refman/5.0/en/set-transaction. html .

Установив это, я думаю, ваша проблема будет решена.


Вы также можете проверить, что вы не пытаетесь обновить это в два процесса одновременно. Пользователи (@tala) столкнулись с подобными сообщениями об ошибках в этом контексте, возможно, дважды проверьте, что ...

49
задан derobert 4 January 2009 в 08:24
поделиться

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);

Теперь, мы можем легко получить сканирование 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)

Это сделало последовательное сканирование, потому что это оценивает своя попытка захватить подавляющее большинство таблицы; стремясь сделать это (вместо большого, seekless чтение) было бы глупо.

Теперь, мы можем использовать индекс:

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 крошечных строк]

69
ответ дан derobert 7 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: