Postgres tarafından yayınlanan docs/wiki dosyasında işlevsel indeksler ve yalnızca dizin taramaları hakkında bilgi okudum.postgres 9.6 dizin sadece mantıksal olarak mantıksal olarak taranabilir fakat çalıştırılamıyor
SELECT(xpath('/document/uuid/text()', xmldata))[1]::text,
(xpath('/document/title/text()', xmldata))[1]::text
FROM xmltable
WHERE(xpath('/document/uuid/text()', xmldata))[1]::text = 'some-uuid-xxxx-xxxx'
ve dizin:
CREATE INDEX idx_covering_index on xmltable using btree (
((xpath('/document/uuid/text()', xmldata))[1]::text),
((xpath('/document/title/text()', xmldata))[1]::text)
)
Bu indeks, mantıksal olarak bakarak, bir örtü endeksidir ve bir indeks okunur-tarama imkan vermelidir
Ben şimdi gibi bir sorgu var Tüm sorgulanan değerler index (uuid ve başlık)
'da yer aldığından, şimdi biliyoruz ki, Postgres yalnızca fonksiyon indekslerinde kullanılan sütunlar fonksiyon parametrelerinde kullanılıyorsa n-çağrılar da
bulunan örn .:SELECT to_upper(column1) from table where id >10
1) bu endeks ile karşılanması mümkün değildir:
CREATE INDEX idx_covering_index on xmltable using btree (id, to_upper(column1));
2) ama bu bir tarafından karşılanabilir:
CREATE INDEX idx_covering_index on xmltable using btree (column1, id, to_upper(column1));
, yalnızca bir dizin taramasına yol açar. Şimdi benim xml kurulumu ile bu denerseniz
: "xml" kabul etmiyoruz maalesef normalde "text_ops"
veya "text_pattern_ops"
kullanılan, yeterince
data type xml has no default operator class for access method "btree"
adil:
CREATE INDEX idx_covering_index on xmltable using btree (xmldata,
((xpath('/document/uuid/text()', xmldata))[1]::text),
((xpath('/document/title/text()', xmldata))[1]::text)
)
bir hata alıyorum girdi - böylece indeksimi oluşturuyor - tüm değerleri kapsayacak şekilde olsa da - sadece dizin-taramalarını destekleyemiyor.
Bu, yalnızca dizinlere tarama olanağı sağlayan bir şekilde kullanılabilir mi?
Edit1 @:
Ben postgres endeksi kapsayan olarak 1'de görülen endeksi) kullanamazsınız, ama aynı zamanda bu davranışı doğrulamak için çok basit tablolarla denenmiş 2 gibi bir dizin)
kullanabileceğinizi biliyor ve ben de bunu okumayı hatırlıyorum - ama hayatımın için nerede olduğunu hatırlayamıyorum. EDIT2 @
create table test (
id serial primary key,
quote text
)
insert into test (number, quote) values ('I do not know any clever quotes');
insert into test (number, quote) values ('I am sorry');
CREATE INDEX idx_test_functional on test using btree ((regexp_replace(quote, '^I ', 'BillDoor ')));
set enable_seqscan = off;
analyze test;
explain select quote from test where regexp_replace(quote, '^I ', 'BillDoor ') = 'BillDoor do not know any clever quotes'
--> "Index Scan using idx_test_functional on test (cost=0.13..8.15 rows=1 width=27)"
drop index idx_test_functional;
CREATE INDEX idx_test_functional on test using btree (quote, (regexp_replace(quote, '^I ', 'BillDoor ')));
analyze test;
explain select quote from test where regexp_replace(quote, '^I ', 'BillDoor ') = 'BillDoor do not know any clever quotes'
--> "Index Only Scan using idx_test_functional on test (cost=0.13..12.17 rows=1 width=27)"
: xmltable arasında
Tam tablo tanımı:
id serial primary key (clustered),
xmldata xml (only data used to filter queries)
history xml (never queried or read, just kept in case of legal inquiry)
fileinfo text (seldom quieried, sometimes retrieved)
"timestamp" timestamp (mainly for legal inquiries too)
Tablo yaklaşık içerir .: 500.000 Kayıtlar, xmldata boyutu 350 ile 800 bayt arasındadır, tarih çok daha büyüktür ama nadiren alınabilir ve filtrelerde hiç kullanılmaz
Kayıt için, gerçek sonuçlara sahip olabilmek için, her zaman ben oluşturuldum veya bıraktıktan sonra analyze xmltable
koştum bir dizin
sorgu için tam bir yürütme planı:
explain analyze select (xpath('/document/uuid/text()', d.xmldata))[1]::text as uuid
from xmltable as d
where
(xpath('/document/uuid/text()', d.xmldata))[1]::text = 'some-uuid-xxxx-xxxx' and (xpath('/document/genre/text()', d.xmldata))[1]::text = 'bio'
bu indizies kapsadığı:
create index idx_genre on xmltable using btree (((xpath('/document/genre/text()', xmldata))[1]::text));
create index idx_uuid on xmltable using btree (((xpath('/document/uuid/text()', xmldata))[1]::text));
create index idx_uuid_genre on xmltable using btree (((xpath('/document/uuid/text()', xmldata))[1]::text), ((xpath('/document/genre/text()', xmldata))[1]::text));
ilk Lea için DS: - zihnimde -
"Index Scan using idx_genre on xmldata d (cost=0.42..6303.05 rows=18154 width=32)"
" Index Cond: (((xpath('/document/genre/text()'::text, xmldata, '{}'::text[]))[1])::text = 'bio'::text)"
" Filter: (((xpath('/document/uuid/text()'::text, xmldata, '{}'::text[]))[1])::text = 'some-uuid-xxxx-xxxx'::text)"
adil yeterince i kullanmaya zorlamak edeceğiz sadece test için, düşünce kapsayan endeksi:
drop index idx_uuid;
drop index idx_genre;
ve şimdi olsun:
"Bitmap Heap Scan on xmltable d (cost=551.13..16025.51 rows=18216 width=32)"
" Recheck Cond: ((((xpath('/document/genre/text()'::text, xmldata, '{}'::text[]))[1])::text = 'bio'::text) AND (((xpath('/document/uuid/text()'::text, xmldata, '{}'::text[]))[1])::text = 'some-uuid-xxxx-xxxx'::text))"
" -> Bitmap Index Scan on idx_uuid_genre (cost=0.00..546.58 rows=18216 width=0)"
" Index Cond: ((((xpath('/document/genre/text()'::text, xmldata, '{}'::text[]))[1])::text = 'bio'::text) AND (((xpath('/document/uuid/text()'::text, xmldata, '{}'::text[]))[1])::text = 'some-uuid-xxxx-xxxx'::text))"
Ayrıca, aynı yürütme planı, dizinde uuid ve tür anahtarlama pozisyonları çalıştı.
'Artık biliyoruz ki, postgres yalnızca işlev göstergelerinde kullanılan sütunların işlevlerini de içeren sütunları içeriyorsa işlev göstergelerindeki örtüşen göstergeleri de tanır; bu, bu belgeyi destekleyen belgelere herhangi bir gönderme yapabilir; çok karşı sezgisel. Yani ... nasıl şimdi biliyorsunuz ". –
'xmltable' tablonun tam tanımı nedir? Endeks mevcut ise icra için icra planı nedir? Postgres bir indeks araması için indeksi kullanıyor mu yoksa bu endeksi hiç kullanmıyor mu? –
biliyorum çünkü xml, düzenli tablolar, json vb. Ile denedim ve aynı zamanda bana garip görünüyordu - bu – billdoor