web-dev-qa-db-fra.com

SQL Server nécessite-t-il davantage RAM pour contenir des tables indexées en colonne que Rowstore traditionnelle?

J'aimerais mettre en œuvre (SQL Server 2014) Index ColumnStore en cluster sur certaines très grandes tables larges. Aurai-je besoin de plus RAM== pour supporter cela? Si oui, comment puis-je déterminer combien?

4
Cyndi Baker

Il y a quelques aspects à considérer:

  1. les objets de colonne de colonne ne sont pas mis en cache dans la piscine tampon mais dans leur propre zone http://www.nikoport.com/2014/08/11/clustered-columnstore-indexes-part-38-Memory-tructures/ Mais SQL Server gère la répartition de l'espace à la piscine tampon ou au pool d'objets de colonne.
  2. les objets ColumnStore doivent être traités car les données sont chargées dans des groupes de rangs et il s'agit d'une opération intensive de la mémoire.
  3. étant donné que les données sont hautement compressées, plus de données peuvent être mises en cache de RAM lorsque les données sont stockées dans ColumnStore que lorsqu'elles sont stockées en tant que lignes

Quant à votre question de 'aurai-je besoin de plus de RAM' puis que la réponse est probablement non non, car le moteur utilisera tout ce que RAM est disponible lorsque vous créez l'index, sauf si vous créez sévèrement. contraint. http://www.nikoport.com/2014/06/21/clustered-columnstore-indexes-par-31-memory-Pressure-and-row-group-size/

5
mendosi

Plus RAM par opposition à quoi? Comparé à un indice en cluster normal, les données sont fortement compressées, afin de prendre moins de mémoire lors de la requête. Toutefois, le processus de construction de la CCI peut être très intensif de mémoire. . Voir la Documentation du produit

Planifiez une mémoire suffisante pour créer des index de colonne en parallèle Création d'un indice de colonne de colonne est par défaut une opération parallèle à moins que la mémoire ne soit contrainte. La création de l'indice en parallèle nécessite plus de mémoire que la création de l'index en série. Lorsqu'il y a une grande mémoire, la création d'un indice de colonne prend l'ordre de 1,5 fois aussi longtemps que la construction d'un arbre B sur les mêmes colonnes.

La mémoire requise pour la création d'un indice de colonne dépend du nombre de colonnes, du nombre de colonnes de chaîne, du degré de parallélisme (DOP) et des caractéristiques des données. Par exemple, si votre table a moins d'un million de lignes, SQL Server n'utilisera qu'un seul thread pour créer l'index de colonne.

Si votre table dispose de plus d'un million de lignes, mais SQL Server ne peut pas obtenir une subvention de mémoire suffisante pour créer l'index à l'aide de MaxDop, SQL Server diminuera automatiquement MaxDop au besoin pour s'adapter à la subvention de la mémoire disponible. Dans certains cas, DOP doit être réduite à l'une afin de construire l'index sous la mémoire contrainte.

5
Chad Mattox

Mendosi a déjà été indiqué par Mendosi: la piscine d'objets de colonne est située à l'extérieur du pool tampon. Voir le blog qu'il a lié.

La question est un peu floue.

Voulez-vous que le piscine tampon ait la même mémoire disponible lorsque vous commencez à utiliser des index de colonne? Si oui, alors:

  • Ne changez pas le réglage de la mémoire Max pour l'instance (en supposant qu'il soit déjà défini sur une valeur sensible, en tenant compte de quoi d'autre se trouve sur la machine).
  • Augmentez la mémoire sur la machine, car vous en aurez besoin pour la piscine d'objet ColumnStore. Combien? Il n'y a pas de limitation de la mémoire pour le pool d'objet ColumnStore sur l'édition Enterprise. Sur SQL 2016 SP1 + Standard Edition, le pool d'objets ColumnStore est limité à 32 Go par instance (voir SQL Server 2016 SP1: connaître vos limites ).

D'autre part, si vous allez bien avec la piscine tampon, obtenez moins de mémoire et/ou vous ne pouvez pas augmenter la mémoire sur la machine - diminuez le réglage de la mémoire max de l'instance, car vous aurez besoin de la mémoire pour le pool d'objets de colonne.

Dans tous les cas, je recommande de surveiller l'utilisation de la mémoire et la syntonisation de la mémoire de la machine et/ou le réglage de la mémoire max en conséquence. Comme point de départ, certains DMV:

SELECT * FROM sys.dm_os_sys_memory;
SELECT * FROM sys.dm_os_process_memory;
SELECT * FROM sys.dm_os_memory_broker_clerks; --undocumented DMV!

SELECT
   name
  ,type
  ,memory_node_id
  ,pages_kb
  ,page_size_in_bytes
  ,virtual_memory_reserved_kb
  ,virtual_memory_committed_kb
  ,shared_memory_reserved_kb
  ,shared_memory_committed_kb
FROM
   sys.dm_os_memory_clerks
ORDER BY
   pages_kb DESC;
0
Blaž Dakskobler