知识大全 如何高效online创建大表的索引
Posted 时间
篇首语:第一个青春是上帝给的;第二个的青春是靠自己努力的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何高效online创建大表的索引相关的知识,希望对你有一定的参考价值。
Microsoft Windows [版本 ]
(C) 版权所有 Microsoft Corp
C:\\Documents and Settings\\Administrator>systeminfo
主机名: ORACLETEST
OS 名称: Microsoft(R) Windows(R) Server Enterprise Edition
OS 版本: Service Pack Build
系统类型: X based PC
处理器: 安装了 个处理器
[ ]: x Family Model Stepping GenuineIntel ~ Mhz
[ ]: x Family Model Stepping GenuineIntel ~ Mhz
物理内存总量: MB
可用的物理内存: MB
页面文件: 最大值: MB
页面文件: 可用: MB
页面文件: 使用中: MB
页面文件位置: c:\\pagefile sys
d:\\pagefile sys
e:\\pagefile sys
f:\\pagefile sys
环境其实就是一台很普通的PC机
双核的CPU+ G内存
G的表
W row的量
目的:测试如何以最快的方式online建立索引
C:\\Documents and Settings\\Administrator>sqlplus sys@FUTEST_ as sysdba
SQL*Plus: Release Production on 星期五 月 : :
Copyright (c) Oracle All rights reserved
输入口令:
连接到:
Oracle Database g Enterprise Edition Release Production
With the Partitioning OLAP Data Mining and Real Application Testing options
SYS TEST SQL> set linesize
SYS TEST SQL> set timing on
SYS TEST SQL> set autot on
SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_retained_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set db_file_multiblock_read_count= ;
会话已更改
已用时间: : :
SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;
索引已创建
已用时间: : :
SYS TEST SQL>
上面的测试用了 分钟
对比下面的测试很晕
设置的参数为
sort_area_size= ;
sort_area_retained_size= ;
db_file_multiblock_read_count= ;
还有并行系数
查看当前的并行状况
select decode(a QCSERIAL# null PARENT CHILD ) stmt_level
a SID
a SERIAL#
b USERNAME
b OSUSER
b SQL_HASH_VALUE
b SQL_ADDRESS
a DEGREE
a REQ_DEGREE
from v$px_session a v$session b
where a SID = b SID
order by a QCSID stmt_level desc;
C:\\Documents and Settings\\Administrator>sqlplus sys@futest_ as sysdba
SQL*Plus: Release Production on 星期一 月 : :
Copyright (c) Oracle All rights reserved
输入口令:
连接到:
Oracle Database g Enterprise Edition Release Production
With the Partitioning OLAP Data Mining and Real Application Testing options
SYS TEST SQL> set timing on
SYS TEST SQL> set linesize on
SP : linesize 选项的编号无效
SYS TEST SQL> set linesize
SYS TEST SQL> set autot on
SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;
索引已创建
已用时间: : :
什么都不设置的情况下 仅仅是online+nologging 才耗用了 分钟 当然 这是测试环境 整个DB没有模拟生产压力的
SYS TEST SQL> drop index IX_ALOTPRM_MTRL_LOT_ID;
索引已删除
已用时间: : :
SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_retained_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set db_file_multiblock_read_count= ;
会话已更改
已用时间: : :
SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;
索引已创建
已用时间: : :
这次又用了 分钟
sort_area_size= ;
sort_area_retained_size= ;
db_file_multiblock_read_count= ;
并行系数 ;
这测试结果太不稳定了 如果只要 分钟的话 !那直接用就是了 还整这么费劲干啥?
咳咳 多测试几次吧 刨根问底~
SYS TEST SQL> drop index IX_ALOTPRM_MTRL_LOT_ID;
索引已删除
我决定drop掉INDEX 然后回收tablespace再测试一次
SYS TEST SQL> select sum(bytes)/ / / sumbytes
from dba_extents a
where tablespace_name= USERS
/
SUMBYTES
SYS TEST SQL> select name round(to_number(bytes/ / / ) ) as bytes from v$datafile;
NAME BYTES
E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_SYSTEM
_ TJTP GN_ DBF
E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_UNDOTB
S _ TJTP L _ DBF
E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_SYSAUX
_ TJTP J _ DBF
E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_USERS_
TJTP L _ DBF
NAME BYTES
E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_EXAMPL
E_ TJTR PY_ DBF
收缩之~
SYS TEST SQL> ALTER DATABASE DATAFILE E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_USERS_ TJTP L _ DBF
RESIZE M;
数据库已更改
接着继续~
我想了想 会不会与这个测试DB的内存分配有关系?
SYS TEST SQL> show sga
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
SYS TEST SQL> show parameter pga
NAME TYPE VALUE
pga_aggregate_target big integer M
SYS TEST SQL>
把参数改小点
M+ DB_file_multiblock_read_count+并行
sort_area_size= ;
sort_area_retained_size= ;
db_file_multiblock_read_count= ;
还有并行系数
把DB的内存分配得稍微大一点
SYS TEST SQL> show sga
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
SYS TEST SQL> show parameter sga
NAME TYPE VALUE
lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer M
sga_target big integer M
SYS TEST SQL> show parameter pga
SYS TEST SQL> CREATE INDEX FU_DB IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;
索引已创建
已用时间: : :
搞来搞去 还是整了 分钟
再来一次 不并行看看如何~
sort_area_size= ;
sort_area_retained_size= ;
db_file_multiblock_read_count= ;
SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set sort_area_retained_size= ;
会话已更改
已用时间: : :
SYS TEST SQL> alter session set db_file_multiblock_read_count= ;
会话已更改
已用时间: : :
SYS TEST SQL> CREATE INDEX FU_DB IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;
索引已创建
已用时间: : :
再多测一次 再去吃饭
删索引
回收tablespace
总结一下
我很晕了 为什么不并行反而更快?
我估计和具体的场景 硬件条件 系统并发负载 还是有所联系 不然大牛们一直都说大表建索引 必须
session级别增大sort_area_size + nologging + 并行
看样子 过段时间 找台 CPU的 再试试吧
条件 时间
手动 G+Multi block read count +并行
workarea_size_policy=MANUAL;
alter session set sort_area_size= ;
alter session set sort_area_retained_size= ; : :
alter session set db_file_multiblock_read_count= ;
parallel(degree ) ONLINE NOLOGGING;
啥事不干直接建
CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID
on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING; : :
我手多 又测试了一遍第一种情况
workarea_size_policy=MANUAL;
alter session set sort_area_size= ;
alter session set sort_area_retained_size= ; : :
alter session set db_file_multiblock_read_count= ;
parallel(degree ) ONLINE NOLOGGING;
手动 M+Multi block read count +并行
workarea_size_policy=MANUAL;
sort_area_size= ;
sort_area_retained_size= ; : :
db_file_multiblock_read_count= ;
parallel(degree ) ONLINE NOLOGGING;
手动 M+Multi block read count +无并行 试试
workarea_size_policy=MANUAL;
sort_area_size= ;
sort_area_retained_size= ; : :
db_file_multiblock_read_count= ;
无并行
再来一次手动 M+Multi block read count +无并行
workarea_size_policy=MANUAL;
sort_area_size= ;
sort_area_retained_size= ; : :
db_file_multiblock_read_count= ;
无并行
再来一次啥事不干直接建
CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID
on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING; : :
若是不并行的话 Process 里会看到一个 CPU使用蛮高的TID 而且只有一个核在激烈的WORK
若是并行的话 这里会看到好几个PID在work
cha138/Article/program/Oracle/201311/17238
相关参考
问我发现sysindexes索引表中的很多条目并不是我自己创建的听说它们并不是真正的索引而是SQLServer查询优化器自动创建的统计怎样才能识别哪些是真正的索引哪些是SQLServer自动创建的
有些新手在Oracle数据库中创建索引时往往不会使用可选项其实有时候在合适的场合使用一些可选项可以提高索引的创建速度如为了大批量导入数据我们往往会先取消索引其以提高插入的速度然后等数据导入完毕后再
高性能MySQL:快速创建MyISAM索引 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 快速创
SQLSERVER创建索引实现代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz
知识大全 当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
当我正在为表建立索引的时候,SQLServer会禁止对表的访问吗? 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一
关于Sphinx创建全文检索的索引介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 全文检索的
在Oracle中合理创建数据库的索引 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Oracl
一次操作创建多个对象一个不成功则全部不成功 第一步创建用户 createuseraa identifiedbyaa defaulttablespaceusers
知识大全 阻止保存要求重新创建表的更改 sqlserver 2008
当用户在在SQLServer企业管理器中更改表结构时必须要先删除原来的表 然后重新创建新表才能完成表的更改如果强行更改会出现以下提示不允许保存更改 您所做的更改要求删除并重新创建以下表您对无法
分块查找 分块查找(BlockingSearch)又称索引顺序查找它是一种性能介于顺序查找和二分查找之间的查找方法 二分查找表存储结构 二分查找表由分块有序的线性表和索引表组成 ()分块有