2010-10-22 20 views
1

nous sommes confrontés au problème suivant et nous essayons de trouver la meilleure solution possible.Le moyen le plus rapide pour aller chercher un sous-ensemble (200M) à partir d'une très grande table (600M) dans SQL Server

Nous utilisons SQL Server 2008. Nous avons une table qui a plus de 600 millions d'enregistrements, et a environ 25 colonnes. L'une des colonnes est un ID et est indexée. Nous devons obtenir un sous-ensemble d'enregistrements de cette table. Il y a principalement 2 cas:

a) le sous-ensemble contient entre 1000 et 200 millions de lignes; les ID des lignes à obtenir sont stockés dans une table indexée dans SQL Server; B) le sous-ensemble contient moins de 1 million de rangées; les identifiants des lignes à récupérer sont stockés dans la mémoire du serveur de l'application (application web .NET).

Notre défi est d'obtenir ce sous-ensemble aussi vite que possible. Nous avons besoin de cela pour arriver dans quelques secondes.

Nos solutions à ce jour:

a) nous ne une jointure entre les deux tables. Cela fonctionne mais ce n'est pas assez rapide. La requête ressemble à SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID.

b) nous n'avons pas vraiment de solution. Nous avons essayé d'exécuter une requête WHERE IN, mais cela prend une éternité si le sous-ensemble s'approche des millions de lignes (SELECT * FROM Big_Table WHERE ID IN (ID1, ID2, ID3...)). Une solution pourrait consister à stocker les index dans une table temporaire, mais cela revient ensuite au cas a.

Nous essayons d'optimiser SQL Server autant que possible, notamment en utilisant de bons index et partions. Je demande plus aujourd'hui ce que vous pensez que la meilleure approche est d'extraire le sous-ensemble dans les deux cas (a et b).

Toute idée ou suggestion est appréciée.

Merci

+4

Désolé à la question, mais avez-vous besoin de tirer les données? Pouvez-vous juste travailler dans la DB? –

+2

Par curiosité pourquoi essayez-vous d'aller chercher 200M lignes en une fois? –

+3

Avez-vous besoin de retourner TOUTES les colonnes? Je recommande de ne nommer explicitement que les colonnes que vous souhaitez renvoyer. – AdaTheDev

Répondre

1

La question la plus évidente pour votre problème a) (la requête SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID) est: êtes-vous sûr d'avoir des indices sur la colonne ID dans les deux tableaux?

+0

Oui, toutes les colonnes ID sont indexées. Il faut environ 1 min pour rejoindre la grande table (600M) avec une table d'index 100k. Ceci est sur un serveur de développement avec des tables non parsées, donc je m'attends à ce que cette fois-ci soit réduit de moitié sur un serveur de production avec des tables parsemées. Cependant, même 30 serait trop long. – Nicolas

3

Puisque vous faites de la pagination, ne pourriez-vous pas d'abord sélectionner une série de lignes de l'IndexTable, puis la joindre à la grande table?

Quelque chose comme:

select * from big_table where id in (select top 100 id from indextable)