PostgreSQL non utilizza l'indice Gin Trigram quando esegui una query non ASCII?
-
02-11-2019 - |
Domanda
Passi da riprodurre
Crea database
CREATE DATABASE citiesdb
WITH OWNER = citiesowner
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'C'
LC_CTYPE = 'C'
CONNECTION LIMIT = -1;
Dopo aver creato il database puoi semplicemente eseguire il codice dal violino SQL dalla risposta di Erwin https://dba.stackexchange.com/a/63202/37108 (http://sqlfiddle.com/#!12/270e2/1) o leggere ulteriori informazioni alla fine della domanda.
Corri come query con solo caratteri ASCII
EXPLAIN ANALYZE SELECT * FROM city WHERE other_names_lower like '%ele%';
"Bitmap Heap Scan on city (cost=16.10..64.02 rows=13 width=147) (actual time=0.642..3.303 rows=513 loops=1)"
" Recheck Cond: (other_names_lower ~~ '%ele%'::text)"
" -> Bitmap Index Scan on other_names_lower_trgm_gin (cost=0.00..16.10 rows=13 width=0) (actual time=0.486..0.486 rows=513 loops=1)"
" Index Cond: (other_names_lower ~~ '%ele%'::text)"
"Total runtime: 3.439 ms"
Corri come query con personaggi non ASCII
explain analyze SELECT * FROM city WHERE (other_names_lower like '%желез%')
"Seq Scan on city (cost=0.00..1693.53 rows=5 width=134) (actual time=33.498..58.688 rows=9 loops=1)"
" Filter: (other_names_lower ~~ '%желез%'::text)"
" Rows Removed by Filter: 46673"
"Total runtime: 58.753 ms"
Domanda
Durante la ricerca di testo non ASCII, il motore utilizza la scansione sequenziale anziché l'indice Gin Trigram. Perché lo sta facendo e quali sono i modi alternativi per costruire l'indice, la query o il database per accelerare la ricerca?
informazioni addizionali
PostgreSQL 9.2; Windows 8 64-bit.
Parte della definizione della tabella ([...]
sono altre colonne).
CREATE TABLE city ([...] other_names_lower text [...]) WITH ( OIDS=FALSE );
Colonna Altro_names_lower contiene nomi diversi per le città. Le file contengono intervalli cinesi, polacchi, russi e altri personaggi.
Codice di creazione dell'indice
CREATE EXTENSION pg_trgm;
CREATE INDEX other_names_lower_trgm_gin
ON city
USING gin
(other_names_lower gin_trgm_ops);
Altre impostazioni - Query suggerita da Daniel Vérité nel commento
select name, source, setting from pg_settings where source <> 'default' and source <> 'override';
"application_name";"client";"pgAdmin III - Narz??dzie Zapytania"
"bytea_output";"session";"escape"
"client_encoding";"session";"UNICODE"
"client_min_messages";"session";"notice"
"DateStyle";"session";"ISO, YMD"
"default_text_search_config";"configuration file";"pg_catalog.simple"
"enable_seqscan";"session";"on"
"lc_messages";"configuration file";"en_US.UTF-8"
"lc_monetary";"configuration file";"Polish_Poland.1250"
"lc_numeric";"configuration file";"Polish_Poland.1250"
"lc_time";"configuration file";"Polish_Poland.1250"
"listen_addresses";"configuration file";"*"
"log_destination";"configuration file";"stderr"
"log_line_prefix";"configuration file";"%t "
"log_statement";"configuration file";"all"
"log_timezone";"configuration file";"Europe/Sarajevo"
"logging_collector";"configuration file";"on"
"max_connections";"configuration file";"100"
"max_stack_depth";"environment variable";"2048"
"port";"configuration file";"5432"
"shared_buffers";"configuration file";"4096"
"TimeZone";"configuration file";"Europe/Sarajevo"
Nessuna soluzione corretta