一直在群里聽到大牛們說一定要”分區索引對齊“,不然交換分區會失敗。
對于“分區索引對齊”這個關鍵詞,在MSDN的技術文檔里, 終于找到了解答:
索引要與其基表對齊,并不需要與基表參與相同的命名分區函數。但是,索引和基表的分區函數在實質上必須相同,
即:
1) 分區函數的參數具有相同的數據類型;
2) 分區函數定義了相同數目的分區;
3) 分區函數為分區定義了相同的邊界值。
其實這樣有兩種理解:
1) 索引(特指非聚集索引)與表使用同一個分區方案。
2) 索引(特指非聚集索引)與表使用實質上相同的分區方案。
關于“實質上相同”的描述,到底哪些可以不同呢?
1)當然分區函數,分區方案的名字可以不同
2)索引使用的分區方案可以使用別的文件組。(這其實才是使用不一樣名字的分區方案和函數真正的用意,使得索引與表所使用的文件組分開)
注意點: 索引所使用的分區字段必須與表所使用的分區字段相同。
例如:表分區是基于sysdate字段來分區的。 即便你的索引是基于workdate,itemco,stco來創建的,你所使用的分區字段也必須是基于sysdate。
--創建T_SALES表CREATE TABLE [dbo].[T_SALES]( [sysdate] [date] NOT NULL, [companyco] [char](2) NOT NULL, [stco] [char](4) NOT NULL, [workdate] [date] NOT NULL, [custype] [char](2) NOT NULL, [itemco] [char](6) NOT NULL, [eanco] [varchar](18) NOT NULL, [divco] [char](2) NULL, [deptco] [char](2) NULL, [classco] [char](3) NULL, [subclassco] [char](2) NULL, [salesPRice] [money] NULL, [salesprice_nt] [money] NULL, [salescost] [money] NULL, [salescost_nt] [money] NULL, [salescnt] [int] NULL, [cuscnt] [int] NULL, [cost] [money] NULL, [downprice] [money] NULL, [downcnt] [int] NULL, [binkbn] [char](1) NULL, [areaco] [varchar](2) NULL, [insuser] [varchar](20) NULL, [insdate] [datetime] NULL, [upduser] [varchar](20) NULL, [upddate] [datetime] NULL,) ON [SCH_SALES_SYSDATE]([SYSDATE])GO--創建聚集索引ALTER TABLE [dbo].[T_SALES] ADD CONSTRAINT [PK_SALES_SYSDATE] PRIMARY KEY CLUSTERED( [sysdate] ASC, [itemco] ASC, [stco] ASC, [companyco] ASC, [workdate] ASC, [custype] ASC) WITH( PAD_INDEX = ON, FILLFACTOR = 100, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)ON [SCH_SALES_SYSDATE]([SYSDATE])GO--創建索引CREATE NONCLUSTERED INDEX [IDX_SALES_WORKDATE] ON [dbo].[T_SALES] ( [workdate] ASC, [itemco] ASC, [stco] ASC, [companyco] ASC, [workdate] ASC, [custype] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SCH_SALES_IDX_SYSDATE]([SYSDATE])GO
新聞熱點
疑難解答