Estoy trabajando en el diseño de un RoR proyecto para mi empresa, y nuestro equipo de desarrollo ya se ha ejecutado en un poco de un debate sobre el diseño, específicamente en la base de datos.

Tenemos un modelo llamado Message que necesita ser persistente. Es un muy, muy pequeño modelo con sólo tres db columnas distinta de la de identificación, sin embargo, es probable que haya UNA gran cantidad de estos modelos cuando vamos a la producción. Estamos mirando tanto como 1.000.000 de inserciones por día. Los modelos sólo se pueden buscar por dos llaves extranjeras en ellos, que pueden ser indexados. Así, los modelos nunca tienen que ser eliminados, pero también no tiene que mantener con ellos una vez que están cerca de tres meses.

Así que lo que estamos preguntando es si la aplicación de esta tabla en Postgres se presente un problema de rendimiento importante? ¿Alguien tiene experiencia con grandes bases de datos de SQL para que nos digan si o no esto va a ser un problema? Y si es así, ¿qué alternativa debemos ir?

  • con una buena capa de caché y un poco de configuración en la PG debe estar bien. Usted debe abordar los problemas de rendimiento de caso por caso y evitar preoptimizing. Dicho esto, el particionado y la reproducción son siempre buenas opciones que usted puede tomar ventaja de una vez llegues a los cuellos de botella.
  • Una pregunta relacionada con la here y here.
  • Procesamos alrededor de 30 millones de mensajes al día en un 5+ TB la base de datos PostgreSQL, funciona bien.
  • véase también stackoverflow.com/questions/3132444/…
  • Para tu INFORMACIÓN, me ha pasado a ser la lectura de postgresql.org/about hoy en día y se dio cuenta que se dice que (en principio) el número de filas en una tabla es ilimitado.
  • Sé que este es un comentario antiguo, pero estoy interesado en saber más detalles sobre el caso de uso y si esta configuración sigue trabajando para usted – podría usted comentar, por favor?
  • me puedes decir sobre el hardware spec usted está utilizando?

InformationsquelleAutor Dylan Karr | 2014-02-18

2 Comentarios

  1. 92

    Filas por una mesa no será un problema en sí mismo.

    De manera más o menos 1 millón de filas de un día por 90 días es de 90 millones de filas. No veo razón Postgres no puede lidiar con eso, sin saber todos los detalles de lo que está haciendo.

    Dependiendo de la distribución de los datos puede utilizar una mezcla de los índices, índices filtrados, y la tabla de particiones de algún tipo a la velocidad de la cosa una vez que usted vea lo que los problemas de rendimiento que pueden o no pueden tener. Su problema será el mismo en cualquier otro RDMS, que yo sepa. Si sólo necesita 3 meses de datos de diseño en un proceso de poda de los datos que usted no necesita más. De esa manera usted tendrá una constante de volumen de datos en la tabla. Su suerte usted sabe la cantidad de datos que existe, la prueba de su volumen y ver lo que se obtiene. Prueba una tabla con 90 millones de filas puede ser tan fácil como:

    select x,1 as c2,2 as c3
    from generate_series(1,90000000) x;

    https://wiki.postgresql.org/wiki/FAQ

    Limit   Value
    Maximum Database Size       Unlimited
    Maximum Table Size          32 TB
    Maximum Row Size            1.6 TB
    Maximum Field Size          1 GB
    Maximum Rows per Table      Unlimited
    Maximum Columns per Table   250 - 1600 depending on column types
    Maximum Indexes per Table   Unlimited
    • Estoy de acuerdo en que 90 millones de filas no será un problema para PostgreSQL. Pero que ser un problema para un ORM con PostgreSQL. (Un ORM con cualquier sistema, en realidad.)
    • Buen punto, yo estaba centrado en «Cómo de grande es demasiado grande para una tabla de PostgreSQL?»
    • por ello, podría ser un problema para un ORM? 🙂
    • Porque Orm generalmente utilizan una gran cantidad de consultas para obtener los datos que puede será devuelto con sólo uno o dos. El OP es el uso de Ruby on Rails.
    • Este es un poco tarde pero creo que en mucho de los casos (especialmente con rails / active record) es común para eliminar completamente el ORM a partir de la ecuación y escribir un raw cadena sql para la consulta por motivos de rendimiento. No dejes que tu ORM los datos de decisiones por usted! Es un accesorio no esencial.
    • La URL citado en la URL no se muestran estos límites en la actualidad – alguien sabe donde se trasladó a?
    • Los límites se trasladó a la wiki, he actualizado la respuesta.

  2. 51

    Otra manera de acelerar las consultas de manera significativa en una tabla con > 100 millones de filas en el fuera de horas de clúster de la tabla en el índice que se
    más a menudo se utiliza en las consultas. Tenemos una tabla con > 218 millones de filas y han encontrado 30X mejoras.

    También, para una mesa muy grande, es una buena idea para crear un índice en el extranjero claves.

    • > en el fuera de horas de clúster de la tabla en el índice que se utiliza con mayor frecuencia en las consultas….puede usted explicar cómo se hace?
    • Sí aquí es un EJEMPLO paso a paso: 1) de La tabla a la que me refiero se llama la inversión en este ejemplo. 2) El índice más utilizado en las consultas es (bankid,record_date) Así que aquí está su paso por paso: 1) psql -c «drop index investment_bankid_rec_dt_idx;» dbname 2) psql -c «create index investment_bankid_rec_dt_idx de la inversión(bankid, record_date);» 3) psql -c «cluster investment_bankid_rec_dt_idx de la inversión;» 4) vacuumdb -d ccbank -z -v -t de inversión, de Manera que en el paso uno y dos nos quite el índice y volver a crearla.
    • Paso 3 vamos a crear el clúster, básicamente, esto pone a la base de datos de la tabla en el orden físico del índice, de modo que cuando postgresql realiza una consulta se almacena en caché el siguiente más probable filas. Paso 4 nos vacío de la base de datos para restablecer las estadísticas para el planificador de consultas

Dejar respuesta

Please enter your comment!
Please enter your name here