在同一块磁盘上作分区表有意义么?

xyzhh 2006-07-05 02:50:40
如果把一张大表的数据分散到各个磁盘上做一个分区表是能增强它的i/o;
但是现在我们往往将几个磁盘做成一个raid,表已经分散到各个磁盘上了。从操作系统上来看,它是一整块磁盘,这个时候如果我们在上面将表做成分区表还有意义么?如果有,那么他将怎样提升哪一块儿的性能?
...全文
384 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyzhh 2006-07-17
  • 打赏
  • 举报
回复
怎样才算用上了分区?
vc555 2006-07-14
  • 打赏
  • 举报
回复
你的第一个执行计划怎么看不出用上了分区?
xyzhh 2006-07-14
  • 打赏
  • 举报
回复
我做的实验,好像大部分都是未分区的表快。难道分区仅仅只是维护方便么?
xyzhh 2006-07-13
  • 打赏
  • 举报
回复
顶!
xyzhh 2006-07-11
  • 打赏
  • 举报
回复
看一下我对两张表跟踪的例子:
dvd_list_new:一张普通的表
dvd_list_part:一张按月分区的表(索引未分区)
两张表数据都一样,都是使用insert into .. select * from ....,这样防止碎片。


执行
select count(*) from dvd_list_part where time>'20060601000000' and time <'20060631000000';
结果

COUNT(*)
----------
2149656

Elapsed: 00:00:01.11

Execution Plan
----------------------------------------------------------
Plan hash value: 3756034816

-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 7822 (2)| 00:01:34 |
| 1 | SORT AGGREGATE | | 1 | 15 | | |
|* 2 | INDEX FAST FULL SCAN| INDEX_TIME_PART | 2141K| 30M| 7822 (2)| 00:01:34 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("TIME"<'20060631000000' AND "TIME">'20060601000000')


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
35238 consistent gets
0 physical reads
0 redo size
518 bytes sent via SQL*Net to client
468 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed





执行
select count(*) from dvd_list_new where time>'20060601000000' and time <'20060631000000';
结果
COUNT(*)
----------
2149656

Elapsed: 00:00:00.82

Execution Plan
----------------------------------------------------------
Plan hash value: 2838380510

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 5100 (2)| 00:01:02 |
| 1 | SORT AGGREGATE | | 1 | 15 | | |
|* 2 | INDEX FAST FULL SCAN| INDEX_TIME_NEW | 2126K| 30M| 5100 (2)| 00:01:02 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("TIME">'20060601000000' AND "TIME"<'20060631000000')


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
24143 consistent gets
0 physical reads
0 redo size
518 bytes sent via SQL*Net to client
468 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


可以看到分区表的逻辑读('consistent gets' + 'db block gets')比未分区的多得多。这样只能得出一个结论,就是分区后要慢。
为什么?
多壮志 2006-07-11
  • 打赏
  • 举报
回复
笨猫一只说的是没有错的.. r5通常是存储性能、数据安全和存储成本兼顾的存储解决方案..你无法指定分区放再哪个磁盘..因为这个方案不提供这个..
分区的本意就是在于可以缩小查询范围,,对没个范围的数据进行单独管理..这个就是分区的目的..
所以他们是可以提高效率的..
xyzhh 2006-07-11
  • 打赏
  • 举报
回复
那么分区该怎么考率呢?不要简单地告诉我“分区比较快,因为只在某个区查询”。我想知道他在什么情况下快,为什么会比索引快。从原理上考虑!
fjmingyang 2006-07-07
  • 打赏
  • 举报
回复
索引也是可以分区的
goldarcher2005 2006-07-07
  • 打赏
  • 举报
回复
分区和分磁盘是2件事,从2个角度考虑
xyzhh 2006-07-06
  • 打赏
  • 举报
回复
可是如果我们使用索引的话,也不是查询所有的数据块,而是根据索引只查其中的一部分。
在你决定在哪个分区前,还需要判断数据是否在[a,b]之内。这和在索引的B树上走两个节点不会有太多的时间差别吧。
xiaoxiao1984 2006-07-05
  • 打赏
  • 举报
回复
补充一下:查询 [a,b]之间的数据的时候只查询分区1
xiaoxiao1984 2006-07-05
  • 打赏
  • 举报
回复
分区还可以提高查询的性能,例如分区的时候定义的时 [a,b]之间的数据在分区1上,那么在查询的时候只会查询分区1上的数据,而不会查询其他分区

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