programing

테이블의 행 크기 결정

telebox 2023. 7. 1. 08:33
반응형

테이블의 행 크기 결정

테이블의 최대 행 크기를 결정하는 방법은 무엇입니까?각 열의 크기를 수작업으로 합산할 필요가 없도록 이러한 작업을 수행하는 도구나 스크립트를 찾고 있습니다.

제 목표는 너무 넓은 표를 보고서로 만들어 구조조정을 검토하는 것입니다.8K 페이지마다 한 줄만 들어갈 정도로 폭이 넓은 것은 알고 있지만, 나머지는 찾고 싶습니다.

다른 방법으로 실행한 다음 최대 레코드 크기를 확인합니다.

dbcc showcontig ('YourTableNameHere') with tableresults

DBCC SHOW CONTIG가 더 이상 사용되지 않을 예정이므로,Microsoft대신 sys.dm _db_index_physical_dll을 사용하도록 권장합니다.각 인덱스 및 기타 통계에 대한 최대, 최소 및 평균 행 크기도 얻을 수 있습니다.

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

출력:

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

여기 제가 받은 또 다른 질문이 있습니다. 하지만 Tomalak의 질문과 마찬가지로 가변 길이 열에 대한 오버헤드와 같은 것을 고려하지 않기 때문에 깨졌습니다.

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

최적은 아닐 수 있지만 데이터 유형 날짜, 시간 등이 포함된 열에 대한 행 수 +가 표시됩니다.

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

보다INFORMATION_SCHEMA.COLUMNS테이블의 각 열의 크기를 추가하여 8k/행 규칙을 오버슈트할 가능성이 있는 테이블을 파악할 수 있습니다.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

나머지는 쿼리 결과를 보면 알 수 있습니다.

테이블 크기를 가져오는 더 나은 옵션

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

언급URL : https://stackoverflow.com/questions/496413/determine-row-size-for-table

반응형