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_buffers
La cantidad de memoria dedicada al espacio de búfer 'anclado'.effective_cache_size
la 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_connections
no 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_mem
es complicado: se puede aplicar a cada subconsulta, por lo que una consulta con 5HASHJOINS
puede 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_connections
bajo).shared_buffers
está (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_size
en toda la memoria "libre" disponible.random_page_cost
es el costo de una búsqueda + lectura en el disco. Es relativo asequential_disk_cost
, que es 1. El valor predeterminado (4) pararandom_page_cost
se 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_mem
cuando elmax_connections
valor 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