Xpert 调优

-- 10046 event 可以定义 SQL TRACE 级别
/*
|| 默认的10046级别跟 SQL TRACE 一样, 另外还有一些级别:
|| level 1: SQL Tracing
|| level 4: Tracing with bind variable values
|| level 8: Tracing with wait events
|| level 12 Tracing with bind variables and wait events (4+8=12)

level 4, 12 可以看到绑定变量的值.
*/

alter session set events ‘10046 trace name context forever, level 4‘;
-- 关闭 10046, 只需要将 level 设置成 0

-- If you wish to set the 10046 event in another user‘s session,
-- you will need to use the DBMS_SYSTEM, The SET_EV procedure can set an event in any session
-- You will need the SID and SERIAL# of that session from V$SESSION.
-- example:
exec dbms_system.set_ev(sid,serial#,10046,12,‘‘);

-- 另外要使用 TKPROF 来查看 trace file 生成的报告, 直接看 trace file 无法看懂

10046 event

-- Program data instantiated within a program is stored in PGA for each user, rather than in the SGA
-- 执行pl/sql程度的相关数据, 存储在PGA中, 被编译好的PL/SQL程序本身是共享的.
-- This means that each user has his own copy of program data. If a procedure declares a PL/SQL table
-- and fills it full of 1000 strings, every user who executes that procedure has his own copy of that table and its 1000
-- strings. This characteristic does however provide you with a fair amount of flexibility
-- to finding the delicate resource balance between CPU and memory.

-- 权限问题
-- Stored code runs under the authority of that code’s owner, not that of the schema which is executing the code.
-- 也就是说, 存储过程执行时是创建存储过程那个用户的权限.
-- Even though stored code runs under the authority of that code’s owner, the USER function still
-- returns the name of the schema currently connected to Oracle.

-- 执行 procedure
-- sqlplus 环境, execute calc_totals 或 exec calc_totals
-- 如果是匿名的, 直接就执行了, 比如
begin
    calc_totals;
end;

-- 执行 function, 因为 function 有返回值, 所以, 它不能直接执行, 要有个类似变量来接收函数返回值.
-- 直接执行, 可以类似这种
exec DBMS_OUTPUT.PUT_LINE (total_sales (1997))

-- 远程调用
schema_name.[package_name.]module_name@database_link_name
emp_name := full_name@new_york (:emp.employee_id);

basic

-- sql*plus 提供的session变量
-- session variable , 可以使用的数据类型 varchar2, varchar2(N), char
-- number, number(N)

varibale X varchar2(10)
EXECUTE :X := ‘123‘;
PRINT X

session varibale

-- Because stored objects are contained in tables in the data dictionary, you can use SQL itself to get information
-- about the currently available programs. The following views are the most useful to familiarize yourself with:

/*
USER_DEPENDENCIES - The dependencies to and from objects you own
USER_ERRORS - The current set of errors for all stored objects you own.
USER_OBJECTS - The objects you own
USER_OBJECT_SIZE - The size of the objects you own
USER_SOURCE - The text source code for all objects you own
USER_TRIGGER - The database triggers you own
*/

-- USER_DEPENDENCIES
-- Use the USER_DEPENDENCIES view to see which objects reference or depend on a particular object
SELECT referenced_name,
       referenced_type,
       referenced_owner,
       referenced_link_name
  FROM user_dependencies
 WHERE name = UPPER (‘&1‘);

-- USER_OBJECTS
-- Displaying Information About Stored Objects, 3列比较重要 OBJECT_NAME, OBJECT_TYPE, STATUS
SET PAGESIZE 66
COLUMN object_type FORMAT A20
COLUMN object_name FORMAT A30
COLUMN status FORMAT A10
BREAK ON object_type SKIP 1
SPOOL psobj.lis
SELECT object_type, object_name, status
  FROM user_objects
 WHERE object_type IN (‘PACKAGE‘, ‘PACKAGE BODY‘, ‘FUNCTION‘, ‘PROCEDURE‘)
 ORDER BY object_type, status, object_name
/
SPOOL OFF

-- USER_OBJECT_SIZE
-- tell you about the size of your code
SET PAGESIZE 66
COLUMN name FORMAT A30
COLUMN type FORMAT A15
COLUMN source_size FORMAT 999999
COLUMN parsed_size FORMAT 999999
COLUMN code_size FORMAT 999999
TTITLE ‘Size of PL/SQL Objects > 2000 Bytes‘
SPOOL pssize.lis
SELECT name, type, source_size, parsed_size, code_size
  FROM user_object_size
 WHERE code_size > 2000
 ORDER BY code_size DESC
/
SPOOL OFF

-- USER_SOURCE
-- You should always maintain the source code of your programs in text files (or a development tool specifically designed
-- to store and manage PL/SQL code outside of the database).I
SELECT text
  FROM user_source
 WHERE name = UPPER (‘&1‘)
 ORDER BY line;

Check Object

-- 1. 选择驱动表, 多表连接时
-- When Oracle processes multiple tables, it must join the two tables.
--  There are four different join methods in the Oracle database,
-- the Nested Loop Join, the Sort-Merge Join, the Hash Join, and the Cartesian Join
-- Cartesian Join : 笛卡尔积连接
-- Sort-Merge Join: has a sort phase and a merge phase, it scans and sorts the first (driving)
--                   table (the one specified second in the FROM clause). Next, it scans the second
--                    table (the one specified first in the FROM clause) and merges all of the rows
--                    retrieved from the second table with those retrieved from the first table.
-- Nested Loop Join: every row in the driving table and then finds matches in the second table.
--                    If there is no index on the join column, a full table scan is performed on
--                    the second table for every row in the driving table.
--                    这种的话, 如果主驱动表100W列, 而另一个表只有10列的话, 肯定是将只有10列的表设置为
--                    主驱动表比较好
-- Hash Join:     uses a hashing algorithm (hence its name) to divide the driving table‘s rows into
--                multiple buckets. The second table is hashed with the same algorithm.
-- 注意: 主驱动表是  is the second table in the FROM clause of the SQL statement.
-- 例如:
/*
Table TAB1  has 16,384   rows.
Table TAB2  has 4        rows.
*/
SELECT COUNT (*) FROM TAB1, TAB2         -- 4.00 seconds elapsed
                     count     phys      cr        cur      rows
                     ------    -----    -----     -----    ------
        Parse          1         0      0         0
        Execute        1         384    386       10         0
        Fetch          1         0      0         0          1

SELECT COUNT (*) FROM TAB2, TAB1 -- 37.32 seconds elapsed
                     count     phys      cr        cur      rows
                     ------    -----    -----     -----    ------
        Parse          1         0      0         0
        Execute        1         95     49247     32770      0
        Fetch          1         0      0         0          1

-- 多表查询join 时, 选择几个表之间的交集的那个表作为驱动表.
-- 多表时, 貌似 from 后的第一个表是驱动表, 或者通过交集? 看下边例子
SELECT   . . .
FROM     location L,
         category C,
         emp E
  WHERE  E.emp_no BETWEEN 1000 AND 2000
    AND  E.cat_no =  C.cat_no
    AND  E.locn   =  L.locn
-- 更高效的做法
SELECT     . . .
 FROM      emp E,
           location L,
           category C
    WHERE  E.cat_no =  C.cat_no
      AND  E.locn   =  L.locn
      AND  E.emp_no BETWEEN 1000 AND 2000

调优法则

-- 1. 高效的删除重复的行 #################################
DELETE FROM emp E
      WHERE E.rowid > (SELECT MIN(X.rowid)
                            FROM emp X
                           WHERE X.emp_no = E.emp_no);

-- 2. 一般情况下, 在列上有索引时, 选择使用 IN 或 UNION 比 OR 更好. #################################
SELECT . . .                     SELECT . . .
   FROM   location                  FROM   location
   WHERE  loc_id = 10               WHERE  loc_id = 10
   OR     region = ‘MELBOURNE‘      OR     loc_id = 20
                                    OR     loc_id = 30
-- 改进:
SELECT . . .                     SELECT . . .
   FROM   location                  FROM   location
   WHERE  loc_id = 10               WHERE  loc_in IN (10,20,30)
   UNION
   SELECT . . .
   FROM   location
   WHERE  region = ‘MELBOURNE‘

-- 3. 最小化表扫描 minimize the number of table lookups (subquery blocks) in queries, 例如: ##########
SELECT emp_name
FROM   emp
WHERE  emp_cat   = ( SELECT MAX(category)
                        FROM   emp_categories )
AND    sal_range = ( SELECT MAX(sal_range)
                        FROM   emp_categories )
AND    emp_dept  = 0020;
-- 上例中, 两个子查询是分开的, 那么需要独立扫描两次, 改进如下:
SELECT emp_name
FROM   emp
WHERE (emp_cat, sal_range)
                    = ( SELECT MAX(category), MAX(sal_range)
                        FROM   emp_categories )
AND    emp_dept  = 0020;
-- 修改的时候也一样, 参考下例:
UPDATE emp
SET    emp_cat   = ( SELECT MAX(category)
                     FROM   emp_categories ),
       sal_range = ( SELECT MAX(sal_range)
                     FROM   emp_categories )
WHERE  emp_dept  = 0020;
-- 改进
UPDATE emp
SET   (emp_cat, sal_range)
                 = ( SELECT MAX(category), MAX(sal_range)
                     FROM   emp_categories )
WHERE  emp_dept  = 0020;

-- 4. not exists 与 not in 的比较 not exists 好 ########################################
SELECT . . .
FROM   emp
WHERE  dept_no NOT IN ( SELECT dept_no
                           FROM   dept
                           WHERE  dept_cat = ‘A‘);
-- 改进
SELECT . . .
FROM   emp E
WHERE  NOT EXISTS ( SELECT  ‘X‘
                       FROM   dept
                       WHERE  dept_no  = E.dept_no
                       AND    dept_cat = ‘A‘   );
-- 5. reduce database access
-- 例如: 低效, 分别两次访问 database
SELECT emp_name, salary, grade
FROM    emp
WHERE  emp_no = 0342;

SELECT emp_name, salary, grade
FROM    emp
WHERE  emp_no = 0291;
-- 改进, 一次访问数据库
SELECT   emp_name, salary, grade,
FROM     emp A
WHERE    emp_no IN (0342,0291) ;

-- 6. 使用 * 时, 最好给表起个别名, 然后使用, 这样高效, 例如 ####################################
INSERT INTO emp_audit
SELECT USER, SYSDATE, A.*
FROM   emp A
WHERE  emp_no = :emp_no;

-- 7. union 和 union all
-- 一般如果不考虑去掉 重复的, 还有排序等内容的话, 使用 union all

-- 8. decode 可以被活用, 例如:
SELECT COUNT(*), SUM(salary)
FROM   emp
WHERE  dept_no  =  0020
AND    emp_name LIKE ‘SMITH%‘ ;

SELECT COUNT(*), SUM(salary)
FROM   emp
WHERE  dept_no  =  0030
AND    emp_name LIKE ‘SMITH%‘ ;
-- 改进
SELECT COUNT(DECODE(dept_no, 0020, ‘X‘,    NULL)) D0020_kount,
       COUNT(DECODE(dept_no, 0030, ‘X‘,    NULL)) D0030_kount,
       SUM  (DECODE(dept_no, 0020, salary, NULL)) D0020_sal,
       SUM  (DECODE(dept_no, 0030, salary, NULL)) D0030_sal
 FROM  emp
WHERE  emp_name LIKE ‘SMITH%‘;

一般SQL调优

Xpert 调优,布布扣,bubuko.com

时间: 2024-10-29 19:10:37

Xpert 调优的相关文章

JVM原理讲解和调优

一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息

spark性能调优之资源调优

转https://tech.meituan.com/spark-tuning-basic.html spark作业原理 使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使用的部署模式(deploy-mode)不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动.Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU core.而Driver进程要做的第一件事情,就是向集群管理器(可以是Spark Stand

mysql性能调优与架构设计笔记

1.mysql基本介绍 mysql支持多线程高并发的关系型数据库; 数据库存储引擎InnoDB.MyISAM; mysql快速崛起的原因就是他是开源的; 性能一直是mysql自豪的一大特点; 2.mysql架构组成 麻雀虽小五脏俱全,mysql虽然简单但其内部结构并不简单; mysql物理文件组成之日志文件: 错误日志error log这里记录mysql运行时严重的警告和错误,以及mysql启动和关闭的日志信息 二进制日志 binary log 记录mysql运行时所有的query和query执

网络调优

关于网络调优,尤其是TCP Tuning(你可以以这两个关键词在网上找到很多文章),这里面有很多很多东西可以说.看看Linux下TCP/IP的那么多参数就知道了(顺便说一下,你也许不喜欢Linux,但是你不能否认Linux给我们了很多可以进行内核调优的权力).强烈建议大家看看<TCP/IP详解卷1:协议>这本书.我在这里只讲一些概念上的东西. A)TCP调优 我们知道TCP链接是有很多开销的,一个是会占用文件描述符,另一个是会开缓存,一般来说一个系统可以支持的TCP链接数是有限的,我们需要清楚

