Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1665 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [PostgreSQL] Requête peu couteuse ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PostgreSQL] Requête peu couteuse ?

n°1052579
Pwill
Deux fois Né
Posté le 19-04-2005 à 17:25:46  profilanswer
 

Bonjour!
 
J'ai une expérience plutôt nulle en optimisation de base de données. J'aimerais quelques informations.
 
J'ai une table T de 340k lignes (ca peut facilement dépasser le million).
J'ai un champs D de la forme AAAAMMJJ.
Seulement en fait je n'ai que 2 années différentes.
 
Comment je pourrais récupérer efficacement ces deux années ?
Rien qu'un "select distinct" sur le champs D prend 3.8 secondes et me retourne 731 lignes (forcément: 2x365)
 
Bricoler un "select distinct" sur les 4 premiers caractères du champ D, c'est envisageable ?
 
Pour info je remplis la bd avec un fichier txt structuré. S'il n'y a pas de solution correcte, je vais voir si je peux pas couper le champs D en deux: AAAA && MMJJ  :sweat:  
 
Merci de votre aide.


Message édité par Pwill le 19-04-2005 à 17:59:57
mood
Publicité
Posté le 19-04-2005 à 17:25:46  profilanswer
 

n°1052774
gizmo
Posté le 19-04-2005 à 19:48:22  profilanswer
 

a priori, je dirais que le plus rapide serait deux requètes, vu ton cas, avec un index sur la date.
select max(D) from T et select min(D) from T

n°1052775
gizmo
Posté le 19-04-2005 à 19:49:14  profilanswer
 

mais bon, si tu sais que tu n'as jamais que deux années, faudrait peut-être voir à les hardcoder quelque part ou duppliquer l'information.

n°1052790
Taz
bisounours-codeur
Posté le 19-04-2005 à 20:20:26  profilanswer
 

stock avec un format numérique. pas texte

n°1052822
gizmo
Posté le 19-04-2005 à 20:43:44  profilanswer
 

on peut supposer que c'est déjà le cas :o (n'est-ce pas? :sweat: )

n°1053144
Pwill
Deux fois Né
Posté le 20-04-2005 à 09:11:40  profilanswer
 

Merci à vous  :jap:
 
int4 pour la date.
 
Actuellement il se trouve que je n'ai que 2 années différentes, seulement ca peut atteindre une dizaine.
 
Pour le moment c'est moi qui ajoute les données dans la table avec un COPY FROM. Je ferai surement un script d'ajout pour l'utilisateur final.
 
Bon je suppose que le mieux est de mettre ces quelques années dans une table, l'utilisateur devra les rajouter si besoin.


Message édité par Pwill le 20-04-2005 à 09:13:05
n°1053149
gizmo
Posté le 20-04-2005 à 09:14:50  profilanswer
 

m'enfin, pourquoi un int4?! c'est pas fait pour ça :/

n°1053323
Taz
bisounours-codeur
Posté le 20-04-2005 à 11:14:21  profilanswer
 

ben ça rentre très bien. tu peux stocker en pseudo DCB
 
4 * 4 bits : année
2 * 4 bits : mois
2 * 4 bits : jour

n°1053410
cinocks
Posté le 20-04-2005 à 12:16:46  profilanswer
 

Le plus efficace serait de rajouter un champs avec uniquement l'année dedans, malgré le fait qu'il y aura duplication de données.


---------------
MZP est de retour
n°1053447
Tamahome
⭐⭐⭐⭐⭐
Posté le 20-04-2005 à 12:39:59  profilanswer
 

cinocks a écrit :

Le plus efficace serait de rajouter un champs avec uniquement l'année dedans, malgré le fait qu'il y aura duplication de données.


 
oui, parfois il faut oublier la théorie et songer a la pratique... une ptite duplication de données peut entrainer une hausse significative des perfs...

mood
Publicité
Posté le 20-04-2005 à 12:39:59  profilanswer
 

n°1053505
cinocks
Posté le 20-04-2005 à 13:54:45  profilanswer
 

tout à fait, la normalisation n'est pas synonyme de performance. Dernormaliser, c'est efficace quand c'est bien pensé.


---------------
MZP est de retour
n°1053524
Beegee
Posté le 20-04-2005 à 14:06:13  profilanswer
 

De toute façon, ce qui plombe les perfs, c'est le TABLE SCAN imposé par la recherche des DISTINCT.
 

Code :
  1. SELECT DISTINCT SUBSTR(D, 0, 4) FROM T;


 
(Oracle like)
 
Avoir l'année dans un champ à part va pas changer grand chose, y a toujours obligation de faire un TABLE SCAN.
 
Le seul moyen de réduire la durée d'exécution serait de maintenir dans une table à part par exemple, la liste des différentes années utilisées ... mais ça suppose de vérifier avant chaque ajout/update dans la table T si l'année existe dans cette table à part, etc. (donc une perte de perfs lors du remplissage de la table T).

n°1053552
Taz
bisounours-codeur
Posté le 20-04-2005 à 14:19:27  profilanswer
 

pourquoi pas sous forme numérique ?
 
select ... FROM T where date > 20020000;
 
?

n°1053553
Pwill
Deux fois Né
Posté le 20-04-2005 à 14:19:35  profilanswer
 

Je ne suis pas l'auteur de la structure de la base.  
INT4, j'ai laissé comme c'était.
Je vais opter pour une table contenant les années, car une fois les données insérées, elles sont seulement lues, il n'y a pas un besoin de modification. Et l'insertion se fera de l'ordre d'une fois par an je suppose.
Un script à l'insertion fera ce qu'il faut pour éventuellement ajouter les années concernées. Cette perte de temps n'est pas importante.
 
Merci à vous. :jap:


Message édité par Pwill le 20-04-2005 à 14:23:16
n°1054999
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-04-2005 à 11:45:54  profilanswer
 

moi perso, je préfère laisser de côté les perfs et pensé à la lisibilité :
 
select distinct to_char(to_date(d, 'YYYYMMDD', 'YYYY') from latable
 
Au moins on comprends ce qu'on fait. Et d'un point de vue perfs, tu dois avec 2 ms d'écart par rapport à un substr() classique.
 
PS: par contre, le choix du INT c'est total n'importe quoi. une date, c'est soit un type date, soit un char(8), ça évite de se prendre des cast dans tous les sens au premier traîtement sur les dates :o

n°1055147
cinocks
Posté le 21-04-2005 à 14:05:44  profilanswer
 

int(10) et timestamp


Message édité par cinocks le 21-04-2005 à 14:05:52

---------------
MZP est de retour

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [PostgreSQL] Requête peu couteuse ?

 

Sujets relatifs
Jointure Requête SQLRequete SQL - TOP10
requête union SQLRequete !! Pour trouver un mot
requete ImbriquéeRequete multi Bases ?¿
Faire une seule requete avec 2retourner le résultat d'une requête sql
[SQL]aide sur une requete d'updateTester le nombre de retours d'une requête
Plus de sujets relatifs à : [PostgreSQL] Requête peu couteuse ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR