请教大家一个 SQL Server 表分区的问题

2017-03-10 10:02:08 +08:00
 zrp1994

现在有一个大表,按照每日日期进行分区,分区函数指向的列为timestamp列,然后这个大表还有一个非 unique 的device_id列,并且以此列建立聚集索引。

当我需要查询某一天的某个device_id的所有数据时, SQL 如下:

select * from table where device_id = 233 and datediff(day, timestamp, '2017-03-10') = 0

我发现查询的效率和分区之前比并没有较大的提升(耗时为原来的 50%),和预期有很大出入。

然后使用另一种日期限制条件:

select * from table where device_id = 233 and timestamp >= '2017-03-10' and timestamp < '2017-03-11'

查询的耗时为之前的 1/300~1/200 ,速度提升非常明显。

所以我想请教一下大家:当以日期为分区边界值时,使用日期函数并不能利用分区函数来限制查询的分区?换句话说,是不是日期函数对于表分区是无效的?有没有什么方法能在按日期分表的情况下同时利用日期函数?

感谢大家解答。

754 次点击
所在节点    数据库
7 条回复
weizhiyao008
2017-03-10 10:07:17 +08:00
where 条件里面不要含有计算
medivh
2017-03-10 10:11:31 +08:00
Alias4ck
2017-05-04 17:37:51 +08:00
你都说大表了。。把 where 条件修改一下 啊。。对所有的 timestamp 进行 datediff 肯定会慢啊(全表查询了)。。换成 timestamp=datediff(day, 0, '2017-03-10') 就好了
zrp1994
2017-05-04 18:25:30 +08:00
@Alias4ck #3 timestamp 包含时分秒的,你这个方法不行
Alias4ck
2017-05-05 13:51:13 +08:00
@zrp1994 那就把 timestamp 转换为日期格式啊。而且你上面给出的也只是日期比对啊 。。。我在怀疑 timestamp 和没有时间戳的日期比对怎么减的。。。是按照 00 时 00 分 00 秒为标准吗?(原谅我没怎么用过 sqlserver,不太明白其中的语法)。。
Alias4ck
2017-05-05 14:27:07 +08:00
测试了下 用 getdate()语法获取的是当前日期包含时分秒,也是可以用上述给的 datediff 的语法的 应该是默认打上了 00 时 00 分 00 秒。所以这个是可行的
Alias4ck
2017-05-05 14:47:26 +08:00
刚才上面那个是验证我自己的想法。。不好意思了 尴尬。。。的确你说的我写的 timestamp=datediff(day, 0, '2017-03-10')是不行的。。。可以改写成 convert(varchar(10),timestamp,120)='2017-03-10'...这种方式应该是可行的吧。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346339

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX