Tengo una tabla de palabras con un índice en (idioma_id, estado). Estos son los resultados para EXPLICAR ANALIZAR:Índice no utilizado cuando se utiliza LIMIT en postgres
No hay límite
explain analyze SELECT "words".* FROM "words" WHERE (words.language_id = 27) AND (state IS NULL);
Bitmap Heap Scan on words (cost=10800.38..134324.10 rows=441257 width=96) (actual time=233.257..416.026 rows=540556 loops=1)
Recheck Cond: ((language_id = 27) AND (state IS NULL))
-> Bitmap Index Scan on ls (cost=0.00..10690.07 rows=441257 width=0) (actual time=230.849..230.849 rows=540556 loops=1)
Index Cond: ((language_id = 27) AND (state IS NULL))
Total runtime: 460.277 ms
(5 rows)
límite de 100
explain analyze SELECT "words".* FROM "words" WHERE (words.language_id = 27) AND (state IS NULL) LIMIT 100;
Limit (cost=0.00..51.66 rows=100 width=96) (actual time=0.081..0.184 rows=100 loops=1)
-> Seq Scan on words (cost=0.00..227935.59 rows=441257 width=96) (actual time=0.080..0.160 rows=100 loops=1)
Filter: ((state IS NULL) AND (language_id = 27))
Total runtime: 0.240 ms
(4 rows)
Por qué sucede esto? ¿Cómo puedo hacer que el índice se use en todos los casos?
Gracias.
LÍMITE sin un ORDER BY parecería ser de limitado (sin doble sentido) de valor. ¿Qué 100 filas espera devolver? –
BTW: ¿cuál es la selectividad de language_id = 17 AND status IS NULL cláusula? ¿Cuál es el tamaño total de la tabla de palabras? – wildplasser
cierto ... el pedido ocurre en id DESC. ¿Podría eso estar ralentizándolo? ¿Se necesita un índice en esa columna? @wildplasser el tamaño total es de 10 millones de filas, la selectividad es de aproximadamente 500,000 filas – alste