zoukankan      html  css  js  c++  java
  • Oracle的聚簇也Hold不住了

           这两天在研究Oracle的Cluster,这里的Cluster不是聚簇索引的意思。Cluster是Oracle特有的一种数据存储方式,即把相关的数据存储在同一个数据块上,如果一组表有一些共同的列,则将这样的一些表存储在相同的数据块上,这样对于主外键这种连接操作,会起到减少I/O的作用。

          Oracle支持两种方式的Cluster,即Index Cluster和Hash Cluster。其实现的原理就是抛弃原始的B树的扫描阶段,尽可能快的定位到具体的数据页。这在Hash Cluster上展现的更为明显。在TPC-C测试中,Oralce的很多表都是建立在Hash Cluster上的,可见这种Cluster对性能的影响了。当然Oracle本身的一些系统表也是建立在Cluster上的。

           按理说这种Cluster应该很稳定了,可是经过我简单的测试,竟然发现了两个导致客户端断开连接的bug,这也太坑爹了吧,哥只想对甲骨文的测试人员说:少年,奋起吧!

           下面分别就两个bug进行阐述(关于簇的使用说明可以参考《Oracle9i10g编程艺术》)。

    • bug1:
    DROP CLUSTER CLUSTER_TEST1 INCLUDING TABLES;
    
    CREATE CLUSTER CLUSTER_TEST1(C1 INT , C2 INT SORT)
    HASHKEYS 11
    SIZE  1024
    HASH IS MOD(C1,2) + C2;
    
    CREATE TABLE CLUSTER_T1(C1 INT, C2 INT SORT) cluster CLUSTER_TEST1 (C1, C2);
    
    INSERT INTO CLUSTER_T1 VALUES(1,3);
    INSERT INTO CLUSTER_T1 VALUES(1,2);
    INSERT INTO CLUSTER_T1 VALUES(1,1);
    INSERT INTO CLUSTER_T1 VALUES(2,3);
    INSERT INTO CLUSTER_T1 VALUES(2,2);
    INSERT INTO CLUSTER_T1 VALUES(2,1);
    
    
    COMMIT;
    
    select c1,c2 from cluster_t1 where c1 =1 order by c2;
    
    
    SQL> select c1,c2 from cluster_t1 where c1 =1 order by c2;
    select c1,c2 from cluster_t1 where c1 =1 order by c2
    *
    第 1 行出现错误:
    ORA-03113: 通信通道的文件结束
    进程 ID: 6076
    会话 ID: 138 序列号: 51

          可以看到,哥的通信通道文件结束了。这和排序散列聚簇有关系,可以看见我的Hash函数中包含了排序列,同时我的查询语句的执行计划会使用一种针对排序散列聚簇才有的物理操作符。这大概是执行计划和Hash函数的矛盾导致的一个bug。

    • bug2:
    DROP CLUSTER CLUSTER_TEST1 INCLUDING TABLES;
    
    create cluster CLUSTER_TEST1 (   c1 number 
    , c2 number 
    , c3 number  SORT
    , c4 number SORT
        ) 
    hashkeys 176 
    hash is ( (c1 - 1) * 10 + c2 - 1 + c4) 
    size 1490 ;
     
      create table CLUSTER_T1 ( 
        o_id number  
    , o_w_id number 
    , o_d_id number 
    , o_c_id number 
    ) 
    cluster ordrcluster_queue ( 
        o_w_id 
    , o_d_id 
    , o_id);             
     
      
    SQL> INSERT INTO CLUSTER_T1 VALUES(1,1,1,1);
    INSERT INTO CLUSTER_T1 VALUES(1,1,1,1)
                *
    第 1 行出现错误:
    ORA-03113: 通信通道的文件结束
    进程 ID: 3708
    会话 ID: 135 序列号: 623

            这个导致了连接断开,当然还是SORT的原因,在建立CLUSTER_TEST1这个簇的时候,指定的列为4列,但是我在簇上建表CLUSTER_T1的时候,只指定了3列,竟然坑爹地可以创建成功,我嘞个去,第四列同时在Hash函数中,这就导致我插入数据时,Hash函数就范2了,这尼玛都没指定对应的第四个列,让Hash函数肿么计算Hash values啊…

         都是Sort Hash Cluster惹的祸啊,拜托测试部的大佬们工作的时候别再看小电影了,Oracle在哥心目中的地位又是微微一颤啊…

    踏着落叶,追寻着我的梦想。转载请注明出处
  • 相关阅读:
    android 防止按钮连续点击的方法(Button,ImageButton等)
    android listview 异步加载图片并防止错位
    Smart3D系列教程6之 《案例实战演练3——倾斜数据正射影像及DSM的生产》
    Smart3D系列教程5之 《案例实战演练2——大区域的地形三维重建》
    Smart3D系列教程4之 《案例实战演练1——小物件的照片三维重建》
    Smart3D系列教程3之 《论照片三维重建中Smart3D几个工作模块的功能意义》
    Smart3D系列教程2之 《为什么三维重建效果这么差?——探探那些被忽略的拍照要求和技巧》
    Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》
    如何通过倾斜摄影数据手动配置s3c索引文件?
    无人机倾斜摄影三维展示应该如此简单
  • 原文地址:https://www.cnblogs.com/nocode/p/2186718.html
Copyright © 2011-2022 走看看