PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Optimisation requête : sélection des n premiers éléments de chaque catégorie

Technique - optimisation | Optimisation requête : sélection des n premiers éléments de chaque catégorie

Par Nicop le 12/11/2007 - 17:22

Bonjour,

Je souhaite savoir s'il existe une méthode "optimale" pour récupérer les n premières lignes de chaque catégorie d'un ensemble de données.

Je m'explique. Imaginons le jeu de données suivant :

CREATE TABLE ma_table
(
ID integer NOT NULL,
ID_CATEGORIE integer,
CONSTRAINT ma_table_pkey PRIMARY KEY (ID)
)
WITHOUT OIDS;
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(1,1);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(2,1);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(3,2);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(4,2);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(5,2);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(6,4);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(7,4);
INSERT INTO ma_table(ID, ID_CATEGORIE) VALUES(8,4);

SELECT * FROM ma_table;

ID | ID_CATEGORIE
-- ------------
1 | 1
2 | 1
3 | 2
4 | 2
5 | 2
6 | 4
7 | 4
8 | 4

Je souhaite récupérer les 2 premières lignes de chaque catégorie, c'est à dire :

ID | ID_CATEGORIE
-- ------------
1 | 1
2 | 1
3 | 2
4 | 2
6 | 4
7 | 4

La requête suivante fonctionne, mais est malheureusement très peu performante si la table est conséquente :

SELECT * FROM ma_table
WHERE ID IN
(SELECT ID
FROM ma_table mt
WHERE mt.ID_CATEGORIE = ma_table.ID_CATEGORIE
ORDER BY ID
LIMIT 2)

Des idées ?
Merci !

Nico

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Détails SVP

Jean-Paul Argudo/ = 13 Novembre, 2007 - 12:29

Bonjour,

J'aurais besoin de plus d'informations pour répondre:

  • nombre de tuples dans la table
  • si le schéma que vous avez en production est bien celui-ci
  • quels sont les index positionnés
  • si vous avez fait un REINDEX
  • si vous avez clusterisé la table en fonction d'un eventuel index sur id_categorie
  • le plan d'exécution de le requête sur la base avec la volumétrie réelle.

Merci!
--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.