Tengo una mesa grande (> 50m filas) que tiene algunos de los datos con un número de IDENTIFICACIÓN y fecha y hora:

id, timestamp, data1, ..., dataN

…con un multi-índice de columna en (id, timestamp).

Necesito consultar la tabla para seleccionar todas las filas con una cierta IDENTIFICACIÓN, donde la marca de tiempo entre dos fechas, que actualmente estoy haciendo uso de:

SELECT * FROM mytable WHERE id = x AND timestamp BETWEEN y AND z

Esta actualmente lleva más de 2 minutos en un equipo de gama alta (2x 3 ghz dual-core xeon a w/HT, 16GB de RAM, 2 discos de 1TB en RAID 0) y realmente me gustaría acelerar.

He encontrado este tip en la que se recomienda el uso de un índice espacial, pero el ejemplo que da es para direcciones IP. Sin embargo, el aumento de velocidad (436s 3s) es impresionante.

¿Cómo puedo usar esto con marcas de tiempo?

* Definir alta y final de la máquina? Realmente… 50 millones de filas es ahora una gran mesa por los estándares de hoy. * Así, la tabla tiene un ID – donde es la marca de hora? * ¿Qué índices? Faltan índice más cutre de hardware (high-end + normal discos) podría conducir a esos resultados.
Dual Xeon 3 ghz de Doble núcleos con HT, 16GB de RAM, etc. La tabla (id, fecha y hora, datos) con un multi-índice de columna (id, fecha).
NO final, por cualquier medio…. especialmente como no dices nada sobre el….. discos, que son la parte fundamental para cualquier servidor de base de datos. MUCHO mor ethan la CPU o la RAM. ¿Cuál es tu disco de diseño?
Es una PC de escritorio, no un servidor, y va a ser usado sólo una vez, por una sola persona a la vez. Disco-sabio, que ha 2x discos de 1TB en RAID 0.
Ah, aquí vamos. Mierda IO rendimiento. Los típicos discos de 1TB, dsktop, son de 7200 RPM. Raid 0 lo hace un POCO mejor, pero… bueno… el doble de mierda todavía es una mierda. Yo no diría que esto es para un rápido 50.000.000 fila de escanear si un examen de la tabla está decidido 😉

OriginalEl autor Roger | 2010-03-17

3 Comentarios

  1. 6

    Que la punta sólo es adecuado cuando se tienen dos columnas a y B y el uso de las consultas como:

    where 'a' between A and B

    Que no:

    where A between 'a' and 'b'

    Utilizando el índice de date(column) en lugar de column podría acelerar un poco.

    La punta menciona que es conveniente para el tiempo, «Rápido intervalo de tiempo o direcciones ip) de la búsqueda con índices espaciales»? Gracias por la otra pista.
    Es adecuado para el momento. Pero sólo es adecuado si la tabla tiene intervalos (es decir, dos columnas) y se busca un valor allí. No cuando se comparan sola columna en un intervalo.
    Ahhh, ya veo. Lo siento, se me había malinterpretado la aplicación.

    OriginalEl autor Konrad Garus

  2. 1

    Podría EXPLICAR la consulta para nosotros? Entonces sabemos cómo la base de datos se ejecuta la consulta. ¿Y qué acerca de la configuración? ¿Cuáles son los valores para shared_buffers y work_mem? Y cuando usted (o el sistema), el último de vacío y analizar? Y la última cosa, ¿qué OS y pgSQL-versión estás usando?

    Puede crear wonderfull índices, pero sin una adecuada configuración de la base de datos no se pueden utilizar muy eficiente.

    OriginalEl autor Frank Heikens

  3. 0

    Asegúrese de que el índice es TableID+TableTimestamp, y hacer una consulta como:

    SELECT
        ....
        FROM YourTable
        WHERE TableID=..YourID.. 
            AND TableTimestamp>=..startrange.. 
            AND TableTimestamp<=..endrange..

    si se aplican las funciones de la tabla de TableTimestamp columna en DONDE, usted no será capaz de utilizar el índice.

    si ya estás haciendo todo esto, luego de que su hardware puede no estar a la altura.

    si usted está utilizando la versión 8.2 o más tarde, usted debe tratar de:

    WHERE (TableID, TableTimestamp) >= (..YourID.., ..startrange.. ) 
        and (TableID, TableTimestamp) <= (..YourID.., ..endrange..)

    OriginalEl autor KM.

Dejar respuesta

Please enter your comment!
Please enter your name here