12
返回列表 发新帖
楼主: wxhoracle

关于表空间,分区表的问题。请大家讨论!

[复制链接]
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:33秀才
日期:2016-03-24 09:10:24秀才
日期:2016-02-18 09:11:33秀才
日期:2016-01-25 14:55:312013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB元老
日期:2010-11-16 08:41:11ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51秀才
日期:2016-03-24 09:20:52
11#
 楼主| 发表于 2005-3-11 08:37 | 只看该作者

Re: 你的第一个问题也农呀

最初由 violing 发布
[B]我们需要把不同性质的表分到不同的表空间呀,比如有的表容易产生碎片,那最好把它单分出来更好 [/B]


如果表空间使用的是local类型,每个区统一大小的呢?好像没有这个问题哦!

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:33秀才
日期:2016-03-24 09:10:24秀才
日期:2016-02-18 09:11:33秀才
日期:2016-01-25 14:55:312013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB元老
日期:2010-11-16 08:41:11ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51秀才
日期:2016-03-24 09:20:52
12#
 楼主| 发表于 2005-3-11 08:46 | 只看该作者
最初由 xzh2000 发布
[B]2 分区表当然可以提高性能,测试你可以看偶的博客http://blog.itpub.net/post/96/11476 [/B]



SQL> select count(*)
  2   from test1
  3  where id = 1000
  4   and log_time between to_date('2004-11-01','yyyy-mm-dd') and to_date('2004-11-30 23:59:59','yyyy-mm-dd hh24:mi:ss');

  COUNT(*)
----------
        28

Elapsed: 00:00:00.01

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        393  bytes sent via SQL*Net to client
        508  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)

SQL> select count(*)
  2   from test2
  3  where id = 1000
  4   and log_time between to_date('2004-11-01','yyyy-mm-dd') and to_date('2004-11-30 23:59:59','yyyy-mm-dd hh24:mi:ss');

  COUNT(*)
----------
        28

Elapsed: 00:00:00.00

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

与分区字段组合查询时,分区表比非分区表有更好的性能优势
-----
test1是分区表,test2是非分区表,
从Elapsed: 的结果来看,这个好像你把结论弄反了吧。应该是非分区表比分区表有更好的性能优势。

consistent gets比较少
就一定说明性能高?

我觉得运行时间是判断性能好坏的一个比较好的指标。

使用道具 举报

回复
论坛徽章:
31
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
13#
发表于 2005-3-11 08:50 | 只看该作者
要性能提高
那么在查询时候必须带上分区字段
这是论坛上一位兄弟的例子
我也跟着做了的
确实如此
好好看下
create table test1(test_id number(9),id number(9),log_time date)
partition by range(log_time)
(partition t1_01 values less than (to_date('2004-02-01','yyyy-mm-dd')),
partition t1_02 values less than (to_date('2004-03-01','yyyy-mm-dd')),
partition t1_03 values less than (to_date('2004-04-01','yyyy-mm-dd')),
partition t1_04 values less than (to_date('2004-05-01','yyyy-mm-dd')),
partition t1_05 values less than (to_date('2004-06-01','yyyy-mm-dd')),
partition t1_06 values less than (to_date('2004-07-01','yyyy-mm-dd')),
partition t1_07 values less than (to_date('2004-08-01','yyyy-mm-dd')),
partition t1_08 values less than (to_date('2004-09-01','yyyy-mm-dd')),
partition t1_09 values less than (to_date('2004-10-01','yyyy-mm-dd')),
partition t1_10 values less than (to_date('2004-11-01','yyyy-mm-dd')),
partition t1_11 values less than (to_date('2004-12-01','yyyy-mm-dd')),
partition t1_12 values less than (to_date('2005-01-01','yyyy-mm-dd')));

create table test2(test_id number(9),id number(9),log_time date);

create sequence seq_t1;
create sequence seq_t2;


begin
  for i in 1 .. 1000 loop
   for j in 1 .. 12 loop
    for k in 1 .. 28 loop
       insert into test1 values(seq_t1.nextval,i,to_date('2004-'||to_char(j)||'-'||to_char(k),'yyyy-mm-dd'));
    end loop;
   end loop;
  end loop;
end;
/
begin
  for i in 1 .. 1000 loop
   for j in 1 .. 12 loop
    for k in 1 .. 28 loop
       insert into test2 values(seq_t2.nextval,i,to_date('2004-'||to_char(j)||'-'||to_char(k),'yyyy-mm-dd'));
    end loop;
   end loop;
  end loop;
end;
/

create index idx_test1_logtime on test1(log_time) local;
create index idx_test1_testid on test1(test_id) local;
create index idx_test1_id on test1(id) local;

create index idx_test2_logtime on test2(log_time);
create index idx_test2_testid on test2(test_id);
create index idx_test2_id on test2(id);


SQL> select count(*) from test1;
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       1104  consistent gets
        840  physical reads
          0  redo size
        301  bytes sent via SQL*Net to client
        495  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
         
         

SQL> select count(*) from test2;
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       1021  consistent gets
        164  physical reads
          0  redo size
        301  bytes sent via SQL*Net to client
        495  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
