日期:2014-05-18  浏览次数:20790 次

表分区后不走索引?
查询语句
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,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] )

------解决方案--------------------
其实你建一个这两个字段的复合索引就应该能解决你的问题
 [申报日期] , [商品编码]