首页 新闻 搜索 专区 学院

===========SQL Server 分区表的问题===================

0
悬赏园豆:10 [待解决问题]

在没有分区表以前,为了减少单表的记录数,我们将相同的表按照 年份 水平拆分到不同的表中,如销售记录表 Sales 拆分成类似这样
Sales_2020,Sales_2021,Sales_2022
当通过编程语言查询时,首先要确定需要查询的目标表名

当有了分区表后 假设有以下的表结构

CREATE TABLE [dbo].[test] (
[id] int DEFAULT '' NOT NULL,
[create_datetime] datetime NOT NULL,
[create_year] AS (datepart(year,[create_datetime])) PERSISTED NULL ---- 有意冗余
)
ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ix_test____create_year]
ON [dbo].[test] (
[create_year] ASC
)

列 create_datetime 应用了按 年 划分的分区函数
请问当使用以下查询时
select * from test where create_year=2020;

查询引擎会不会主动到分区是 2020 的逻辑表中去查询? 还是说要改进SQL语句才行。多谢多谢

< >
分享
所有回答(3)
0

你可以查询collect_datetime>='2020-1-1' and collect_datetime<='2020-12-31 23:59:59'

保镖 | 园豆:620 (小虾三级) | 2020-06-08 14:25

感谢回复。。。。。。
是可以这样,我增加只保存 年份 的字段是故意冗余的 在这个列上建索引 为了提高查询速度。。

支持(0) 反对(0) Free.Wong | 园豆:20 (初学一级) | 2020-06-08 14:35

@Free.Wong: 你如果分区是按collect_datetime,单查询不是按collect_datetime,那就是夸分区查询了。

支持(0) 反对(0) 保镖 | 园豆:620 (小虾三级) | 2020-06-08 14:37

@保镖: 感谢回复,我换了一种提问方法。。。。

支持(0) 反对(0) Free.Wong | 园豆:20 (初学一级) | 2020-06-08 15:22
0

--查询某个时间的分区编号
select $PARTITION.f_RECHARGE_INFO ('2019-09-01')

--根据分区编号查询表数据,CREATEDATE表示分区表的时间属性字段
select * from MEMBER_INFO where $PARTITION.f_MEMBER_INFO(CREATEDATE)=4
————————————————
版权声明:本文为CSDN博主「Honey66」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kexianjun66/article/details/101460179

czd890 | 园豆:8897 (大侠五级) | 2020-06-08 14:40

感谢回复,我换了一种提问方法。。。。

支持(0) 反对(0) Free.Wong | 园豆:20 (初学一级) | 2020-06-08 15:22
0

CREATE TABLE [dbo].[test] (
[id] int DEFAULT '' NOT NULL,
[create_datetime] datetime NOT NULL,
[create_year] AS (datepart(year,[create_datetime])) PERSISTED NULL
)
ON [PRIMARY]
GO

ALTER TABLE [dbo].[test] SET (LOCK_ESCALATION = TABLE)
GO

CREATE NONCLUSTERED INDEX [ix_test____create_year]
ON [dbo].[test] (
[create_year] ASC
)

insert into test (create_datetime) values ('2020-6-4'),('2020-6-8'),('2020-12-31'),('2021-5-8');
首先纠正错误你给的sql我做了调试才能运行的。

现在回答问题,既然用到了分区表想必也权衡好了利弊,单论两句sql而言
select id,create_datetime from test where create_year=2020;
肯定是建了索引的快,
两句sql本质其实就是在比较是计算函数快还是精确查询快,一个是在添加是做操作一个是在查询时做操作,结果肯定是
select id,create_datetime from test where create_year=2020;(快)
select * from test where year(create_datetime)=2020;(慢)
(ps:写sql尽量遵循用多少拿多少的原则,避免*的出现)

Java·小白 | 园豆:353 (菜鸟二级) | 2020-06-09 10:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册