统计显示,分区表在全表扫描时将比非分区表需要更多的逻辑读

         
SQL> select count(*) from test1 where test_id = 1000;
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         24  consistent gets
         24  physical reads
          0  redo size
        300  bytes sent via SQL*Net to client
        495  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
         
         
SQL> select count(*) from test2 where test_id = 1000;
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          2  physical reads
          0  redo size
        300  bytes sent via SQL*Net to client
        495  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
在没有与分区字段组合查询时,分区表需要更多的逻辑读

                  
SQL> select count(*)
   from test1
  where id = 1000
   and log_time between to_date('2004-11-01','yyyy-mm-dd') and to_date('2004-
11-30 23:59:59','yyyy-mm-dd hh24:mi:ss');


Statistics
----------------------------------------------------------
         42  recursive calls
          0  db block gets
          7  consistent gets
          2  physical reads
          0  redo size
        300  bytes sent via SQL*Net to client
        495  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
         
SQL> select count(*)
   from test2
  where id = 1000
  and log_time between to_date('2004-11-01','yyyy-mm-dd') and to_date('2004-
11-30 23:59:59','yyyy-mm-dd hh24:mi:ss');

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         14  consistent gets
          2  physical reads
          0  redo size
        300  bytes sent via SQL*Net to client
        495  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 represent
logical I/O (ie memory accesses). Physical gets represent physical I/O

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2006-07-17 09:47:16
14#
发表于 2005-3-11 08:51 | 只看该作者

如果你的程序写的不好,LMT也救不了你的命

碎片照样不少,而如何使用分区表就看你自己的指导思想和理念了.我的分区最小用到过一分钟一分区,但这并不是为了提高查询速度,而且另有设计理念.SYBASE我也接触过,没有分区这个概念,所以只能分表,难受得很.我的设计的应用曾经用一个程序动态地创建新的分区并动态地删除旧的分区,程序很简单,但好用得很.对我的整体应用性能起到很大的作用,所以我建议要从多个角度考虑分区的应用,如果只考虑多个分区放在不到的地方然后想提高查询速度而不考虑与SQL如何紧密结合,那分区的意义就小了些,还不如不分.

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:33秀才
日期:2016-03-24 09:10:24秀才
日期:2016-02-18 09:11:33秀才
日期:2016-01-25 14:55:312013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB元老
日期:2010-11-16 08:41:11ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51秀才
日期:2016-03-24 09:20:52
15#
 楼主| 发表于 2005-3-11 08:53 | 只看该作者
看了大家对分区表性能的说法,好像只有在sql语句中指定分区才能得到显著的性能提高。如果是这样,指定分区也太麻烦点了吧。

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2006-07-17 09:47:16
16#
发表于 2005-3-11 08:58 | 只看该作者

不麻烦呀

如果你按天为分区,表中存一个月的数据,你在SQL中WHERE里指明几天内的范围的数据,SQL自然就到这几个天所在的分区中查询,而不会进行全表扫描.在SQL中指明分区是极少的情况,所以wxhoracle老弟你自己试一下就知道了

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:33秀才
日期:2016-03-24 09:10:24秀才
日期:2016-02-18 09:11:33秀才
日期:2016-01-25 14:55:312013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB元老
日期:2010-11-16 08:41:11ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51秀才
日期:2016-03-24 09:20:52
17#
 楼主| 发表于 2005-3-11 09:00 | 只看该作者
“如果你的程序写的不好,LMT也救不了你的命
碎片照样不少”
-------
对于表空间使用lmt方式而且分配方式是uniform size的。何来的碎片?
请解释。谢谢!

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:33秀才
日期:2016-03-24 09:10:24秀才
日期:2016-02-18 09:11:33秀才
日期:2016-01-25 14:55:312013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB元老
日期:2010-11-16 08:41:11ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51秀才
日期:2016-03-24 09:20:52
18#
 楼主| 发表于 2005-3-11 09:05 | 只看该作者

Re: 不麻烦呀

最初由 violing 发布
[B]如果你按天为分区,表中存一个月的数据,你在SQL中WHERE里指明几天内的范围的数据,SQL自然就到这几个天所在的分区中查询,而不会进行全表扫描.在SQL中指明分区是极少的情况,所以wxhoracle老弟你自己试一下就知道了 [/B]


这种方法跟在其字段上建立索引还能得到更高的性能!呵呵。(除了管理方便外!)

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2006-07-17 09:47:16
19#
发表于 2005-3-11 09:53 | 只看该作者

所以分区表处理数据量大的表更有用.

我现在的数据一天至少几千万入库后还得进行各种计算,不用分区表我死定了.就是用了分区表我都差点死定了,因为我建了分区索引,当这个分区数据量超过2000万插数速度极慢,所以我只好将分区划小.如果你的数据量一共才千八百万,你用不用分区无所谓.还不够麻烦的呢!
LMT说得是不错,可如果你大量的删除更新,不信你自己试几个月,碎片少才怪呢!所以我们的方法是从实践中来,到实践中去,ORACLE说的东西也得经过检验,你只信他结果出了问题最后自己认倒楣,问题的关键是LMT可以大量减少碎片而并没说不会产生碎片,这一点要注意

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表