ho creato il mio operatori di confronto sul tipo di dati testo che utilizza ordinamento naturale ('1' < '2' < '10' < '11', ecc), usando i miei nuovi operatori #<#
, #<=#
, #>#
e #>=#
.Crea classe operatore per il pattern matching come text_pattern_ops
Ora li metto in una classe operatore per essere in grado di creare un indice su di loro, in questo modo:
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);
Tuttavia, quando creo un indice usando il mio nuovo text_natsort_ops
, questo non viene utilizzato nelle query Coinvolgimento di like
come quando si utilizza lo text_pattern_ops
.
Come dichiarare la mia classe di operatore per consentire a like
di utilizzare il mio indice?
UPDATE:
È possibile che questo sembra funzionare, quindi la domanda non è valida. Il mio vero problema era che avevo una query come:
select *
from mytable
where number like 'edi%'
order by number using #<#
limit 10
e ho anche avuto un altro indice utilizzando text_pattern_ops, che è stato scelto dal progettista, perché sembra funzionare molto più veloce. Tuttavia, a causa dello order by ... using
, sarà utile solo l'indice che utilizza i miei nuovi ops ... l'altro indice restituisce troppi risultati e ho bisogno che la clausola limite sia disponibile per la scansione dell'indice.
Dovresti postare il tuo aggiornamento come risposta, quindi questo Q non si annida come "senza risposta". –