表分区后不走索引?查询语句SQL codeselect id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] FROM dbo.dc
表分区后不走索引? 查询语句
SQL codeselect id,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] FROM dbo.dc_Russia WHERE [申报日期] between '2010-1-1 0:00:00' and '2011-8-11 0:00:00' and [商品编码]='9026' 索引创建是
SQL codeCREATE 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 codeselect 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 codeCREATE 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,[收货人名称] ,[申报日期] ,[商品编码] ,[价格] )[解决办法] 其实你建一个这两个字段的复合索引就应该能解决你的问题 [申报日期] , [商品编码]