在(日期+键)上创建聚簇索引

时间:2017-04-25 09:08:33

标签: sql-server sql-server-2008

有一个拥有4000万数据的交易表。表格中有100列。

简单来说,有3个重要的列(HeaderID,HeaderLineID,OrderDate),唯一的标识符是(HeaderID,HeaderLineID)。

CREATE TABLE [dbo].[T_Table](
[HeaderID] [nvarchar](4) NOT NULL,
[HeaderLineID] [nvarchar](10) NOT NULL,
[OrderDate] [datetime] NOT NULL
) ON [FG_Index]

GO

CREATE CLUSTERED INDEX [OrderDate] ON [dbo].[T_Table] 
(
    [OrderDate] ASC
)
GO

CREATE NONCLUSTERED INDEX [Key] ON [dbo].[T_Table] 
(
    [HeaderID] ASC,
    [HeaderLineID] ASC
)
GO

对于正常使用,我们根据日期范围选择数据

select * from T_Table
where OrderDate between '2015-01-01' and '2015-12-31'

删除当前密钥并使用Date + Key插入聚簇索引密钥是否更好?也就是说,

CREATE CLUSTERED INDEX [NewKey] ON [dbo].[T_Table] 
(
    [OrderDate] ASC,
    [HeaderID] ASC,
    [HeaderLineID] ASC
)
GO

评论回复

  

解释什么是HeaderID和HeaderLineID。是HeaderLineID&组合HeaderID独一无二?

HeaderID是订单号,HeaderLineID是订单行号。

HeaderID + HeaderLineID的组合是唯一的。

  

哪种搜索最常用?订单日期的选择性与HeaderLineID&的选择性有关。 HeaderID。

可以在过滤条件

中找到OrderDate

HeaderLineID可以在连接条件中找到其他表

可以在输出结果

中找到HeaderID,HeaderLineID,OrderDate

2 个答案:

答案 0 :(得分:0)

如果您的订单日期不唯一且您有更多查询,则您的索引对您的查询效果不佳

select * from T_Table
where OrderDate between '2015-01-01' and '2015-12-31'

我建议使用以下定义创建非聚集索引

create index nci_somename on t_table(orderdate)
include(HeaderID, HeaderLineID)

拥有聚集索引是好的,但我不推荐它,如果它不能满足您的查询

答案 1 :(得分:0)

i)每个日期的交易量是多少?

ii)你必须hv阅读这个例子,其中表扫描完成而不是CI搜索因为optmizer感觉表扫描是更有效的方式。同样可以是你的情况。

iii)严重错误:单个表中的100列本身是错误的。在NON Clustered覆盖索引中包含多少列。在所有req中,大多数20-25列都是comonn和important。 rest列是AREA特定的,因此主要是稀疏的。在单个表中输入所有列不是DeNormalization的一个例子。

iv)数据是否真的正常化?我的意思是你重复行。例如假设有两个项目在单个orderid中排序然后如何在这个场景中存储。如果两个项目存储在同一个表格中,那么它不是一个DeNormalization的例子。

v)在唯一的顺序列上创建CI。在OrderDate上创建非Clsutered索引包括(*一些常见的重要列) *因为不知道休息栏和细节。