Hier wird mehr Index freundliche Lösung:
drop table if exists foo.t;
create table foo.t (x bigserial, url varchar);
insert into foo.t(url) values
('facebook.com/user?query=hello'),
('stackoverflow.com/question/?query1=postgres'),
('facebook.com/videos?'),
('facebook.com/user?query=');
insert into foo.t(url) select url from foo.t, generate_series(1,100000);
create index iturl on foo.t(position('?query=' in url), length(url));
explain analyze select * from foo.t where position('?query=' in url) > 0 and length(url) > position('?query=' in url) + 7;
und das Ergebnis ist:
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on t (cost=3736.79..12211.16 rows=67005 width=37) (actual time=62.072..407.323 rows=100001 loops=1)
Recheck Cond: ("position"((url)::text, '?query='::text) > 0)
Filter: (length((url)::text) > ("position"((url)::text, '?query='::text) + 7))
Rows Removed by Filter: 100001
Heap Blocks: exact=3449
-> Bitmap Index Scan on iturl (cost=0.00..3720.04 rows=201015 width=0) (actual time=60.473..60.473 rows=200002 loops=1)
Index Cond: ("position"((url)::text, '?query='::text) > 0)
Planning time: 0.512 ms
Execution time: 423.587 ms
(9 rows)
Beachten Sie, dass ich Ihre Ausgangsdaten geändert Index wählbar machen (1/4 Treffer).
Entschuldigung - ich versuche, dies auszuführen (Ich habe von angefügt) und es sagt, dass es nicht finden kann Tabelle mit dem Namen "URL"? Weißt du, warum das so sein könnte? Auch 'like '% query =%' gibt immer noch die Zeilen mit nichts nach, wie z. B. Zeile 4 in meinem Beispiel. –
loonyuni
'where URL wie '% query = _%'' nach _ "wähle URLs, die etwas nach' query = '" _ – Abelisto
@loonyuni haben. . . "URL" ist ein Spaltenname. Ich weiß nicht, wie der Tabellenname lautet. –