OK. J'ai lu des choses ici et là sur les tas de SQL Server, mais rien de trop définitif pour vraiment me guider. Je vais essayer de mesurer la performance, mais j'espérais des conseils sur ce que je devrais examiner. C'est SQL Server 2008 Enterprise. Voici les tableaux:Uniqueidentifier PK: un tas SQL Server est-il le bon choix?
Emploi
- JobID (PK, GUID, à l'extérieur généré)
- StartDate (datetime2)
- accountid
- Plusieurs autres domaines de la comptabilité, principalement décimaux et bigints
JobSteps
- JobStepID (PK, GUID, généré à l'extérieur)
- JobID FK
- StartDate
- Plusieurs autres domaines de la comptabilité, principalement décimaux et bigints
Utilisation: Beaucoup d'inserts (centaines/seconde), généralement 1 JobStep par tâche. Estimer peut-être 100-200M lignes par mois. Aucune mise à jour du tout, et les seules suppressions proviennent de l'archivage des données de plus de 3 mois.
Effectuez ~ 10 requêtes/s par rapport aux données. Certains rejoignent JobSteps aux Jobs, d'autres se contentent de Jobs. Presque toutes les requêtes vont sur StartDate, la plupart d'entre elles incluent AccountId et certains des autres champs de comptabilité (nous avons des index sur eux). Les requêtes sont assez simples - la plus grande partie des plans d'exécution est la jointure pour JobSteps.
La priorité est la performance d'insertion. Une certaine latence (5 minutes environ) est tolérable pour que les données apparaissent dans les requêtes, donc la réplication vers d'autres serveurs et l'exécution de requêtes hors de celles-ci est certainement permise.
La recherche basée sur les GUID est très rare, à part de joindre JobSteps aux Jobs.
Configuration actuelle: Aucun index clusterisé. Le seul qui semble être un candidat est StartDate. Mais, ça n'augmente pas parfaitement. Les tâches peuvent être insérées n'importe où dans une fenêtre de 3 heures après leur StartDate. Cela pourrait signifier qu'un million de lignes sont insérées dans un ordre qui n'est pas définitif.
La taille des données pour un Job 1 + 1 JobStepId, avec mes index actuels, est d'environ 500 octets.
Questions:
Est-ce une bonne utilisation d'un tas?
Quel est l'effet de la mise en cluster sur StartDate, quand il est à peu près non-séquentiel pour ~ 2 heures/1 million de lignes? Ma conjecture est que le ré-ordonnancement constant tuerait perf insertion. Dois-je simplement ajouter des PK bigint simplement pour avoir des clés plus petites et toujours plus grandes?(Je encore besoin des guids pour les recherches.)
Je lis GUIDs as PRIMARY KEYs and/or the clustering key, et il semblait suggérer que même inventer une clé permettra d'économiser un espace considérable sur d'autres indices. En outre, certaines ressources suggèrent que les tas ont des problèmes de perf en général, mais je ne suis pas sûr que cela s'applique encore dans SQL 2008.
Et encore une fois, oui, je vais essayer de tester et mesurer la performance. J'essaie juste d'obtenir des conseils ou des liens vers d'autres articles afin que je puisse prendre une décision plus éclairée sur les chemins à considérer.
Oui, je voulais vraiment éviter GUIDs comme clé en cluster, comme toutes les autres questions montrent. StartDate aurait besoin d'une identité supplémentaire. J'étais juste inquiet que l'insertion de dates de début essentiellement "aléatoires" sur une période de 2 heures pourrait signifier beaucoup de réorganisation ou quelque chose. Donc, en bref, allez ajouter un bigint PK pour que tout soit beau et groupé? – MichaelGG
@MichaelGG: oui. c'est étroit, numérique, strictement monotone croissant, unique = bon index clusterisé – gbn
A droite, je comprends qu'un int PK est beaucoup plus adapté qu'un guid. Ma question était de savoir si l'ajout d'une nouvelle colonne bigint juste pour avoir des index clusterisés, par opposition à la laisser comme un tas était une bonne idée. Il semble que ce soit le bon mouvement. – MichaelGG