表分区后不走索引?
查询语句
SQL code
select id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] FROM dbo.dc_Russia WHERE [申报日期] between '2010-1-1 0:00:00' and '2011-8-11 0:00:00' and [商品编码]='9026'
索引创建是
SQL code
CREATE NONCLUSTERED INDEX [index_hs_date] ON [dbo].[dc_Russia]
(
[商品编码] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [Data_Partition_Scheme]([申报日期])
[Data_Partition_Scheme]([申报日期])是表分区方案
执行计划却是要表扫描,为什么呢?
------解决方案-------------------- 探讨 SQL code CREATE TABLE [dbo].[dc_Russia]( [id] [int] IDENTITY(1,1) NOT NULL, [商品编码] [nvarchar](50) , [发货人名称] [nvarchar](max) , [商品描述] [nvarchar](255) , [申报日期] [datetime] NUL……
------解决方案-------------------- 建议如下建表
CREATE TABLE [dbo].[dc_Russia](
[id] [int] IDENTITY(1,1) NOT NULL,
[商品编码] [nvarchar](50) ,
[发货人名称] [nvarchar](max) ,
[商品描述] [nvarchar](255) ,
[申报日期] [datetime] NULL,
CONSTRAINT [PK_dc_Russia] PRIMARY KEY CLUSTERED (
[申报日期],
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [Data_Partition_Scheme]([申报日期])
) ON [Data_Partition_Scheme]([申报日期])
------解决方案-------------------- 注意红色部分
------解决方案-------------------- 一般表应该根据分区列聚集,才能有好的查询效果
------解决方案-------------------- 一年一个分区哦?
'2010-1-1 0:00:00' and '2011-8-11 0:00:00' 这个条件把第二区全涵盖了?那这个条件还有啥用.
[商品编码]='9026'这个条件在第二区有多少数据?
------解决方案-------------------- count(*)可以直接走索引,select 字段有可能通过聚集键再去关联,成本可能比全表扫更高,提供下
'2010-1-1 0:00:00' and '2011-8-11 0:00:00' 有多少数据
[申报日期] between '2010-1-1 0:00:00' and '2011-8-11 0:00:00' and [商品编码]='9026'有多少数据
------解决方案-------------------- SQL code
select id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格]
FROM dbo.dc_Russia(index [index_hs_date] )
WHERE [申报日期] between '2010-1-1 0:00:00' and '2011-8-11 0:00:00' and [商品编码]='9026'
------解决方案-------------------- 分区数据要尽量平均 5 2431-04-09 00:00:00.000 9008-09-01 00:00:00.000 191 这也有数据,呵呵 我觉得如果不进行切换分区,按时间分区很难合理,你的应用,不能按[商品编码]做合理分区吗?
------解决方案-------------------- RID查找消耗多,使因为你没有聚集索引 这个也可以用include索引解决 SQL code
CREATE NONCLUSTERED INDEX [index_hs_date] ON [dbo].[dc_Russia]
(
[商品编码] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [Data_Partition_Scheme]([申报日期])
INCLUDE (id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] )
------解决方案-------------------- 其实你建一个这两个字段的复合索引就应该能解决你的问题 [申报日期] , [商品编码]