Создание индекса columnstore для существующей многораздельной таблицы с 800+ миллионами строк на SQL Server 2017 - PullRequest
1 голос
/ 03 апреля 2020

У меня есть таблица разделов (на дату) с кластерным индексом B-Tree, которая содержит более 800 миллионов строк.

Я хотел бы создать кластерный индекс columnstore для этой таблицы вместо существующего кластерного индекса, Какой самый эффективный способ?

Влияет ли это на мой существующий первичный ключ, созданный с помощью кластерного индекса B-дерева?

Что еще нужно сделать, чтобы мой Выравнивание индекса columnstore с существующим разделом таблицы?

Пожалуйста, руководство.

 CREATE TABLE [dbo].[ORDHDR](
        [DATE_DWID] [bigint] NOT NULL,
        [VERSION] [bigint] NOT NULL,
        [LOCATION_DWID] [bigint] NOT NULL,
        [START_LOC_DWID] [bigint] NOT NULL,
        [DESTINATION_LOC_DWID] [bigint] NOT NULL,
        [XFY_ID] [bigint] NOT NULL,
        [START_DWID] [bigint] NOT NULL,
        [END_DWID] [bigint] NOT NULL,
        [START_REQ_DWID] [bigint] NOT NULL,
        [END_IYF_DWID] [bigint] NOT NULL,
        [CREATED_AT_DWID] [bigint] NOT NULL,
        [TIME_OF_IPB_DWID] [bigint] NOT NULL,
        [DATAREC_NUM] [int] NOT NULL,
        [REQUEST_FOR_DATA_TRANSFER] [varchar](30) NULL,
        [DATAPCKT_NUM] [varchar](6) NOT NULL,
        [INTERNAL_NUM_FOR_SUPPLY] [varchar](30) NULL,
        [SOURCE_SUPPLY] [varchar](60) NULL,
        [RECORD_MODE] [varchar](1) NULL,
        [ORD_TYPE] [varchar](3) NULL,
        [APO_ORD] [varchar](12) NULL,
        [APO_APPLICATION] [int] NULL,
        [SUPPLY_CATEGORY] [varchar](12) NULL,
        [CONVERTABLE_ORD] [varchar](1) NULL,
        [ORDSTATUS_OUTPUT] [varchar](1) NULL,
        [ORDSTATUS_INPUT] [varchar](1) NULL,
        [PARTIAL_DELIVERY_STATUS] [varchar](1) NULL,
        [FINAL_DELIVERY_INDICATOR] [varchar](1) NULL,
        [STATUS_DEALLOCATED] [varchar](1) NULL,
        [STATUS_RELEASED] [varchar](1) NULL,
        [STATUS_FIXED] [varchar](1) NULL,
        [STATUS_STARTED] [varchar](1) NULL,
        [ORD_COMPONENT_ISSUED] [int] NULL,
        [PARTIALLY_CONFIRMED] [varchar](1) NULL,
        [FINAL_CONFORMATION] [varchar](1) NULL,
        [ORD_PLNG_TYPE] [int] NULL,
        [ORD_STATUS] [int] NULL,
        [START_TIME_OF_ACTIVITY] [varchar](15) NULL,
        [END_DATE_OF_LATEST_ACTIVITY] [varchar](15) NULL,
        [FLAG] [varchar](1) NULL,
        [EDW_CREATE_DATE] [datetime] NULL,
        [EDW_UPDATE_DATE] [datetime] NULL
    ) ON [ORD_PS]([DATE_DWID])

    GO

    CREATE UNIQUE CLUSTERED INDEX [ORD_HDR_PK] ON [dbo].[ORDHDR]
    (
        [DATE_DWID] ASC,
        [VERSION] ASC,
        [LOCATION_DWID] ASC,
        [START_LOC_DWID] ASC,
        [DESTINATION_LOC_DWID] ASC,
        [XFY_ID] ASC,
        [START_DWID] ASC,
        [END_DWID] ASC,
        [START_REQ_DWID] ASC,
        [END_IYF_DWID] ASC,
        [CREATED_AT_DWID] ASC,
        [TIME_OF_IPB_DWID] ASC,
        [DATAREC_NUM] ASC,
        [DATAPCKT_NUM] ASC
    )

1 Ответ

1 голос
/ 03 апреля 2020

Поскольку в кластеризованном индексе хранилища столбцов есть только столбцы и нет ключей, вам необходимо изменить существующий уникальный кластеризованный индекс на кластеризованный индекс хранилища столбцов, чтобы преобразовать таблицу хранилища строк в хранилище столбцов и затем создать новое некластеризованное b-дерево. Индекс для обеспечения уникальности.

Это может быть выполнено с помощью условия DROP_EXISTING=ON CREATE CLUSTERED COLUMNSTORE INDEX с последующим созданием нового индекса.

--change existing clustered index to clustered columnstore
CREATE CLUSTERED COLUMNSTORE INDEX ORD_HDR_PK ON [dbo].[ORDHDR]
    WITH(DROP_EXISTING=ON) ON [ORD_PS]([DATE_DWID]);

--rename columnstore index to a more meaningful name
EXEC sp_rename 'dbo.ORDHDR.ORD_HDR_PK','ccidx_ORDHDR', 'INDEX';

--create new non-clustered unique index
CREATE UNIQUE NONCLUSTERED INDEX [ORD_HDR_PK] ON [dbo].[ORDHDR]
    (
        [DATE_DWID] ASC,
        [VERSION] ASC,
        [LOCATION_DWID] ASC,
        [START_LOC_DWID] ASC,
        [DESTINATION_LOC_DWID] ASC,
        [XFY_ID] ASC,
        [START_DWID] ASC,
        [END_DWID] ASC,
        [START_REQ_DWID] ASC,
        [END_IYF_DWID] ASC,
        [CREATED_AT_DWID] ASC,
        [TIME_OF_IPB_DWID] ASC,
        [DATAREC_NUM] ASC,
        [DATAPCKT_NUM] ASC
    ) ON [ORD_PS]([DATE_DWID]);
...