On 08/08/12 18:47, Jaime Casanova wrote:2012/8/8 Igor <[email protected]>:Analizando el plan de la consulta (anteponiendo "analyze" a ésta) aparece esto: Hola Jaime: Ante todo, gracias por tu respuesta. La versión que uso de PostgreSQL es la 9.0.1, en un Linux de 64-bit (Kubuntu). Hoy he vuelto a probar añadiendo 10.000 y 30.000 registros, como en tu caso, y el resultado es el que sigue:
Así que supongo que ayer, por trastear demasiado, los índices pudieron haberse corrompido y por eso jamás eran usados. En un momento me quedé incluso sin espacio en disco, así que es altamente probable que esto tuviera que ver. Los 20.000.000 de registros que introduje tienen la culpa muy probablemente, je je je. Volviendo a la pregunta original, y pensando en esos 3 casos que he testado, veo muy lógicos el primero (10) y el tercero (6000). El primero, porque son poquísimos registros. Y el tercero, porque al devolver tantos, es más rápido recorrer ambas tablas que usar índices. El que me costaba entender es el segundo (100). Y creo que se debe a que el resultado de "explain" es un poco ambiguo. Da a entender (al menos a mí) que en el "hash join" por un lado se obtiene el "hash" de 100 filas de "fathers", por otro se obtienen las 30.000 filas de "sons" al completo (el planificador no aplica índice ni filtro en este caso) y que luego se hace el producto cartesiano de eso. Entiendo que la manera correcta de interpretarlo es que el producto se hace mientras se recorren las 30.000 y no después de ello, como es lógico. ¿Es así, verdad? Aparte de eso, también me costaba entender como para 300 registros (100 * 3; muy pocos) esa técnica era más rápida que usar un "nested loop". Pero pensando en cómo funciona un índice de tipo "btree" y la cantidad de búsquedas a realizar, la verdad es que me he dado cuenta de que sí, que un barrido en secuencia puede ser mucho más rápido en ese caso. Es más, yo mismo uso esa misma técnica cuando programo en Java productos cartesianos y ni siquiera me había dado cuenta de que es un caso semejante. Un saludo y gracias. |
- [pgsql-es-ayuda] Tratando de entender un plan de consulta c... Igor
- Re: [pgsql-es-ayuda] Tratando de entender un plan de c... Jaime Casanova
- Re: [pgsql-es-ayuda] Tratando de entender un plan ... Igor
