He estado intentando COUNT(*)
una tabla con 150,000 filas que tiene una clave primaria. Tiene una herramienta de aproximadamente 5 minutos, así que descubrí que este es un problema de indexación.
Citando el manual de PostgreSQL :
REINDEX es similar a una caída y recreación del índice en que los contenidos del índice se reconstruyen desde cero. Sin embargo, las consideraciones de bloqueo son bastante diferentes. REINDEX bloquea las escrituras pero no las lecturas de la tabla primaria del índice. También toma un bloqueo exclusivo en el índice específico que se procesa, lo que bloqueará las lecturas que intenten usar ese índice (...) El CREATE INDEX subsiguiente bloquea las escrituras pero no las lecturas; Como el índice no está allí, ninguna lectura intentará usarlo, lo que significa que no habrá bloqueo, pero las lecturas podrían verse obligadas a realizar costosos escaneos secuenciales.
Desde su propia experiencia, ¿puede decir:
- es
REINDEXING
peligroso? ¿Puede dañar la consistencia de los datos? - ¿Puede tomar mucho tiempo?
- ¿Es una solución probable para mi escenario?
Actualizar:
La solución que funcionó para nosotros fue recrear el mismo índice con un nombre diferente y luego eliminar el índice anterior.
La creación del índice es muy rápida, y hemos reducido el tamaño del índice de 650 MB a 8 MB. Usar un COUNT(*)
con between
toma solo 3 segundos.
COUNT(*)
es la mejor opción:If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.