2012-12-11 11 views
7

text_pattern_ops gibi eşleştirme modeli için operatör sınıfı oluşturun ('1' < '2' < '10' < '11' vs), benim yeni operatörler #<# kullanarak, #<=#, #># ve #>=#. Ben benim yeni text_natsort_ops kullanarak bir dizin oluştururkenBen doğal sırası kullanılır metin veri türü üzerinde kendi karşılaştırma operatörlerini yarattı

CREATE OPERATOR CLASS text_natsort_ops 
    FOR TYPE text USING btree AS 
    OPERATOR 1 #<#, 
    OPERATOR 2 #<=#, 
    OPERATOR 3 =, 
    OPERATOR 4 #>=#, 
    OPERATOR 5 #>#, 
    FUNCTION 1 bttext_natsort_cmp(text, text); 

Ancak, bu sorgularda kullanılmaz:

Şimdi bu gibi üzerlerinde bir dizin oluşturmak mümkün bir operatör sınıfa yerleştirmek like dahil, text_pattern_ops kullanıldığında yapılır.

nasıl operatör sınıfı dizinimi kullanmak like izin vermek beyan edersiniz?

GÜNCELLEME:

yukarıdaki iş gibi görünüyor, bu yüzden soru geçersiz.

select * 
    from mytable 
where number like 'edi%' 
order by number using #<# 
limit 10 

ve ben de çok daha hızlı iş gibi görünüyor, çünkü planlayıcısı seçtikleri text_pattern_ops, kullanarak başka indeksi vardı: My asıl sorun ben gibi bir sorgu kullanılan olmasıydı. order by ... using sadece indeksi faydalı olacaktır benim yeni op kullanarak Ancak, ... diğer endeks çok fazla sonuç verir ve I endeksi taramasına kullanılabilir olması limiti şartı gerekiyor.

+2

Güncelleştirmenizi yanıt olarak göndermelisiniz, bu nedenle bu Q "yanıtsız" olarak görünmez. –

cevap

0

Yukarıdaki gibi görünüyor, bu nedenle soru geçersizdir.

select * 
    from mytable 
where number like 'edi%' 
order by number using #<# 
limit 10 

ve ben de çok daha hızlı iş gibi görünüyor, çünkü planlayıcısı seçtikleri text_pattern_ops, kullanarak başka indeksi vardı: My asıl sorun ben gibi bir sorgu kullanılan olmasıydı. Ancak, yeni dizinlerimi kullanarak yalnızca dizini kullanarak yapılan sıralamadan dolayı ... diğer dizin çok fazla sonuç döndürüyor ve dizin taramasında kullanılabilmesi için sınırlama maddesine ihtiyacım var.

0

bu mümkün olduğunu düşünmüyorum. Ne yaptığınızı ve bunun neden işe yaramadığını düşünmelisiniz. Ya bir önek araması veya doğal sayı aralığı aramasını destekleyen bir şeyi destekleyen bir dizine sahip olacaksınız. Her ikisini de destekleyen bir btree dizini olamaz.

SELECT * FROM foo 
WHERE bar like '10%' 
ORDER BY bar USING #>#; 

Senin sorunun da iki endeksleri maç olacak bir emir yok olmasıdır:

gibi bir şey düşünün. gidecek LIKE ile kullanım 101, 101,000, 101.001, vb sipariş için endeks gidecek iken için endeks 10, 11, 12, 13 ... 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, ...

doğrudan sipariş için aynı indeks kullanmak için hiçbir yolu yoktur farklı arama emri gerektirdiğinden. PostgreSQL'in endekslerin fiziksel düzen aramalarına izin vermesi bir noktada mümkün olabilir, ancak indeksler sadece mantıksal sıralama olduğu sürece bunun işe yaradığını düşünmüyorum.

2

Onlar da kendi OPERATÖR CLASS tanımlamak ve bazı operatörler için özel GIST endeksleri kullanmak PostgreSQL anlatmak https://github.com/dimitri/prefix az PostgreSQL Önek uzantısı göz at, Belki benzer bir şey gerekiyor?

CREATE OPERATOR CLASS gist_prefix_range_ops DEFAULT FOR TYPE prefix_range USING gist ...