有一个拥有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。
可以在过滤条件
中找到OrderDateHeaderLineID可以在连接条件中找到其他表
可以在输出结果
中找到HeaderID,HeaderLineID,OrderDate答案 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索引包括(*一些常见的重要列) *因为不知道休息栏和细节。