Tengo dos servidores idénticos (en términos de hardware), ambos son instalaciones estándar de Windows Server 2008 R2, con un software mínimo instalado (básicamente mi código y cosas necesarias como jvm, etc.).
En un servidor, estoy ejecutando sql server 2005, en el segundo servidor postgresql 9.1. La diferencia en el rendimiento b / n de estos 2 servidores es asombrosa, es tan mala en postgresql que lamento mi discurso inicial "usemos postgresql en lugar de pagar la licencia del servidor sql" a mi jefe. Estamos hablando de diferencias de 30 segundos frente a 15 minutos para el mismo comando, y no es solo este comando, es cualquier consulta o comando que le arroje. Ambos tienen casi los mismos datos (los registros se insertaron en un orden diferente), y ambas bases de datos tienen exactamente la misma estructura / índices, etc.
Pero espero que sea solo una cuestión de ajuste de rendimiento. La cuestión es que el servidor sql está utilizando prácticamente los 32 gigas de ram en el servidor, mientras que postgresl no está usando nada, definitivamente menos que un concierto, aunque en realidad no lo he descubierto con todo detalle.
¿Cómo consigo postgresql para usar más de 20 gigas de ram? Estos servidores se construyeron específicamente para estas cosas de la base de datos, por lo que, en mi opinión, se desperdicia cualquier ram que no esté en uso por la base de datos y los procesos de soporte.
fuente

SET effective_cache_size=18G;(la configuración predeterminada es extremadamente baja) Por cierto: suponiendo que se trata de una máquina de 64 bits (sin PTE)Respuestas:
Hay muchas constantes ajustables, inicializadas a través de
postgres.conf. Los más importantes son:max_connections: el número de sesiones concurrenteswork_mem: la cantidad máxima de memoria que se utilizará para resultados intermedios, como tablas hash, y para ordenarshared_buffersLa cantidad de memoria dedicada al espacio de búfer 'anclado'.effective_cache_sizela cantidad de memoria supuestamente utilizada por los búferes LRU del sistema operativo.random_page_cost: una estimación del costo relativo de las búsquedas de disco.max_connectionsno debe establecerse más de lo necesario, las conexiones cuestan recursos incluso cuando están inactivas; en la mayoría de los casos, una conexión pasaría más tiempo esperando adentro que esperando afuera. (al precio de la concurrencia) Una buena fórmula de regla general es "número de husillos + número de procesadores + X"work_memes complicado: se puede aplicar a cada subconsulta, por lo que una consulta con 5HASHJOINSpuede costar 5 *work_mem. Y para el peor de los casos, también debe pensar en varias sesiones que consuman esta cantidad (nuevamente una razón para mantenersemax_connectionsbajo).shared_buffersestá (en mi humilde opinión) sobrevalorado. Normalmente se recomienda configurarlo en aproximadamente 1/4 ... 1/2 de toda la memoria "libre" disponible, pero tiendo a mantenerlo bajo y configurarloeffective_cache_sizeen toda la memoria "libre" disponible.random_page_costes el costo de una búsqueda + lectura en el disco. Es relativo asequential_disk_cost, que es 1. El valor predeterminado (4) pararandom_page_costse establece demasiado alto para las máquinas modernas y el almacenamiento en red, normalmente se puede reducir a entre 2 y 1.x. Para los discos SSD, incluso puede configurarlo en 1.0, ya que la búsqueda es casi gratis en SSD.fuente
work_memcuando elmax_connectionsvalor predeterminado es 100 y la RAM del servidor es de 32 GB (servidor postgres dedicado)? Sabía que necesitaba ajustar esto por mí mismo basado en consultas diarias. Me pregunto si puede decirme un valor de "respuesta única" (o un valor de punto de partida). ¿50 MB es demasiado grande? Muchas gracias.Considere usar pgtune para ayudarlo a ajustar la configuración de PostgreSQL. De PgFoundry:
La configuración predeterminada de PostgreSQL es muy conservadora y esa herramienta está destinada a ayudar con esta situación exacta. La documentación es una lectura ligera y el uso de la herramienta es bastante sencillo.
Tenga en cuenta que no es necesario utilizar las sugerencias exactas de pgtune. Jugar con su configuración y observar los cambios resultantes en el archivo conf le dará una mejor comprensión de la configuración de PostgreSQL y cómo ajustarla manualmente.
fuente
Si cada consulta o comando se ejecuta lentamente, sospecho que:
¿Podría decirnos cuánto tiempo lleva ejecutar una consulta
select version()? Si debe ser instantáneo (0,16 ms en mi estación de trabajo).fuente
Si CADA consulta es mucho más lenta, algo está terriblemente mal con el servidor o algo así. En mi experiencia, cada db tiene algunas cosas en las que es mejor que la otra, pero pgsql en cuanto al rendimiento está fácilmente en el mismo ámbito que el servidor mssql.
Entonces, ¿en qué sistema operativo está ejecutando pgsql? Que hardware ¿Qué configuraciones has cambiado ya? ¿Qué tan grande es su conjunto de datos? ¿Cuál es un ejemplo de una consulta deficiente y la salida de explicar analizar (Ejecute su consulta de esta manera:
explicar analizar seleccionar ... resto de la consulta aquí ...;
Publique el resultado en http://explain.depesz.com/ y publique el enlace aquí.
fuente