首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

表分区后不走索引?解决思路

2012-04-10 
表分区后不走索引?查询语句SQL codeselect id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] FROM dbo.dc

表分区后不走索引?
查询语句

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,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] )
[解决办法]
其实你建一个这两个字段的复合索引就应该能解决你的问题
 [申报日期] , [商品编码]

热点排行