土嘎嘎的粉丝们大家好:这个死锁没办法完全避免,尽量的话在做事物提交的时候,提交完成后在进行其余的同一个表的操作,再就是insert、update等操作尽量能减少就减少.其实正常情况下是很少出现死锁的.
第一段: 磁盘方面调优
① 规范磁盘阵列
分离下面的东西,避免磁盘竞争
SYSTEM表空间
TEMPORARY表空间
UNDO表空间
联机重做日志(放在最快的磁盘上)
操作系统磁盘
ORACLE安装目录
经常被访问的数据文件
索引表空间
归档区域(应该总是与将要恢复的数据分离)
例:
通过下列语句查询确定IO问题
select name ,phyrds,phywrts,readtim,writetim
from v$filestat a,v$datafile b
where a.file#=b.file# order by readtim desc;
u 增大日志文件的大小,从而增加处理大型INSERT,DELETE,UPDATE操作的比例
查询日志文件状态
select a.member,b.* from v$logfile a,v$log b where a.GROUP#=b.GROUP#
查询日志切换时间
from v$log_history a ,v$log_history b
where a.RECID=b.RECID+1
order by a.FIRST_TIME desc
增大日志文件大小,以及对每组增加日志文件(一个主文件、一个多路利用文件)
u 增大LOG_CHECKPOINT_INTERVAL参数,现已不提倡使用它
如果低于每半小时切换一次日志,就增大联机重做日志大小.如果处理大型批处理任务时频繁进行切换,就增大联机重做日志数目.
alter database add logfile member '/log.ora' to group 1;
alter database drop logfile member '/log.ora';
修改三个初始参数:
UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=CLOUDSEA_UNDO
UNDO_RETENTION=#of minutes
第二段: 初始化参数调优
① 重要初始化参数
l SGA_MAX_SIZE
l SGA_TARGET
l PGA_AGGREGATE_TARGET
l DB_CACHE_SIZE
l SHARED_POOL_SIZE
它设定了用来存储和处理内存中数据的SGA区域大小,从内存中取数据比磁盘快10000倍以上
根据以下查询出数据缓存命中率
select sum(decode(name,'physical reads',value,0)) phys,
sum(decode(name,'db block gets',value,0)) gets,
sum(decode(name,'consistent gets',value,0)) con_gets,
(1- (sum(decode(name,'physical reads',value,0))/(sum(decode(name,'db block gets',value,0))+sum(decode(name,'consistent gets',value,0)) ) ))*100 Hitratio
from v$sysstat;
在调整DB_CACHE_SIZE时使用V$DB_CACHE_ADVICE
select size_for_estimate, estd_physical_read_factor, estd_physical_reads
from v$db_cache_advice
where name = 'DEFAULT';
如果查询的命中率过低,说明缺少索引或者索引受到限制,通过V$SQLAREA视图查询执行缓慢的SQL
正确地调整此参数可以同等可能地共享SQL语句,使得在内存中便能找到使用过的SQL语句.为了减少硬解析次数,优化对共享SQL区域的使用,需尽量使用存储过程、使用绑定变量
select ((1- sum(getmisses)/(sum(gets)+sum(getmisses)))*100) hitratio
from v$rowcache
where gets+getmisses 0;
SELECT SUM(PINS) "EXECUTIONS",SUM(RELOADS) "CACHE MISSES WHILE EXECUTING",1 - SUM(RELOADS)/SUM(PINS)
FROM V$LIBRARYCACHE;
第三段: SQL调优1. 使用提示
①1 改变执行路径
通过OPTIMIZER_MODE参数指定优化器使用方法,默认ALL_ROWS
ALL_ROWS 可得最佳吞吐量执行查询所有行
FIRST_ROWS(n) 可使优化器最快检索出第一行:
select /*+ FIRST_ROWS(1) */ store_id,... from tbl_store
允许开发人员改变访问的实际查询方式,经常使用INDEX提示
CLUSTER 强制使用集群
FULL
HASH
当不指定任何INDEX时,优化器会选择最佳的索引
SELECT /*+ INDEX */ STORE_ID FROM TBL_STORE
INDEX_DESC
INDEX_COMBINE 用来指定多个位图索引,而不是选择其中最好的索引
INDEX_JOIN 只需访问这些索引,节省了重新检索表的时间
INDEX_FFS 执行一次索引的快速全局扫描,只处理索引,不访问具体表
INDEX_SS
INDEX_SSX_ASC
INDEX_SS_DESC
NO_INDEX
NO_INDEX_FFS
NO_INDEX_SS
对于数据仓库非常有帮助
FACT
MERGE
NO_EXPAND 语法:/*+ NO_EXPAND */ column1,...
保证OR组合起的IN列表不会陷入困境,/*+ FIRST_ROWS NO_EXPAND */
NO_FACT
NO_MERGE
NO_QUERY_TRANSFORMATION
NO_REWRITE
NO_STAR_TRANSFORMATION
NO_UNSET
REWRITE
STAR_TRANSFORMATION
UNSET
USE_CONCAT
显示如何将连接表中的数据合并在一起,可用两提示直接影响连接顺序.LEADING指定连接顺序首先使用的表,ORDERED告诉优化器基于FROM子句中的表顺序连接这些表,并使用第一个表作为驱动表(最行访问的表)
ORDERED语法:/*+ ORDERED */ column 1,....
访问表顺序根据FROM后的表顺序来
LEADING语法:/*+ LEADING(TABLE1) */ column 1,....
类似于ORDER,指定驱动表
NO_USE_HASH
NO_USE_MERGE
NO_USE_NL
USE_HASH前提足够的HASH_AREA_SIZE或PGA_AGGREGATE_TARGET
通常可以为较大的结果集提供最佳的响应时间
USE_MERGE
USE_NL 通常可以以最快速度返回一个行
USE_NL_WITH_INDEX
NO_PARALLEL
NO_PARALLEL_INDEX
PARALLEL
PARALLEL_INDEX
PQ_DISTRIBUTE
APPEND 不会检查当前所用块中是否有剩余空间,而直接插入到表中,会直接将数据添加到新的块中.
CACHE 会将全表扫描全部缓存到内存中,这样可直接在内存中找到数据,不用在磁盘上查询
CURSOR_SHARING_EXACT
DRIVING_SITE
DYNAMIC_SAMPLING
MODEL_MIN_ANALYSIS
NOAPPEND
NOCACHE
NO_PUSH_PRED
NO_PUSH_SUBQ
NO_PX_JOIN_FILTER
PUSH_PRED
PUSH_SUBQ 强制先执行子查询,当子查询很快返回少量行时,这些行可以用于限制外部查询返回行数,可极大地提高性能
例:select /*+PUSH_SUBQ */ emp.empno,emp.ename
From emp,orders
where emp.deptno=(select deptno from dept where loc='1')
PX_JOIN_FILTER
QB_NAME
HASH_VALUE:SQL语句的Hash值.
ADDRESS:SQL语句在SGA中的地址.
PARSING_USER_ID:为语句解析第一条CURSOR的用户
VERSION_COUNT:语句cursor的数量
KEPT_VERSIONS:
SHARABLE_MEMORY:cursor使用的共享内存总数
PERSISTENT_MEMORY:cursor使用的常驻内存总数
RUNTIME_MEMORY:cursor使用的运行时内存总数.
SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符).
MODULE,ACTION:用了DBMS_APPLICATION_INFO时session解析第一条cursor时信息
SORTS: 语句的排序数
CPU_TIME: 语句被解析和执行的CPU时间
ELAPSED_TIME: 语句被解析和执行的共用时间
PARSE_CALLS: 语句的解析调用(软、硬)次数
EXECUTIONS: 语句的执行次数
INVALIDATIONS: 语句的cursor失效次数
LOADS: 语句载入(载出)数量
ROWS_PROCESSED: 语句返回的列总数
select b.username,a.DISK_READS,a.EXECUTIONS,a.DISK_READS/decode(a.EXECUTIONS,0,1,a.EXECUTIONS) rds_exec_ratio,a.SQL_TEXT
from v$sqlarea a ,dba_users b
where a.PARSING_USER_ID=b.user_id and a.DISK_READS100 order by a.DISK_READS desc;
与V$SQLAREA类似
select * from
where rank_buffers 11
查看表上的索引
select a.table_name,a.index_name,a.column_name,a.column_position,a.table_owner
from dba_ind_columns a
where a.table_owner='CLOUDSEA'
如: select name from tbl where no=?
建立索引:create index test on tbl(name,no) tablespace cloudsea_index storage(....)
对于系统中很关键的查询,可以考虑建立此类连接索引
QUERY_REWRITE_ENALED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED (OR ENFORCED)
create index test on sum(test);
将常用的相对小的表缓存到内存中,但注意会影响到嵌套循环连接上的驱动表
alter table tablename cache;
SELECT ...FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT='A');
(方法一: 高效)
SELECT ....FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = 'A'
(方法二: 最高效)
SELECT ....FROM EMP E WHERE NOT EXISTS (SELECT 'X' FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = 'A');
第四段: 使用STATSPACK和AWR报表调整等待和闩锁
在$ORACLE_HOME/RDBMS/ADMIN下
Spcreate.sql 通过调用spcusr.sql spctab.sql 和spcpkg.sql创建STATSPACK环境,使用SYSDBA运行它
Spdrop.sql 调用sptab.sql和spdusr.sql删除整个STATSPACK环境,使用SYSDBA运行它
Spreport.sql 这是生成报表的主要脚本,由PERFSTAT用户运行
Sprepins.sql 为指定的数据库和实例生成实例报表
Sprepsql.sql 为指定的SQL散列值生成SQL报表
Sprsqins.sql 为指定的数据库和实例生成SQL报表
Spauto.sql 使用DBMS_JOB自动进行统计数据收集(照相)
Sprepcon.sql 配置SQLPLUS变量来设置像阈值这样的内容的配置文件
Spurge.sql 删除给定数据库实例一定范围内的快照ID,不删除基线快照
Sptrunc.sql 截短STATSPACK表里所有性能数据
第五段: 执行快速系统检查1. 缓冲区命中率
查询缓冲区命中率
select (1 - (sum(decode(name, 'physical reads',value,0)) /
(sum(decode(name, 'db block gets',value,0)) +
sum(decode(name, 'consistent gets',value,0))))) * 100 "Hit Ratio"
from v$sysstat;
①.,这些表占用空间
Drop Table 后,没有真正的删除表,而是在"垃圾站"中了.可以通过:
SQL SHOW RECYCLEBIN
看到.如果要彻底删除,使用:
删除这一个或
SQL PURGE RECYCLEBIN;
删除全部.
用Oracle菜单里面的工具:Net Configuration Assistant
监听程序配置,删除监听,重新添加监听.
然后再用它:本地Net服务名配置,先删除,再增加.
就好了.....
将oracle服务设置为手动开启......
开机后
需要使用时
在运行中输入net
start
OracleOraDb10g_home1TNSListener
回车
再输入net
OracleServiceORCL
回车,注意服务名要和机器上的一致
去服务里看ORACLE开头的服务、尤其是数据库服务和监听服务、如果是自启动、开机就不会打不开、如果是手动、那你就得自己开
打不开数据库或许是因为你的OracleServiceORCL服务没有启动吧