[bbk2900] 第56集 - Chapter 14-Using 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)>>

posted @ 2013-05-09 13:34  ArcerZhang  阅读(237)  评论(0编辑  收藏  举报