2010-03-16 2 views
3

J'ai une table comme ci-dessousproblème de performance dans une requête de sélection d'une seule table

Il peut y avoir plusieurs enregistrements par userId [même en millions]

Je index cluster sur la colonne Date et interroger cette table très fréquemment dans les plages de temps. La colonne 'Dirty' est non nulle et peut prendre soit 0 ou 1 seulement donc je n'ai pas d'index sur 'Dirty'

J'ai plusieurs millions d'enregistrements dans ce tableau et dans un cas particulier dans mon application j'ai besoin pour interroger cette table pour obtenir tous UserId qui ont au moins un enregistrement marqué sale.

J'ai essayé cette requête - select distinct (UserId) de UserLogs où sales = 1

J'ai 10 millions de disques au total, ce qui prend comme 10min à courir et je veux que cela fonctionne beaucoup plus vite que cela.

[je suis en mesure d'interroger ce tableau sur la colonne de date en moins d'une minute.]

Les commentaires/suggestions sont les bienvenus.

mon env 64bit, sybase15.0.3, Linux

Répondre

1

Ajoutez un index contenant les champs UserId et Dirty. Placez UserId avant Dirty dans l'index car il a plus de valeurs uniques.

2

ma suggestion serait de réduire la quantité de données qui doit être interrogé par « archivage » entrées de journal à une table d'archivage dans des intervalles appropriés.

Vous pouvez toujours accéder à toutes les entrées si vous fournissez une vue de syndication sur les données de journal actuelles et archivées, mais que l'accès aux journaux actuels serait considérablement réduit.

+0

merci pour la suggestion..je l'ai envisagé avant mais atm je regarde d'autres options possibles – Inv3r53

Questions connexes