7
votes

Accélérer la requête PostgreSQL où les données sont entre deux dates

J'ai une grande table (> 50 m lignes) qui possède des données avec un identifiant et un horodatage: xxx pré>

... avec un index multi-colonnes sur (ID, horodatage) code>. p>

Je dois interroger la table pour sélectionner toutes les lignes avec un certain identifiant où l'horodatage est compris entre deux dates, que je fais actuellement en utilisant: P>

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


9 commentaires

* Définir la machine haut de gamme? Vraiment ... 50 millions de lignes sont maintenant une table importante par des normes d'aujourd'hui. * Donc, la table a une identité - où est l'horodatage? * Quels indices? Index manquant plus matériel de merde (haut de gamme + disques normaux) pourrait conduire à ces résultats.


Dual 3Ghz Xeon Dual-Coyes avec HT, RAM 16 Go de 16 Go, etc. La table a (ID, horodatage, données) avec un indice multi-colonnes sur (ID, horodatage).


Pas haut de gamme par quelque moyen que ce soit .... de manière instable comme vous ne dites rien à propos des ..... disques, qui sont la partie critique pour tout serveur de base de données. Beaucoup plus éthan que la CPU, ou la RAM. Quelle est votre mise en page de votre disque?


C'est un ordinateur de bureau, pas un serveur et ne sera jamais utilisé que par une personne à la fois. Disc-Wise, il a 2x lecteurs de 1 To dans RAID 0.


Ah, voilà, nous allons. Crap Io Performance. Les disques typiques de 1 To, DSKTOP, sont de 7200 tr / min. RAID 0 en fait un peu mieux, mais ... bien ... Double Crap est toujours la merde. Je ne dirais pas que cela appartient à une analyse rapide de 50.000.000 rangée si une analyse de table est décidée;)


Quelle est la sélective x - c'est-à-dire combien de lignes espérez-vous que des choses aient? Combien y a-t-il d'identifiants différents?


Le matériel est hors de mon contrôle cependant. J'espérais que quelque chose de similaire à la numérisation IP (avec un indice intelligent, comme indiqué dans le lien) serrerait peut-être séduire d'autres performances. * X varie entre quelques milliers et 10 de millions de personnes, mais est généralement dans la région des rangées de 4 m.


Dépend vraiment. Vous pouvez essayer un index opposé (horodatage d'abord, puis indice). Cela peut être plus sélectif.


Publiez la sortie d'expliquer sur votre requête.


3 Réponses :


0
votes

Assurez-vous que l'index est TableauD + TapeTimeMestamp, et vous faites une requête comme: xxx

Si vous appliquez des fonctions à la colonne TableMestamp de la table dans le lieu où, vous ne pourrez peut-être pas complètement Utilisez l'index.

Si vous faites déjà tout cela, votre matériel peut ne pas être à la hauteur de la tâche.

Si vous utilisez la version 8.2 ou ultérieure, vous devriez essayer : xxx


0 commentaires

6
votes

Cette pointe ne convient que lorsque vous avez deux colonnes A et B et utilisez des requêtes comme: xxx

qui n'est pas: xxx

Utilisation de l'index sur date (colonne) plutôt que colonne pourrait accélérer un peu.


3 commentaires

La pointe mentionne qu'il convient du temps, "intervalle rapide (de temps ou d'adresses IP) à l'aide d'index spatiaux"? Merci pour l'autre indice.


Il convient pour le temps. Mais cela ne convient que si votre table a des intervalles (c'est-à-dire deux colonnes) et vous recherchez une valeur là-bas. Pas lorsque vous comparez une colonne unique à un intervalle.


Ahhh je vois. Désolé, j'avais mal compris l'application.



1
votes

Pourriez-vous Expliquer la requête pour nous? Ensuite, nous savons comment la base de données exécute votre requête. Et qu'en est-il de la configuration? Quels sont les paramètres de Shared_buffers et Work_Mem? Et quand avez-vous (ou votre système) le dernier vide et analysez-vous? Et dernière chose, quelle version du système d'exploitation et pgsql utilisez-vous?

Vous pouvez créer des index merveilleux mais sans réglages corrects, la base de données ne peut pas les utiliser très efficace.


0 commentaires