导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

表分区的问题, 求助?

zhaixing0101 2008-01-03 05:22:56
在2005下, 要对表进行分区
因表中只保留一个月的数据, 数据我想按天对数据分区, 分区列为日期型,

帮助中说, boundary_value 是可以引用变量的常量表达式。这包括用户定义类型变量,或函数以及用户定义函数。它不能引用 Transact-SQL 表达式。
这样写法通不过
create partition function DatePartition (datetime)
as
declare @t Datetime
range left for values
(Datepart(dd,@t) =1, Datepart(dd,@t) =2,...Datepart(dd,@t) =31)

向高手求助!

...全文
272 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
关于查询的问题, 由于表中只有一个月的数据, 所以按日期查询, 实质是按天查询, 所以按天分区是有效的.
------------------------------------------------------------------------------------------>
这个如何理解, 按代表天数的列 分区, 但查询条件是另一列,按具体时间的列, 是怎知道数据分在哪个分区的?
是否需要将这两列做为一个组合索引?
---------------
你要做一个简单的转换

比如查询 2007-12-7 至 2008-1-2

那你实际上把查询条件变成(Days是分区列,也是日期字段的计算列)
WHERE Days >=7 OR Days <=2

因为表中只有一个月数据, 所以理论上上述查询不会导致岐义
或者再日期列上建立一个索引, 再加前面 Days 条件的基础上加日期限制, 这样就万无一失了
回复
w2jc 2008-01-08
当前服务器8CPU, 由于数据每天多时近千万, 所以考虑对表进行分区.
--------------------------------------------
有没有用磁盘阵列?如果有的话,磁盘阵列本身就把I/O分配到不同的硬盘上。

如果你的查询就跨越很多天的,那么按天分区,并且这些分区在不同物理硬盘上,那才能把I/O分布到不同硬盘。
如果查询还是在一天内的很多记录,那么还是在一个分区上读数据。
回复
zhaixing0101 2008-01-07
关于查询的问题, 由于表中只有一个月的数据, 所以按日期查询, 实质是按天查询, 所以按天分区是有效的.
------------------------------------------------------------------------------------------>
这个如何理解, 按代表天数的列 分区, 但查询条件是另一列,按具体时间的列, 是怎知道数据分在哪个分区的?
是否需要将这两列做为一个组合索引?

当前服务器8CPU, 由于数据每天多时近千万, 所以考虑对表进行分区.
回复
LIHY70 2008-01-06
学习
回复
pt1314917 2008-01-06
老大讲解的好清楚``
回复
liangCK 2008-01-05
钻钻钻..学习..
回复
关于查询的问题, 由于表中只有一个月的数据, 所以按日期查询, 实质是按天查询, 所以按天分区是有效的.


不过, 数据量大, 服务器有多个CPU和多个物理磁盘, 才能做到并行I/O, 这样使用分区表才有重大效率提升
回复
其实楼主的数据既然只有一个月, 然后按天分区, 那直接用天做分区列就行了, 没必要使用日期
而天最多就 31 天, 所以很容易写
参考下面的示例

USE tempdb
GO

-- 分区函数
CREATE PARTITION FUNCTION PF_Day(int)
AS
RANGE LEFT FOR VALUES(
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
)
GO

-- 分区架构
CREATE PARTITION SCHEME PS_Day
AS PARTITION PF_Day
ALL TO( -- 根据实际情况调整, 最好是将不同的分区存储到不同的文件组(这些文件组中的文件最好是在不同的物理磁盘上)
[PRIMARY])
GO

-- 使用上述分区架构的表
CREATE TABLE dbo.tb(
InDate datetime, -- 日期列
Days as DAY(InDate) -- 通过日期列计算出来的天, 做为分区列
PERSISTED
)ON PS_Day(Days)

SELECT * FROM dbo.tb
GO

DROP TABLE dbo.tb
DROP PARTITION SCHEME PS_Day
DROP PARTITION FUNCTION PF_Day
回复
分区表是在数据存储层去做的, 所以不可用用一个可能会随时变化的值去决定分区边界和分区数


"以引用变量的常量表达式" 是指定义的时候引用去计算出 value, 而不是说在分区函数里面可以定义和引用, 这是有差异的
回复
yudi010 2008-01-05
惭愧
我连分区怎么会使都没有明白
那位高人给解释一下分区
回复
duanzhi1984 2008-01-05
学习,学习,分区表和分区视图3有什么区别~~~
还要学习之
回复
tushadongjing 2008-01-05
學習
回复
dawugui 2008-01-05
对一个表进行分区实在没必要.
回复
w2jc 2008-01-05
在2005下, 要对表进行分区
因表中只保留一个月的数据, 数据我想按天对数据分区, 分区列为日期型,
----------------------------------------
每天的数据量有多少?因为你只保存一个月的数据,按天对数据分区的话,感觉划分太小。

而且还有个问题,你的分区函数如果按天划分的话,最后是每个月1号的数据在一个分区,
你会有31个分区... 这些分区打算放在什么地方? 如果放在一个磁盘上的话,也不能提高性能。

分区的主要用途有两个:
1)将数据分布到多个物理硬盘上,充分利用I/O,提高性能(此为横向分区,但其实没有磁盘阵列好,个人觉得没什么用处)
2)将非常大的表切割成多个段,便于备份和恢复(此为纵向分区,这个用法比较实际一些)

看不出LZ要按天分区能带来的好处......
回复
changjiangzhibin 2008-01-04
up
回复
zhaixing0101 2008-01-04
再加100, 求助!
回复
zhaixing0101 2008-01-03
另:
若换方式, 增加一个代表天数的列(int 型 1->31),按此来分区, 但查询要按日期型列来查, 分区还有效果吗?
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告