Почему две таблицы с одинаковой структурой и данными занимают разное количество дискового пространства? - PullRequest
0 голосов
/ 14 июня 2019

Я перемещал таблицу с разработки на рабочий сервер и после перемещения данных обнаружил, что две таблицы занимают разное количество дискового пространства, даже если они абсолютно одинаковы. Мне интересно, что может вызвать это, и если есть какие-либо возможные последствия от этого.

Вот скрипт, который показывает структуру двух таблиц:

    CREATE TABLE [dbo].[BRIDGE_TABLE](
           [Column1_fk] [date] NOT NULL,
           [Column2_fk] [int] NOT NULL,
    CONSTRAINT [PK_BRIDGE_TABLE] PRIMARY KEY CLUSTERED
    (
           [Column1_fk] ASC,
           [Column2_fk] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[BRIDGE_TABLE]  WITH CHECK ADD  CONSTRAINT [FK_BRIDGE_TABLE_1] FOREIGN KEY([Column1_fk]) REFERENCES [dbo].[PARENT_TABLE_1] ([KeyColumn])
    GO

    ALTER TABLE [dbo].[BRIDGE_TABLE]  WITH CHECK ADD  CONSTRAINT [FK_BRIDGE_TABLE_2] FOREIGN KEY([Column2_fk]) REFERENCES [dbo].[PARENT_TABLE_2] ([KeyColumn])
    GO

Вот результаты sp_spacedused, показывающие разницу в использовании диска.

 Table Name          |rows       |reserved     |data       |index_size    |unused 
 --------------------|-----------|-------------|-----------|--------------|------ 
 Dev_Table           |98072577   |2502000 KB   |2491696 KB |9808 KB       |496 KB
 --------------------|-----------|-------------|-----------|--------------|------ 
 Production_Table    |98072577   |1560264 KB   |1550560 KB |7040 KB       |2664 KB

Редактировать: добавлены результаты запроса sys.dm_db_index_physical_stats

tableName  |index_id |index_type_desc  |record_count |page_count |fragment_count |ghost_record_count |avg_record_size_in_bytes
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |98072577     |311462     |292268         |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |311462       |1206       |1206           |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |1206         |5          |5              |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |5            |1          |1              |0                  |14
tableName  |index_id |index_type_desc  |record_count |page_count |fragment_count |ghost_record_count |avg_record_size_in_bytes
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |98072577     |193820     |2686           |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |193820       |867        |867            |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |867          |3          |3              |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |3            |1          |1              |0                  |14

1 Ответ

0 голосов
/ 15 июня 2019

Причиной разницы в размерах является фрагментация.

В среде разработки высокая степень фрагментации, как видно из результата запроса sys.dm_db_index_physical_stats.Это происходит, когда со временем вы удаляете / обновляете данные, что приводит к тому, что страницы заполняются не полностью (при условии, что коэффициент заполнения как при разработке, так и при производстве одинаков).

Когда вы переносили данные из разработки в производство, фрагментация довольно низкая, и поэтому использование пространства также низкое.

Попробуйте удалить фрагментацию на сервере разработки

ALTER INDEX PK_BRIDGE_TABLE ON [dbo].[BRIDGE_TABLE] REBUILD;

Это должно снизить фрагментацию и уменьшить пространство, используемое на столе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...