Base de données SQL Server sur un SSD - un avantage pour un fichier séparé pour chaque table?

19

Je crée une base de données dans laquelle il y aura environ 30 tables, chaque table contenant des dizaines de millions de lignes et chaque table contenant une seule colonne importante et une colonne de clé primaire / étrangère afin de maximiser l'efficacité des requêtes face à des charges lourdes mises à jour et insertions et faire un usage intensif des index cluster. Deux des tableaux contiendront des données textuelles de longueur variable, l'un d'entre eux contenant des centaines de millions de lignes, mais le reste ne contiendra que des données numériques.

Comme je veux vraiment extraire chaque dernière goutte de performances du matériel dont je dispose (environ 64 Go de RAM, un SSD très rapide et 16 cœurs), je pensais autoriser chaque table à avoir son propre fichier afin que, peu importe si Je me joins à 2, 3, 4, 5 tables ou plus, chaque table sera toujours lue en utilisant un thread séparé et la structure de chaque fichier sera étroitement alignée avec le contenu de la table, ce qui, espérons-le, minimisera la fragmentation et la rendra plus rapide pour SQL Server à ajouter au contenu d'une table donnée.

Une mise en garde, je suis bloqué sur SQL Server 2008 R2 Web Edition . Ce qui signifie que je ne peux pas utiliser le partitionnement horizontal automatique, ce qui exclut cela comme une amélioration des performances.

L'utilisation d'un fichier par table maximisera-t-elle réellement les performances, ou suis-je en train de négliger les caractéristiques du moteur SQL Server intégré qui rendraient cela si redondant?

Deuxièmement, si l'utilisation d'un fichier par table est avantageuse, pourquoi ne create tableme donne-t-il que l'option d'allouer la table à un groupe de fichiers et non à un fichier logique spécifique? Cela m'obligerait à créer un groupe de fichiers distinct pour chaque fichier de mon scénario, ce qui me suggère que peut-être SQL Server n'envisage pas les avantages dont je suppose qu'ils découleraient de ce que je propose.

Nathan Ridley
la source

Réponses:

18

Je pensais permettre à chaque table d'avoir son propre fichier afin que, peu importe si je me joins à 2, 3, 4, 5 tables ou plus, chaque table sera toujours lue à l'aide d'un thread séparé et la structure de chaque fichier sera être étroitement aligné avec le contenu de la table, ce qui devrait, espérons-le, minimiser la fragmentation et accélérer l'ajout de SQL Server au contenu d'une table donnée

De quoi diable parles-tu? Je ne sais pas d'où vous avez obtenu vos informations, mais vous devez certainement jeter cette source. Rien de ce que vous supposez ici n'est en fait correct.

Si vous souhaitez lire une bonne discussion sur les performances SSD pour SQL Server, il existe plusieurs séries de blogs. Comme d'habitude, celui de Paul Randal est le plus lu:

Brent a également une belle présentation sur le sujet: SQL sur SSD: Hot and Crazy Love et il y en a plus.

En parcourant toutes ces présentations, vous remarquerez rapidement qu'elles se concentrent toutes sur les écritures, car c'est là que les performances des SSD entrent en jeu. La formulation de votre message concerne presque entièrement les lectures, ce qui est un sujet différent. Si les lectures sont votre problème, alors vous devriez parler de RAM, pas de SSD, et de stratégies d'indexation et d'interrogation appropriées.

Remus Rusanu
la source
1
Oui, on m'a donné des informations erronées quelque part le long de la ligne, mais comme j'ai commenté la réponse de Stuart, j'ai posé la question pour m'assurer que je ne basais pas mes décisions sur des informations incorrectes. Merci pour les liens, je vais les vérifier.
17

Ma première suggestion serait de ne faire aucune hypothèse sur les performances sans effectuer de test de charge sur les deux configurations.

Ma supposition d'avoir vu de telles configurations (qui ont du sens sur le papier) dans le passé serait que le fait d'avoir chaque table dans un fichier séparé n'aurait pas un impact positif mesurable pour les performances ... et que la complexité supplémentaire compenserait les gains de performances même si elles étaient mesurables.

Enfin, en ce qui concerne la compression de chaque baisse de performances d'un serveur SQL, je vous renvoie au tableau suivant (à condition que mon Microsoft):

entrez la description de l'image ici

Toutes les optimisations potentielles qui pourraient être faites du point de vue de l'application éclipsent facilement toutes les optimisations possibles au niveau de la configuration du matériel / de la base de données ... alors concentrez votre attention de manière appropriée.

Michael Fredrickson
la source
Bien sûr. Dans mon cas cependant, j'ai optimisé l'ensemble du système autant que possible et le principal goulot d'étranglement que j'ai en ce moment est la vitesse de requête très rapide face aux mises à jour, suppressions et insertions fréquentes. Comme je vais tirer parti de SQL Server pour résoudre ce problème, je veux m'assurer de lui donner la meilleure chance possible de fonctionner aussi rapidement que possible sur mes données.
@NathanRidley Ok, compris ... Je pense que la vraie réponse, à moins que quelqu'un n'ait une ressource disant "ne jamais faire ça", que la meilleure solution serait de comparer deux configurations par rapport à votre charge de travail typique, et de voir s'il y a une différence mesurable.
Michael Fredrickson
4

Comme d'autres l'ont fait remarquer, il n'y a pas d'avantage direct d'un fichier par table; voici un excellent synopsis de Steve Jones sur l'origine de ce mythe: http://www.sqlservercentral.com/blogs/steve_jones/2009/10/13/sql-server-legend-data-files-and-threads/

Vous pouvez également rechercher une vue partitionnée qui, je crois, est prise en charge par 2008 Web Edition. Il existe quelques astuces pour coder par rapport à une vue partitionnée, mais vous pouvez imiter une grande partie des fonctionnalités des tables partitionnées relativement facilement.

Stuart Ainsworth
la source
2

Je pense que des fichiers séparés pour chaque table n'apporteraient aucun avantage en termes de performances. Les index corrects peuvent avoir une augmentation potentielle des performances (lecture du disque) sur le serveur de base de données.

SQL Server 2008 R2 prend-il en charge la compression? Si oui, activez-le.

Corrige moi si je me trompe.

Peter Kiss
la source
Pourriez-vous expliquer pourquoi il n'y aurait aucun avantage en termes de performances? À tout le moins, expliquez pourquoi c'est le cas lorsque des fichiers séparés permettent à SQL Server d'utiliser plusieurs threads pour la lecture.
Si vous placez toutes les tables sur son propre groupe de fichiers mais sur le même lecteur, les performances seront égales avant le partitionnement. Mais si vous séparez certaines tables de leurs groupes de fichiers sur un autre disque plus rapide, cela aura des avantages en termes de performances. Vous pouvez également partitionner par exemple par année si vous avez beaucoup de données qui dépendent de l'année. Avec cette technique, vous pouvez conserver vos données les plus utilisées sur un disque plus rapide que les anciennes. Vous pouvez également séparer les index, mais uniquement si vous les placez sur un nouveau disque physique, vous bénéficierez de performances.
Vous avez raison sur les threads parallèles (tables / fichiers) mais je pense que jusqu'à ce que vous n'ayez qu'un seul disque physique, le gain de performances sera faible.
Et je vous recommande d'obtenir une matrice RAID HDD pour la base de données car le SSD va bientôt mourir.