Sélection des ID d'une énorme database

J'ai une database avec plus de 3.000.000 lignes, chacune a un champ id et xml avec varchar (6000).

Si je sélectionne SELECT id FROM bigtable cela prend + – 2 minutes pour terminer. Y a-t-il un moyen de l'get en 30 secondes?

Construire l'index clusterisé sur la colonne id

Voir http://msdn.microsoft.com/en-us/library/ms186342.aspx

Vous pouvez appliquer des index à vos tables. Dans votre cas, un index clusterisé.

Index clusterisés:

http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx

Je suggère également de filterr votre requête afin qu'elle ne renvoie pas toutes les 3 millions de lignes à chaque fois, cela peut être fait en utilisant TOP ou WHERE .

HAUT:

 SELECT TOP 1000 ID FROM bigtable 

OÙ:

 SELECT ID FROM bigtable WHERE id IN (1,2,3,4,5) 

Tout d'abord, 3 millions d'loggings ne font pas une table «énorme».

Pour optimiser votre requête, vous devez effectuer les opérations suivantes.

  1. Filtrez votre requête, pourquoi avez-vous besoin de TOUT vos ID?
  2. Créez un index cluster pour la colonne ID afin d'get une table de search plus petite à searchr avant de pointer vers la ligne sélectionnée.

Sujets utiles, ici et ici

D'accord, pourquoi renvoyez-vous tous les Id au client?

Même si votre table n'a pas d'index clusterisé (ce dont je doute), la plus grande partie de votre time de traitement sera côté client, transférant les valeurs Id sur le réseau et les affichant à l'écran.

Interroger toutes les valeurs évite d'avoir un moteur de search.


La seule raison à laquelle je peux penser (peut-être que je manque d'imagination) pour get tous les Id est une sorte de caching mal orientée.

Si vous voulez en savoir beaucoup, vous avez

 SELECT count(*) FROM [bigtable] 

Si vous voulez savoir si un Id existe

 SELECT count([Id[) FROM [bigtable] WHERE [Id] = 1 /* or some other Id */ 

Cela returnnera 1 ligne avec un 1 ou 0 indiquant l'existence de l' Id spécifié.

Ces deux requêtes bénéficieront massivement d'un index clusterisé sur Id et returnneront des données minimales avec des informations maximales.

Ces deux requêtes returnneront en less de 30 secondes, et en less de 30 millisecondes si vous avez un index en cluster sur Id

La sélection de tous les Id ne fournira pas plus d'informations utiles que ces requêtes et tout ce qu'il va réaliser est une séance d'entraînement pour votre réseau et votre client.

Vous pouvez indexer votre table pour de meilleures performances.

Il existe également des options supplémentaires que vous pouvez utiliser pour améliorer les performances comme la fonction de partion .