“Bitmap yığın taraması” ve “bitmap dizin taraması” nı anlama


36

Yanlış anlamalarımı aşağıdaki örnekle açıklamaya çalışacağım.

Anlamadığım temellerini ait Bitmap Heap Scan Node. SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';Planı şunun olduğu sorguyu düşünün :

Bitmap Heap Scan on customers  (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
  Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
  ->  BitmapAnd  (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
        ->  Bitmap Index Scan on ix_cust_username  (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
              Index Cond: ((username)::text < 'user100'::text)
        ->  Bitmap Index Scan on customers_pkey  (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
              Index Cond: (customerid < 1000)

Benim bu düğümü anladım :

Orada açıklandığı gibi , bitmap heap scantablo bloklarını sıralı olarak okur, bu nedenle tam da olduğu gibi gerçekleşen rastgele tablo erişimi ek yükü üretmez Index Scan.

Yaptıktan sonra Index Scan, PostgreSQL gereksiz yere kaçınmak için heap blocks reads(ya hitsda sıcak önbellek varsa) sıraları nasıl en iyi şekilde alacağını bilmiyor . Bunu çözmek için , benim durumumda indekslerden iki bitmap üreterek ve bunları gerçekleştirerek Bitmap Index Scanadı verilen yapıyı ( ) bitmapoluşturur BITWISE AND. Bitmap oluşturulduğundan, masayı sıralı bir sırayla en uygun şekilde okuyabilir, gereksiz yere kaçınır heap I/O-operations.

Bir çok sorunun geldiği yer orası.

SORU: Sadece bir bitmap var. PostgreSQL, sadece bir bitmap ile satırların fiziksel düzeniyle ilgili herhangi bir şeyi nasıl bilir? Veya bitmap'i oluşturur, böylece herhangi bir öğesi işaretçiye kolayca bir sayfaya eşlenebilir mi? Eğer öyleyse, bu her şeyi açıklıyor, ama bu sadece benim tahminim.

Öyleyse, bitmap heap scan -> bitmap index scanbunun sıralı bir tarama gibi olduğunu ancak yalnızca tablonun uygun kısmının olduğunu söyleyebilir miyiz ?


Bunlardan bazılarını burada bir açıklama yazdım: stackoverflow.com/q/33100637/398670
Craig Ringer

@CraigRinger Neyi anlamadığımı doğru bir şekilde açıklamadım. Elbette, açıkladığınız gibi, PostgreSQL'in tabloyu sırayla okuduğu bir bitmap var. Belirli bir bitmap tarafından belirlenen gerçek bloğu nasıl çözebileceğini anlamıyorum 001001010101011010101. Ya da aslında önemli değil ve tek bilmemiz gereken bitmap ile oldukça hızlı bir şekilde bir blok bulabilmesi ...?
St.Antario

Ah, burada "bitmap" in ne anlama geldiğini yanlış anlıyor olabilirsiniz. Bir düzenlemeyi izleyeyim.
Craig Ringer

@CraigRinger Belki, tanımı oradan aldım .
St.Antario

Yanıtlar:


52

PostgreSQL, sadece bir bitmap ile satırların fiziksel düzeniyle ilgili herhangi bir şeyi nasıl bilir?

Bitmap, yığın sayfası başına bir bit'tir. Bitmap dizin taraması, bitleri dizin girişinin işaret ettiği yığın sayfa adresine göre ayarlar.

Bu yüzden, bitmap yığın taraması yapmaya gittiğinde, yalnızca belirli bir sayfa ile uğraşması veya üzerinde arama yapması gerekip gerekmediğini görmek için bitmap'i okuyarak doğrusal bir tablo taraması yapar.

Veya bitmap'i oluşturur, böylece herhangi bir öğesi işaretçiye kolayca bir sayfaya eşlenebilir mi?

Hayır, bitmap yığın sayfalara 1: 1 karşılık gelir.

Bu konuda biraz daha yazdım burada .


Tamam, bu bağlamda "bitmap" in ne anlama geldiğini yanlış anlıyor olabilirsiniz.

Her yığın sayfası veya okunan her dizin için veya herhangi bir şey için oluşturulan "101011" gibi bir bit dizgisi değildir.

Bitmap'in tamamı , taranmakta olan ilişkide yığın sayfalar olduğu kadar çok bit içeren tek bir bit dizisidir .

Bir bitmap, ilk dizin taraması tarafından yaratılır ve 0 (false) ile başlatılır. Arama koşulu ile eşleşen bir dizin girişi bulunduğunda, bu dizin girişinin gösterdiği yığın adresi bitmap'e bir ofset olarak bakılır ve bu bit 1 (true) olarak ayarlanır. Öyleyse doğrudan yığın sayfasına bakmak yerine, bitmap dizin taraması bitmap'teki karşılık gelen bit konumuna bakar.

İkinci ve daha fazla bitmap indeksi taramaları, diğer indekslerle ve bunlar üzerindeki arama koşullarıyla aynı şeyi yapar.

Sonra her bitmap birlikte ANDed. Ortaya çıkan bitmap her yığın sayfası için bir bit içerir; burada bitler yalnızca tüm bitmap indeksi taramalarında doğruysa doğrudur, yani her indeks taraması için eşleşen arama koşulu. Yüklemek ve incelemek için uğraşmamız gereken tek yığın sayfalar bunlar. Her yığın sayfası birden fazla satır içerebileceğinden, tüm koşullara uyup uymadığını görmek için her satırı incelememiz gerekir - "yeniden kontrol cond" bölümünün konusu budur.

Tüm bunları anlamanın çok önemli bir özelliği, bir dizin girişindeki tuple adresinin satır ctidsayfalarına işaret etmesidir; bu, yığın sayfa numarasının ve yığın sayfa içindeki ofsetin bir birleşimidir. Bir bitmap dizini taraması ofsetleri yok sayar, çünkü tüm sayfayı yine de kontrol eder ve o sayfadaki herhangi bir satır koşulla eşleşirse biti ayarlar.


Grafiksel örnek

Heap, one square = one page:
+---------------------------------------------+
|c____u_____X___u___X_________u___cXcc______u_|
+---------------------------------------------+
Rows marked c match customers pkey condition.
Rows marked u match username condition.
Rows marked X match both conditions.


Bitmap scan from customers_pkey:
+---------------------------------------------+
|100000000001000000010000000000000111100000000| bitmap 1
+---------------------------------------------+
One bit per heap page, in the same order as the heap
Bits 1 when condition matches, 0 if not

Bitmap scan from ix_cust_username:
+---------------------------------------------+
|000001000001000100010000000001000010000000010| bitmap 2
+---------------------------------------------+

Bit eşlemler bitsel olarak oluşturulduktan sonra VE üzerinde yapılır:

+---------------------------------------------+
|100000000001000000010000000000000111100000000| bitmap 1
|000001000001000100010000000001000010000000010| bitmap 2
 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|000000000001000000010000000000000010000000000| Combined bitmap
+-----------+-------+--------------+----------+
            |       |              |
            v       v              v
Used to scan the heap only for matching pages:
+---------------------------------------------+
|___________X_______X______________X__________|
+---------------------------------------------+

Bitmap yığın taraması daha sonra her sayfanın başlangıcına bakar ve sayfayı okur:

+---------------------------------------------+
|___________X_______X______________X__________|
+---------------------------------------------+
seek------->^seek-->^seek--------->^
            |       |              |
            ------------------------
            only these pages read

ve her okunan sayfa daha sonra tekrar kontrol edilir, çünkü sayfa başına> 1 satır olabileceği ve hepsinin şartla eşleşmesi gerekmediği için tekrar kontrol edilir.


Ah, bu onlar tarafından kastediyordum doldurma bit eşlem.
St.Antario

@ St.Antario Açıklamak için grafikler ekledim
Craig Ringer

Bitmap taramasıyla ilgili bir şeyi daha açıklığa kavuşturmama izin verin. Sayfaları yığınlamak için 1: 1 bitmap bulunduğunu ve bitmap'teki bit dizinine göre bir yığın sayfası belirleyebileceğimizi söylediniz. İlişki, bir diskteki sayfaları sıralı olmayan bir sırada (kümelenmemiş) içerebileceğinden, bir bitmap'te sadece bir ofsetle bir sayfanın adresini nasıl belirleyebileceğimiz tam olarak belli değil. Sanırım planlamacı , belirli bir ilişki için ofset yaparak bir sayfa adresini nasıl hesaplayacağını biliyor . Bu doğru mu?
StAntario

1
Bu yüzden sürücüye tüm sayfaları koymak zorundayız. Dahası, ilişkinin verileri iki veya daha fazla sürücüye yayılabilir (bu nedenle , ilişkilerin sayfalarının herhangi bir doğrusal düzenini hayal etmek zordur ), bu nedenle bir sonraki sayfanın gerçek ofsetini belirlemek zordur. Çünkü "ofset" ile, sürücüdeki fiziksel bir pozisyona karşılık gelen gerçek fiziksel ofset anlamına geldiğine inanıyorum.
StAntario

2
PostgreSQL en küçük sürücülere aldırış etmiyor. Sadece umurunda dosyalar üzerinde dosya sistemi . Mantıksal ilişki için dosya doğrusal ve bitişik olduğunu ve en ne anlama bitmap bitti. (Dosyada birden fazla uzantı olabilir, ancak sürekli eklenmiş gibi işlem görürler ve bitmap hepsinin üzerindedir). Yanlış soyutlama seviyesine bakıyorsun. (Bir yandan notta, bir bitmap dizin taramasındaki bitmap, planlayıcı tarafından hesaplanmaz, btree dizin erişim yönteminin bir parçasıdır ve planlayıcıdan çok uygulayıcı ile ilgilidir).
Craig Ringer

3

Lütfen PostgreSQL'deki bitmap taramasının detayları için https://rajeevrastogi.blogspot.in/2018/02/bitmap-scan-in-postgresql.html?showComment=1518410565792#c4647352762092142586 blog yazıma bakın .

Bitmap taramasının genel hızlı işlevselliğine genel bakış:

  1. Bitmap Yığın taraması, Bitmap Dizin Taraması'ndan bir bağlantı ister.

  2. Bitmap İndeks Taraması indeksi, duruma göre normal İndeks Taramasında yapıldığı gibi tarayın. Ancak, yığın verisine karşılık gelen TID (bunun içinde sayfa no ve ofsetinden oluşan) döndürmek yerine, bu TID'yi bir bitmap'e ekler. Basit bir anlama için, bu bitmap'in tüm sayfaların (sayfa no'ya göre karma) karma içerdiğini ve her sayfa girişinin o sayfadaki tüm ofsetlerin dizisini içerdiğini düşünebilirsiniz.

  3. Ardından Bitmap Yığın Taraması, saklanan sayfa numarasına ve ofsete karşılık gelen yığın verilerini almak için bitmap üzerinden okur. Daha sonra görünürlük, yeterlilik vb. Olup olmadığını kontrol eder ve tüm bu kontrollerin sonucuna dayanarak bağlantıyı döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.