2009-10-30 4 views
3

Essayant de recréer ma base de données SQL Server sur PostgreSQL. Tout est ok sauf que je ne trouve pas comment recréer cet index:PostgreSQL analogique de l'index SQL Server

USE [mytablename] 
GO 
CREATE NONCLUSTERED INDEX [myindex] 
ON [dbo].[mytablename] ([col1],[col2]) 
INCLUDE ([col3],[col4]) 
GO 

Seront très reconnaissants pour l'aide.

Alexey

Mise à jour:

http://img38.imageshack.us/img38/1071/89013974.png ici est une structure db étoiles + EAV
il n'y a qu'une seule requête

SELECT this_.id as id0_0_, 
this_.device_id as device2_0_0_, 
this_.time_id as time3_0_0_, 
this_.gps_detail_id as gps4_0_0_ 
FROM [scoutserver_data].[dbo].[DataMessage] this_ 
WHERE this_.time_id = 65536 and this_.device_id = 32768 

Peut-être que ce n'est pas optimal atm. Et je travaille dessus aussi. Peut-être quelque chose comme ça

SELECT * FROM [scoutserver_data].[dbo].[TimeDimension] 
    INNER JOIN ([scoutserver_data].[dbo].[DeviceDimension] 
    INNER JOIN [scoutserver_data].[dbo].[DataMessage] 
ON [DeviceDimension].[device_id] =[DataMessage].[device_id]) 
ON [TimeDimension].[time_id] = [DataMessage].[time_id] 
WHERE DeviceDimension.serial_id='2' AND TimeDimension.Day=15 AND TimeDimension.Year=2009 

Tous les conseils welcome =)

Répondre

7
CREATE INDEX myindex ON mytablename (co1l, col2, col3, col4) 

PostgreSQL ne prend pas en charge les index en cluster ou couvrant.

Mise à jour:

Pour cette requête, vous devrez créer l'index suggéré en effet:

SELECT this_.id as id0_0_, 
     this_.device_id as device2_0_0_, 
     this_.time_id as time3_0_0_, 
     this_.gps_detail_id as gps4_0_0_ 
FROM DataMessage this_ 
WHERE this_.time_id = 65536 
     AND this_.device_id = 32768 

CREATE INDEX ix_datamessage_time_device_id_detail ON datamessage (time_id, device_id, id, gps_detail_id) 

Cependant, vos tables semblent être me surnormalisée.

Vous pouvez conserver l'année, le mois et le jour dans un seul champ INT dans votre tableau. Cela vous permettra d'économiser une jointure.

Il pourrait être le point de garder DataMessage et GpsDetails dans des tableaux distincts si l'GpsDetails sont rarement liés à la DataMessage (ce qui est, gps_details_id est souvent mis à NULL), ou les détails GPS enregistrement peut être partagé entre plusieurs messages de données .

Si ce n'est pas le cas, il vaudra mieux déplacer les détails GPS dans la table des messages de données.

+0

Merci, y a-t-il des directives pour indexer les tables HUGE dans PG? –

+1

Un index entravera les performances de 'DML' et accélérera les requêtes sargable. C'est difficile à dire à moins de voir la structure de votre table et les requêtes. – Quassnoi

+0

Eh bien, il y a toujours http://www.postgresql.org/docs/8.4/static/indexes-multicolumn.html – Kev

1

La prise en charge de l'analyse uniquement indexée a maintenant été ajoutée à la version bêta de PostgreSQL. Cela signifie que si un index contient les colonnes demandées dans une requête, il n'aura probablement pas besoin d'aller aux données sous-jacentes. La numérisation uniquement par index se produit automatiquement.

La numérisation uniquement par index est la principale raison de l'utilisation des colonnes incluses. Je ne pense pas que postgres (bêta ou autre) supporte les colonnes incluses, donc les colonnes désirées devront être ajoutées à la fin de la liste des colonnes à indexer.

+1

Il est à noter que les analyses d'index seulement qui ont été ajoutées en 9.2 nécessitent toujours une recherche dans les données si la page a été modifiée depuis le dernier VACUUM. –

Questions connexes