达梦函数索引&网关密文索引机制测试&虚拟列测试


### Code Reference
  • URL:p119(函数索引) DM8 系统管理员手册 p189(explain sql)
  • DESC:达梦函数索引&网关密文索引机制测试&虚拟列测试
  • Last Update:2020-7-2 19:30
    • 测试表加密

      • 创建测试表
          create table test1.tab_index_100W as 
          select rownum as id,
                 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as 办卡日期,
                 trunc(18510911437-dbms_random.value(-100000, 100000)) as 电话号码,
                 'TDE' || dbms_random.string('x', 20) 身份证号,
                 'TDE' || dbms_random.string('x', 15) 银行卡号
            from dual
          connect by level <= 1000000;
          alter table "TEST1"."TAB_INDEX_100W" add primary key("ID");                
        
      • 加密并授权
      • 查询测试(全表扫描)

        10.727s

        select * from TEST1.TAB_INDEX_100W T where T.电话号码 = 18510911417

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nqWCrDQ-1593710451660)(http://redevm/uploads/big/5227b791e14a28fed52b75eda5c7ee72.png)]
    • 哈希值&索引测试

      • 增加哈希特征列&初始化特征值

        • 哈希算法

            SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW('oracle'))
            封装系统自带的摘要算法为确定函数
            create or replace function test1."fun_md5"(pvb_str varchar2(1000))
              return varbinary(1000) deterministic as
            begin
              return SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW(pvb_str));
            end;
          
        • 增加摘要列

            alter table "TEST1"."SS_ENC_TAB_1d9druqb54d" add column("hashValue" VARBINARY(100));
          
        • 初始化摘要值

            update "TEST1"."SS_ENC_TAB_1d9druqb54d" set "hashValue"=SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW(身份证号))
          
        • 创建普通索引

            create index idx_hash on "TEST1"."SS_ENC_TAB_1d9druqb54d" ("hashValue")
          
        • 创建函数索引

            drop index "TEST1".idx_funhash;
            create index idx_funhash on "TEST1"."SS_ENC_TAB_1d9druqb54d"(test1."fun_md5"(身份证号));
            函数索引表达式包含有非法的列类型、不确定性函数、非静态方法或集函数
            (封装函数后无法正常创建)
          
        • 虚拟列

            alter table "TEST1"."SS_ENC_TAB_1d9druqb54d" add column("virtualHash" varbinary(100) as (test1."fun_md5"(身份证号)));
            函数不能确定(封装函数后正常创建)     
          
      • 测试使用不同的查询方式的性能差异&执行计划

        • 使用主键(1)
            explain 
            select * from "TEST1"."SS_ENC_TAB_1d9druqb54d" 
            where ID in (251846,533081,533530,564719);                            
          
        • 使用明文,未建索引(2)
            explain 
            select * from "TEST1"."SS_ENC_TAB_1d9druqb54d" 
            where 身份证号 IN(
            'TDE64BWJOD0Q2O9GD6M9GL0'
            ,'TDEFTYV4YR5QSL5657CD4NY'
            ,'TDEALCXOJUJITGOQESIYK6L'
            ,'TDEKNNET2QSO3X6047M95JJ'
            )            
          
        • 使用哈希列(3)
            explain 
            select * from "TEST1"."SS_ENC_TAB_1d9druqb54d" 
            where "hashValue" in (
            SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW('TDE64BWJOD0Q2O9GD6M9GL0')),
            SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW('TDEFTYV4YR5QSL5657CD4NY')),
            SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW('TDEALCXOJUJITGOQESIYK6L')),
            SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(utl_raw.CAST_TO_RAW('TDEQVQHEEKE8223NHHIN41V'))
            );
            执行很慢,在虚拟列创建索引,报和函数索引相同错误。
            explain 
            select * from "TEST1"."SS_ENC_TAB_1d9druqb54d" 
            where "virtualHash" in (
            test1."fun_md5"(utl_raw.CAST_TO_RAW('TDE64BWJOD0Q2O9GD6M9GL0')),
            test1."fun_md5"(utl_raw.CAST_TO_RAW('TDEFTYV4YR5QSL5657CD4NY')),
            test1."fun_md5"(utl_raw.CAST_TO_RAW('TDEALCXOJUJITGOQESIYK6L')),
            test1."fun_md5"(utl_raw.CAST_TO_RAW('TDEQVQHEEKE8223NHHIN41V'))
            );                                            
          
        • 使用哈希列计算出的值(2)
            explain 
            select * from "TEST1"."SS_ENC_TAB_1d9druqb54d" 
            where "hashValue" in (
             '0x3ADF273B01AAC189DF86F6C476DFAB9F'
            ,'0x512862544080D8845E370FDFF31C38E7'
            ,'0x2DDC00C337BAA23088D22D8278E238C3'
            ,'0x4FCBD80BE2D4373930773694355C63B3'
            );
          

你可能感兴趣的:(dameng)