Intento abrir una tabla grande de PostGIS en QGIS, con más de 500 filas. Me acerco a un área pequeña, y limito los zooms, por lo que se espera que la respuesta de la consulta sea razonablemente pequeña. Probado esto también directamente en la DB. La tabla tiene índices, así que puedo ver que la consulta en bruto es rápida. La tabla ya tiene único índice para dos campos ("partición", "partición_desplazamiento")
Problema: Cuando añado la tabla como capa, entonces QGIS se cuelga. Veo en la DB una consulta de larga duración: SELECT count(distinct ("partition","partition_offset"))=count(("partition","partition_offset")) FROM "public"."mytable_geo"
y desde el planificador de consultas veo que esto hace un escaneo completo a la tabla, lo cual toma posiblemente horas en mi caso. Parece que QGIS quiere estar realmente seguro de que mi restricción "única" hace que los valores sean realmente únicos. ¿Hay alguna manera de evitarlo?
Versión de QGIS: 3.6.1-Noosa
Actualización: GDAL tiene parámetro checkPrimaryKeyUnicity='1'
. Si esto se puede convertir en el valor "0" en QGIS, entonces debería ayudar, pero no han descubierto cómo / si esto es posible. No se puede encontrar la opción de interfaz de usuario para esto.
1 votos
No estoy seguro de si es el problema o no, pero un índice único puede tener valores repetidos si uno de ellos es nulo (2 nulos no son iguales). Intente marcar las columnas como no nulas, o declare una clave primaria compuesta (que no puede contener nulos por definición).
0 votos
@JGH ¿es posible marcar columnas como no nulas o tener claves primarias para la vista materializada? mi vista 500M es en realidad una subselección de otra tabla 1+B.
0 votos
¿Tiene un problema similar cuando se conecta a través de db_manager utilizando una consulta sin procesar? Es una solución provisional, pero normalmente db_manager omite algunas pruebas y no requiere un identificador único (a costa de estar en modo de sólo lectura).
0 votos
@MarHoff - sí, cuestiones similares. Cuando selecciono tabla en db manager entonces se cuelga, y es explicable como ver en base de datos admin consulta cara
SELECT COUNT(*) FROM "public"."mytable"
corriendo. En este caso tardará horas. Yo siempre utilizo las estadísticas rápidas de la tabla, aunque no sean exactas a la fila.0 votos
Espera un segundo que ahora está un poco confuso después de releer tu pregunta. ¿Mytable_geo es una tabla, una vista o una vista materializada? Es transparente desde el punto de vista de la consulta pero cambia muchas cosas para la optimización.
0 votos
@MarHoff Realmente lo estoy intentando con todas ellas. Con tabla tengo idea de como solucionarlo probablemente (crear PK únicas reales sin nulos), pero con vistas materializadas y vistas normales no. Desde el punto de vista de QGIS parece que no hay diferencia entre ambas vistas.