Database

Oracle: 优化SQL的解析时间

1. 避免硬解析  —  使用预备语句(JDBC里使用PreparedStatement) 2. 避免软解析  —  重用预备语句(JDBC里用完PreparedStatement后并不关闭,下次查数据库时还用这个对象) 3. 客户端语句缓存 — 重用游标(JDBC3.0 与 连接池共用时,JDBC会透明地替你缓存) 有时候你可能无权修改调用SQL的代码(比如这个代码处于二进制JAR包中),这时就只能在Oracle数据库服务器端作文章了 1. 打开“游标共享”  — 数据库引擎会自动将字面量替换成绑定变量,避免硬解析。缺点是这个东西有BUG 2. 打开“服务器端语句缓存”

Oracle:SQL优化的四种基本方案

源自《Troubleshooting Oracle Performance》 1. 调整访问结构,比如加索引,调整聚簇 2. 修改SQL语句 3. SQL Hint 4. 在session级别或SQL语句级别调整运行时参数,比如把all_rows临时变成first_rows  — 注意:如果使用了连接池,则不要使用这个技术。因为它会导致一个物理连接可能被频繁修改参数,而修改参数的开销并不小。

Oracle: 获取执行计划

执行这样的SQL: #1 explain plan for select * from student; select * from table(dbms_xplan.display); 这样可以看到CBO估计出的值 #2 select /*+ gather_plan_statistics */ * from student where student_id < 3 and 1 = 2; select sql_id from v$sql where sql_text like ‘ select /*+ gather_plan_statistics */ * from student where student_id < 3 and 1 = 2%’; select * …

Oracle: 获取执行计划 Read More »

Oracle: 执行计划中的Nested Loops

一个Nested Loops操作总是有两个孩子,第一个孩子(即较上面的那行)叫outer loop,第二个叫inner loop 具体执行顺序是:    1. 执行outer loop, 返回rowSet-outer    2. for every row in rowSet-outer           执行inner loop       end for    3. 将inner loop多次操作产生的结果总集返回给父操作,即Nested Loops操作

Oracle: 识别低效的执行计划

比较一下执行计划中各步操作的估计行数(E-Rows) 和实际运行时产生的行数(A-Rows),如果两者差别很大,就是一个低效的执行计划。按低效的计划来执行SQL,也会很低效。 这种情况下应该想办法让CBO产生新的、高效的执行计划。而CBO之所以产生低效的计划,往往是因为数据统计出了问题,比如说,直方图缺失。 这种情况下生成一下直方图,可能就可以让CBO产生高效的计划。

Oracle:跟踪数据库调用

以trace文件为核心 1. 先找出追踪文件的位置    select * from v$parameter  where name = ‘user_dump_dest’    2. 把追踪文件格式化一下    a. 下载 http://antognini.ch/downloads/tvdxtat_40beta9.zip (Christian Antognini 写的格式化工具,他说这个比Oracle自带的好用)    b. 这是一个JAVA程序。请解压然后编辑其中的bat文件,设置一下相关的目录 (xxx_home)    c. 运行一下:         比如: tvdxtat -i C:\oraclexe\app\oracle\admin\XE\udump\xe_ora_7424.trc -o output\result.html -s no -w yes    d. 最后,研究一下 result.html

Oracle: 查看对象的统计信息

优化器会根据对象的统计信息来决定执行计划,因此这个信息很重要。 SQL:    –查看表的stats select * from user_tab_statistics where table_name = ‘STUDENT’ –查看列的stats select * from user_tab_col_statistics where table_name = ‘STUDENT’ –查看索引的stats select * from user_ind_statistics where table_name = ‘STUDENT’