Hola lista, Después de mirar mucha documentación, y de hacer mil pruebas aun no he llegado a la conclusión de cómo optimizar algunas consultas.
Para entrar en materia os explico en qué situación me encuentro: - Postgres 9.1 con replica en otra maquina en local. - Tengo una Tabla con aproximadamente 12 millones de TX y creciendo. - Esta tabla está compuesta por 32 campos. - Esta tabla almacena las operaciones/ventas realizadas des de diferentes tiendas. Por un lado, tenemos una función en la BBDD que calcula la suma de importes de las ventas realizadas a partir des de el último cierre de "tienda". Los cierres de tienda se almacenan en otra tabla, y la búsqueda de la operación respecto al cierre es relativamente rápida. El problema se encuentra en realizar la suma de importes, ya que segun la tienda / terminal tienen costes temporales muy altos. Sin entrar en detalle de las query, hemos echo un análisi de las posibles soluciones a aplicar: - Como comentan en varios foros hemos hecho un PREPARE de cada una de las consultas que contiene la función y seguidamente un explain para comprovar qué plan utiliza en cada caso. - A partir del resultado obtenido, hemos optador por: - Crear nuevos índices según campos de la query. - Modificar ciertas consultas del tipo SELECT max(documento) ..., por SELECT .... ORDER BY documento DESC LIMIT ya que hemos comprobado que es mucho mas rápido. - Regularizar los tipos de datos que pasamos por paràmetro en la función para que siempre coincidan con los tipos de datos con la BBDD. - Finalmente, hemos conseguido que el analize de los PREPARE nos compute un coste aproximado a cero. En teoría, en este punto hemos conseguido optimizar al máximo las consultas de la función, pero realmente no és asi..... Más adelante os explico - Por otro lado, una vez hemos podido optimizar las consultas, hemos hecho pruebas con datos concretos y el resultado ha sido muy variado, des de consultas que duran milisegundos, hasta otras que duran más de un minuto(Algo intorelable en nuestra aplicación ya que estamos hablando de un sistema transaccional con "TIMEOUT" de 10 segundo de respuesta.) - Al ver tal desbarajuste, hemos echo un ANALIZE directamente de cada una de las QUERY de la función, dándole datos concretos, con la sorpresa que el plan a utilizar es diferente segun el valor aportado. - Finalmente, hemos hecho la suposición de que la tabla es demasiado grande, y como POSTGRES nunca se equivoca, hemos optado por acotar ciertas consultas respecto un rango de fechas, con lo que hemos mejorado algunos tiempos de respuesta para los valores más problemáticos, pero para los que el coste era mínimo, ahora el tiempo de respuesta ha aumentado. Está claro que algo estamos haciendo mal, por que nos sucede en más de una ocasión, con lo que tengo varias dudas de las cosas que hay que tener en cuenta en el momento de optimizar consultas: - Después de pasarnos horas mirando el funcionamiento de POSTGRES en el momento de hacer un query plan, hemos llegado a la conslusión que no tenemos ni idea en qué nos tenemos basar para optimizar correctamente una query/funcion. - Cuál es la mejor herramienta para ver realmente que plan se usa para una query??? - Cual es la mejor forma de analizar las funciones de BBDD para saber qué sucede?? - Cuáles són las mejores cosas a tener en cuenta para optimizar querys/funciones. - Qué tipo de consultas són más lentas que otras?? - Qué tipo de datos pueden dar problemas??? - Es más óptimo hacer querys des de SRC en vez de encapsular-las en funciones de BBDD'??. - La funciones tienen un plan predefinido en el momento de crear-las, o segun se llaman va cambiando?? Y Si está predefinido por defecto, existe la manera para que recalcule el plan cada vez que se ejecute?? - etc... Muy probablemente esté diciendo alguna estupidez, pero a estas alturas mi mente ya no da mas de si, jejejej. Nota: Creo que lo que pido va más allá de la documentación, me refiero a la experiencia de la gente que lleva muchoas años con Postgres y saben cómo dominarlo, y el porqué de las cosas sin llegar al ddetalle al nivel de bit(jjj). Vaya, para gente simple como yo. jjjj Gracias de antemano, Un saludo -- *Ruben Fitó * Software Engineer [image: Ubiquat Technologies, SL] r.f...@ubiquat.com<j.catari...@ubiquat.com> www.ubiquat.com Tota la informació continguda en aquest document i arxius adjunts és CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per error, si us plau elimini'l i posi's en contacte amb l'emissor. All information contained in this document and any attachments are CONFIDENTIAL and protected under trade secret laws. If you receive this message by mistake, please delete it and notify it immediately to the sender.