【Spark深入学习 -14】Spark应用经验与程序调优

----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调优经验 3.1 Spark原理及调优工具 3.2 运行环境优化 3.2.1 防止不必要的分发 3.2.2 提高数据本地性 3.2.3 存储格式选择 3.2.4 选择高配机器 3.3 优化操作符 3.3.1 过滤操作导致多小任务 3.3.2 降低单条记录开销 3.3.3 处理数据倾斜或者任务倾斜 3.

iOS应用性能调优的25个建议和技巧

目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载Views 10. Cache, C

php调优

php.ini配置文件调优 1. expose_php off 2. register_globals off(重要,防止GET和POST变量自动注册为全局变量,一定要关闭) 3. 打开magic_quotes_gpc来防止SQL注入,重要!是防止SQL注入的重要手段,该参数将用户提交的SQL查询进行转换,如将'转换为\'. 4. display errors off 4. max_excution_time 30s 最长执行时间. 5. memory_limit,一个脚本能申请到的最大内存,防

mysql数据库调优

最近新到项目上,算是帮忙,遇见性能测试. 测试要求其实不高,现在是单mysql数据库,未分表,四千万数据,四百毫秒,上的压力是一千一百多tps,但是,动态的只占到了百分之二十左右,也就是两百左右的tps吧.服务器还是比较牛逼的,我看到了十几个cpu线程,估计超过一百G内存吧. 大体情况如上. 鄙人之前没优化过mysql,其实,是没调优过sql,只读过部分sql执行的原理,数据库的结构啥的,平常写sql和设计表的时候有些注意,实战调优经验为零,以前就算调了,没测试过,也白搭,这次算是逮到便宜了.

第5章 JVM调优

5.1 Java虚拟机内存模型 Java虚拟机内存模型是Java程序运行的基础.JVM将其内存数据分为程序计数器,虚拟机栈,本地方法栈,Java堆和方法区等部分. 程序计数器:用于存放下一条运行的指令: 虚拟机栈和本地方法栈:用于存放函数调用堆栈信息: Java堆:用于存放Java程序运行时所需的对象等数据: 方法区:用于存放程序的类元数据信息: 5.1.1 程序计数器 程序计数器是一块很小内存空间.由于Java是支持线程的语言,当线程数量超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源.