zoukankan      html  css  js  c++  java
  • [bbk2900] 第56集 Chapter 14Using Oracle Dasta Storage Structures Efficiently(02)

    Hash Clustered Tables

    Hash Clustered Table的设计目的就是减少I/O的次数,如果设计不当(一般因为size大小设置问题) 导致overflow blocks ,无疑会增大I/O的次数,造成事倍功半.

    create hash clustered table and show it space info
    [oracle@arcerzhang usefull_scripts]$ ll
    total 4
    -rw-r--r-- 1 oracle oinstall 3642 May  9 12:45 show_space.sql
    [oracle@arcerzhang usefull_scripts]$ sqlplus sys/oracle as sysdba
    
    SQL*Plus: Release 11.2.0.1.0 Production on Thu May 9 12:46:35 2013
    
    Copyright (c) 1982, 2009, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> !pwd
    /RealData/oracle/scripts/usefull_scripts
    
    SQL> @show_space.sql
    
    Procedure created.
    
    SQL> set serverout on
    SQL> exec show_space('HC','U3','CLUSTER');
    Unformatted Blocks .....................               0
    FS1 Blocks (0-25) ......................               0
    FS2 Blocks (25-50) .....................               0
    FS3 Blocks (50-75) .....................               0
    FS4 Blocks (75-100).....................               0
    Full Blocks ............................           1,009
    Total Blocks............................           1,152
    Total Bytes.............................       9,437,184
    Total MBytes............................               9
    Unused Blocks...........................             117
    Unused Bytes............................         958,464
    Last Used Ext FileId....................               7
    Last Used Ext BlockId...................           1,152
    Last Used Block.........................              11
    
    PL/SQL procedure successfully completed.
    show_space脚本源码-tom大师
    create or replace procedure show_space
    ( p_segname in varchar2,
    p_owner in varchar2 default user,
    p_type in varchar2 default 'TABLE',
    p_partition in varchar2 default NULL )
    -- this procedure uses authid current user so it can query DBA_*
    -- views using privileges from a ROLE and so it can be installed
    -- once per database, instead of once per user that wants to use it
    authid current_user
    as
    l_free_blks number;
    l_total_blocks number;
    l_total_bytes number;
    l_unused_blocks number;
    l_unused_bytes number;
    l_LastUsedExtFileId number;
    l_LastUsedExtBlockId number;
    l_LAST_USED_BLOCK number;
    l_segment_space_mgmt varchar2(255);
    l_unformatted_blocks number;
    l_unformatted_bytes number;
    l_fs1_blocks number; l_fs1_bytes number;
    l_fs2_blocks number; l_fs2_bytes number;
    l_fs3_blocks number; l_fs3_bytes number;
    l_fs4_blocks number; l_fs4_bytes number;
    l_full_blocks number; l_full_bytes number;
    -- inline procedure to print out numbers nicely formatted
    -- with a simple label
    procedure p( p_label in varchar2, p_num in number )
    is
    begin
    dbms_output.put_line( rpad(p_label,40,'.') ||
    to_char(p_num,'999,999,999,999') );
    end;
    begin
    -- this query is executed dynamically in order to allow this procedure
    -- to be created by a user who has access to DBA_SEGMENTS/TABLESPACES
    -- via a role as is customary.
    -- NOTE: at runtime, the invoker MUST have access to these two
    -- views!
    -- this query determines if the object is an ASSM object or not
    begin
    execute immediate
    'select ts.segment_space_management
    from dba_segments seg, dba_tablespaces ts
    where seg.segment_name = :p_segname
    and (:p_partition is null or
    seg.partition_name = :p_partition)
    and seg.owner = :p_owner
    and seg.tablespace_name = ts.tablespace_name'
    into l_segment_space_mgmt
    using p_segname, p_partition, p_partition, p_owner;
    exception
    when too_many_rows then
    dbms_output.put_line
    ( 'This must be a partitioned table, use p_partition => ');
    return;
    end;
    -- if the object is in an ASSM tablespace, we must use this API
    -- call to get space information, else we use the FREE_BLOCKS
    -- API for the user managed segments
    if l_segment_space_mgmt = 'AUTO'
    then
    dbms_space.space_usage
    ( p_owner, p_segname, p_type, l_unformatted_blocks,
    l_unformatted_bytes, l_fs1_blocks, l_fs1_bytes,
    l_fs2_blocks, l_fs2_bytes, l_fs3_blocks, l_fs3_bytes,
    l_fs4_blocks, l_fs4_bytes, l_full_blocks, l_full_bytes, p_partition);
    p( 'Unformatted Blocks ', l_unformatted_blocks );
    p( 'FS1 Blocks (0-25) ', l_fs1_blocks );
    p( 'FS2 Blocks (25-50) ', l_fs2_blocks );
    p( 'FS3 Blocks (50-75) ', l_fs3_blocks );
    p( 'FS4 Blocks (75-100)', l_fs4_blocks );
    p( 'Full Blocks ', l_full_blocks );
    else
    dbms_space.free_blocks(
    segment_owner => p_owner,
    segment_name => p_segname,
    segment_type => p_type,
    freelist_group_id => 0,
    free_blks => l_free_blks);
    p( 'Free Blocks', l_free_blks );
    end if;
    -- and then the unused space API call to get the rest of the
    -- information
    dbms_space.unused_space
    ( segment_owner => p_owner,
    segment_name => p_segname,
    segment_type => p_type,
    partition_name => p_partition,
    total_blocks => l_total_blocks,
    total_bytes => l_total_bytes,
    unused_blocks => l_unused_blocks,
    unused_bytes => l_unused_bytes,
    LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
    LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
    LAST_USED_BLOCK => l_LAST_USED_BLOCK );
    p( 'Total Blocks', l_total_blocks );
    p( 'Total Bytes', l_total_bytes );
    p( 'Total MBytes', trunc(l_total_bytes/1024/1024) );
    p( 'Unused Blocks', l_unused_blocks );
    p( 'Unused Bytes', l_unused_bytes );
    p( 'Last Used Ext FileId', l_LastUsedExtFileId );
    p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
    p( 'Last Used Block', l_LAST_USED_BLOCK );
    end;
    /

    Where Hash is useful

    Hashing is useful when you have the following conditions:

    • Most Queries are equality queries on the cluster key:

    SELECT ... WHERE cluster_key = ...;

    In such cases,the cluster key in the equality condition is hashed,and the corresponding  hash key is usually found with a single read.In comparision,for an indexed table the key  value must first be found in the index(usually serveral reads),and then the row is read from the table(another read).

    • The tables in the hash cluster  are primarily static in size so that you can determine the number of rows and amount of space required for the tables in the cluster.If tables in a hash cluster require more space than the initial allocation  for the cluster,performance degradation can be substantial because overflow blocks are required. 

    When to Use Clusters

    Criterion(规则) Index Hash
    Uniform Key distribution Y Y
    Evenly distribution key values   Y
    Rarely(罕见的) updated key Y Y
    Often joined master-deatil tables Y  
    Predicatable number of key values   Y
    Queries using equality predicate on key   Y

    有关Cluster相关资料,可以查阅书籍

    <<Expert Oracle Database Architecture Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions >>

    <<Oracle® Database Administrator's Guide 11g Release 2 (11.2)>>

  • 相关阅读:
    lua判断字符串包含另一个字符串
    expect使用技巧
    Linux expect
    expect正则捕获返回结果
    修改alpine Linux的Docker容器的时区
    Dockerfile镜像优化,减小镜像
    Sed在匹配行前后加入一行
    scp的使用以及cp的对比
    rsync 的用法
    傅里叶系列(一)傅里叶级数的推导 (转)
  • 原文地址:https://www.cnblogs.com/arcer/p/3068798.html
Copyright © 2011-2022 走看看