Combien de time devrait prendre une requête qui renvoie 5 millions d'loggings?

Je me rends count que la réponse devrait probablement être "aussi peu de time que possible" mais j'essaie d'apprendre comment optimiser les bases de données et je n'ai aucune idée de ce qu'est un time acceptable pour mon matériel.

Pour commencer, j'utilise ma machine locale avec une copy de sql server 2008 express. J'ai un processeur dual-core, ram 2Go et un operating system 64 bits (si cela fait une différence). J'utilise seulement une table simple avec environ 6 champs de varchar.

Au début, j'ai interrogé datatables sans aucune indexing. Cela a pris un time ridiculement long donc j'ai annulé et ajouté un index clusterisé (en utilisant le PK) à la table. Cela a réduit le time à 1 minute 14 secondes. Je n'ai aucune idée si c'est le meilleur que je peux get ou si je suis encore capable de réduire encore plus loin?

Suis-je limité par mon matériel ou y a-t-il autre chose que je puisse faire à ma table / database / requêtes pour get des résultats plus rapidement?

Pour info, je n'utilise qu'un SELECT * FROM standard pour récupérer mes résultats.

Merci!

EDIT: Juste pour clarifier, je ne fais que cela à des fins de test. Je n'ai pas besoin de sortir toutes datatables, je l'utilise simplement comme un test cohérent pour voir si je peux réduire les time de requête.

Je suppose que ce que je request est: est ce que je peux faire pour accélérer la performance de mes requêtes autres que a) la mise à niveau du matériel et b) l'ajout d'index (en supposant que le schéma est déjà bon)?

Je pense que vous posez la mauvaise question.

Tout d'abord, pourquoi avez-vous besoin de tant d'articles en même time à la machine locale? Que veux-tu faire avec eux?

Pourquoi je request? Je pense que cette quantité de données sera transférée quelque part. Et seulement à ce moment vous devriez mesurer le time de transfert des données.

Et même dans cette situation, je veux vous conseiller:

Vos applications ne doivent pas sélectionner 5 millions d'loggings à la fois. Essayez de split votre requête et obtenez des données partiellement.

METTRE À JOUR:

Comme vous le dites le faire pour les tests, je vous suggère de:

  1. Supprimer * de votre requête: le server SQL passe un certain time à résoudre ce problème.
  2. Essayez de mettre vos données à un certain niveau de stockage de données temporaires. Essayez d'utiliser VIEW ou la table temporaire pour cela.
  3. Essayez d'utiliser un plan de cache sur votre server

Mais je ne comprends toujours pas – pourquoi avez-vous besoin de tels tests si votre application n'utiliserait jamais une telle requête? Tester uniquement pour les tests est une mauvaise dépense de time .

Regardez le plan d'exécution de la requête. Si votre requête effectue une parsing de table, cela prendra évidemment beaucoup de time. Le plan d'exécution de la requête peut vous aider à décider du type d'indexing dont vous avez besoin sur la table. En outre, la création de partitions de tables peut parfois s'avérer utile dans les cas où datatables sont partitionnées par une condition (généralement la date et l'heure).

La méthode la mieux optimisée dépend de la stratégie d'indexing que vous choisissez. Comme beaucoup de réponses ci-dessus, je dirais aussi que le partitionnement de la table aiderait parfois. Et ce n'est pas la meilleure pratique pour interroger tout le milliard d'loggings dans un seul laps de time. Vous donnera beaucoup mieux résolu si vous pouviez essayer d'interroger partiellement avec les itérations. vous pouvez vérifier ce lien pour effacer les doutes sur les exigences minimales pour le server Sql 2008 Minimum H / W et S / W Exigences pour Sql Server 2008

Lorsque vous fecthing 5 millions de lignes, vous êtes presque 100% en attente de tempdb. vous devriez essayer d'optimiser votre Db temporaire en ajoutant des files supplémentaires. Si vous avez plusieurs disques sur des disques séparés, vous devez split datatables de la table en différents files ndf situés sur des disques séparés. Parititioning ne vous aidera pas lors de l'interrogation de toutes datatables sur le disque U peut également utiliser un indice de requête pour forcer le parrallélisme MAXDOP cela va augmenter l'utilisation du processeur. Assurez-vous que les colonnes contiennent peu de zéros autant que possible et reconstruisez vos index et statistics