web-dev-qa-db-fra.com

Déterminer la taille de la ligne pour la table

Comment déterminer la taille de ligne maximale pour une table? Je cherche un outil ou un script qui fait cela, donc je n'ai pas à additionner la taille de chaque colonne à la main.

Mon objectif est de produire un rapport de tableaux trop larges pour que nous puissions envisager de les restructurer. Je sais que nous en avons plusieurs qui sont si larges qu’une seule rangée convient à chaque page de 8 Ko, mais je veux trouver le reste.

36
Jonathan Allen

Une autre façon, lancez ceci puis regardez MaximumRecordsize

dbcc showcontig ('YourTableNameHere') with tableresults
61
SQLMenace

Comme DBCC SHOWCONTIG est obsolète, Microsoft conseille d'utiliser plutôt sys.dm_db_index_physical_stats . Vous pouvez également obtenir la taille de ligne maximale, minimale et moyenne pour chaque index et autres statistiques:

SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'AdventureWorks2014'), OBJECT_ID(N'[sales].[SalesOrderHeader]'), NULL, NULL , 'DETAILED')

Sortie:

database_id object_id   index_id    partition_number index_type_desc                                              alloc_unit_type_desc                                         index_depth index_level avg_fragmentation_in_percent fragment_count       avg_fragment_size_in_pages page_count           avg_page_space_used_in_percent record_count         ghost_record_count   version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forwarded_record_count compressed_page_count
----------- ----------- ----------- ---------------- ------------------------------------------------------------ ------------------------------------------------------------ ----------- ----------- ---------------------------- -------------------- -------------------------- -------------------- ------------------------------ -------------------- -------------------- -------------------------- ------------------------ ------------------------ ------------------------ ---------------------- ---------------------
6           1266103551  1           1                CLUSTERED INDEX                                              IN_ROW_DATA                                                  3           0           0.439882697947214            28                   24.3571428571429           682                  98.8644304423029               31465                0                    0                          154                      195                      171.487                  NULL                   0
6           1266103551  1           1                CLUSTERED INDEX                                              IN_ROW_DATA                                                  3           1           0                            2                    1                          2                    54.7442550037064               682                  0                    0                          11                       11                       11                       NULL                   0
6           1266103551  1           1                CLUSTERED INDEX                                              IN_ROW_DATA                                                  3           2           0                            1                    1                          1                    0.296515937731653              2                    0                    0                          11                       11                       11                       NULL                   0
6           1266103551  2           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           0           0                            4                    25.5                       102                  99.0670990857425               31465                0                    0                          24                       24                       24                       NULL                   0
6           1266103551  2           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           1           0                            1                    1                          1                    31.4801087225105               102                  0                    0                          23                       23                       23                       NULL                   0
6           1266103551  3           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           0           0                            3                    36.3333333333333           109                  99.8363355572029               31465                0                    0                          26                       26                       26                       NULL                   0
6           1266103551  3           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           1           0                            1                    1                          1                    36.3355572028663               109                  0                    0                          25                       25                       25                       NULL                   0
6           1266103551  4           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           0           0                            2                    27.5                       55                   98.9285025945145               31465                0                    0                          12                       12                       12                       NULL                   0
6           1266103551  4           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           1           0                            1                    1                          1                    11.527057079318                55                   0                    0                          15                       15                       15                       NULL                   0
6           1266103551  5           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           0           0                            2                    27.5                       55                   98.9285025945145               31465                0                    0                          12                       12                       12                       NULL                   0
6           1266103551  5           1                NONCLUSTERED INDEX                                           IN_ROW_DATA                                                  2           1           0                            1                    1                          1                    13.5656041512231               55                   0                    0                          18                       18                       18                       NULL                   0
23
gotqn

Voici une autre requête que j'ai eue, mais qui, comme celle de Tomalak, est cassée car elle ne prend pas en compte des éléments tels que la surcharge des colonnes de longueur variable.

SELECT OBJECT_NAME (id) tablename
     , COUNT (1)        nr_columns
     , SUM (length)     maxrowlength
FROM   syscolumns
GROUP BY OBJECT_NAME (id)
ORDER BY OBJECT_NAME (id)
6
Jonathan Allen

Regardez INFORMATION_SCHEMA.COLUMNS. Vous pouvez ajouter la taille de chaque colonne dans un tableau pour vous donner une idée des tableaux susceptibles de dépasser la règle de 8 Ko/ligne.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

Vous découvrirez le reste lorsque vous verrez le résultat de la requête.

3
Tomalak

Peut-être pas le meilleur mais cela montre le nombre de lignes + pour les colonnes avec date, heure, etc.

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN  sysobjects so on t.object_id = so.id
INNER JOIN  syscolumns SC on (so.id = sc.id)
INNER JOIN systypes st on (st.type = sc.type)
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
    AND so.type = 'U'
and st.name IN ('DATETIME', 'DATE', 'TIME')
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    p.rows DESC
2

Meilleure option pour obtenir la taille de la table

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
0
dE Source