os: centos 7.6
db: oracle 19.3

使用 swingbench 做的10G数据量压测,然后查看 AWR 报表时,分析一下 SQL ordered by Elapsed Time.


可以看出 56pwkjspvmg3h,gkxxkghxubh1a,b5dk0t95fhyd7,89b7r2pg1cn4a,01jzc2mg6cg92
这几个 sql 单次执行都是比较慢的.

56pwkjspvmg3h

WITH STAGE1 AS ( SELECT /*+ materialize CARDINALITY(12) */ (ROWNUM*(1/288)) OFFSET FROM DUAL CONNECT BY ROWNUM <= 12
), STAGE2 AS (SELECT /*+ materialize CARDINALITY(12) */ LAG(OFFSET, 1, 0) OVER (ORDER BY ROWNUM) OSTART, OFFSET OEND FROM STAGE1
), STAGE3 AS (SELECT /*+ materialize CARDINALITY(12) */ (SYSTIMESTAMP - OSTART) DATE1, (SYSTIMESTAMP - OEND) DATE2 FROM STAGE2
)
SELECT WAREHOUSE_ID, DATE1, DATE2, SUM(ORDERS.ORDER_TOTAL) "Value of Orders", COUNT(1) "Number of Orders" FROM STAGE3, ORDERS
WHERE ORDER_DATE BETWEEN DATE2 AND DATE1 AND WAREHOUSE_ID = :B1
GROUP BY WAREHOUSE_ID, DATE1, DATE2
ORDER BY DATE1, DATE2 DESC

查看 ORDERS 表发现 ORDER_DATE 和 WAREHOUSE_ID 均没有创建索引.

SQL> select count(1)from soe.orders
;COUNT(1)
----------15694727SQL>
SQL> select count(distinct WAREHOUSE_ID)from soe.orders o
;COUNT(DISTINCTWAREHOUSE_ID)
---------------------------999SQL>
SQL> select WAREHOUSE_ID,count(1)from soe.orders ogroup by WAREHOUSE_IDorder by 2 desc
;WAREHOUSE_ID   COUNT(1)
------------ ----------14     16355124    16326343    16186779    1618160     16174601    16169

总共有 1000 个仓库,每个仓库的数据大概在1.6W条左右.
感觉在仓库上创建索引应该能取得不错的效果.

查看 soedgindexes.sql 及 soedgindexes2.sql 时都有相关的 index 创建语句,为什么目标表上没有被创建?

$ vi swingbench/sql/soedgindexes2.sqlCREATE INDEX ord_sales_rep_ix
ON orders (sales_rep_id)
REVERSE tablespace &indextablespace &parallelclause &logging;CREATE INDEX ord_customer_ix
ON orders (customer_id)
REVERSE tablespace &indextablespace &parallelclause &logging;CREATE INDEX ord_order_date_ix
ON orders (order_date)
REVERSE tablespace &indextablespace &parallelclause &logging;--CREATE INDEX ord_status_ix
--ON orders (order_status) tablespace &indextablespace &parallelclause &logging;CREATE INDEX ord_warehouse_ix
ON orders (warehouse_id, order_status) tablespace &indextablespace &parallelclause &logging;

手动创建一下

SQL> CREATE INDEX ord_order_date_ix
ON orders (order_date)
REVERSE tablespace SOE  nologging;CREATE INDEX ord_warehouse_ix
ON orders (warehouse_id, order_status) tablespace SOE  nologging;

gkxxkghxubh1a

SELECT ORDER_MODE, ORDERS.WAREHOUSE_ID, SUM(ORDER_TOTAL), COUNT(1) FROM ORDERS, WAREHOUSES WHERE ORDERS.WAREHOUSE_ID = WAREHOUSES.WAREHOUSE_ID AND WAREHOUSES.WAREHOUSE_ID = :B1 GROUP BY CUBE(ORDERS.ORDER_MODE, ORDERS.WAREHOUSE_ID)
;

这个sql明显是 ORDERS,WAREHOUSES 的 WAREHOUSE_ID 上都要有索引.上面已经在 ORDERS.WAREHOUSE_ID 上创建了索引,需要检查下 WAREHOUSES 的索引

-- Create/Recreate primary, unique and foreign key constraints
alter table WAREHOUSESadd constraint WAREHOUSES_PK primary key (WAREHOUSE_ID)using index tablespace SOEpctfree 10initrans 2maxtrans 255storage(initial 1Mnext 1Mminextents 1maxextents unlimitedpctincrease 0)novalidate;
alter index WAREHOUSES_PK nologging;

WAREHOUSES.WAREHOUSE_ID 是主键,没啥好说的.

b5dk0t95fhyd7

BEGIN :1 := orderentry.WarehouseOrdersQuery(:2 , :3 , :4 ); END;

这个需要进入到过程里看下

CREATE OR REPLACE PACKAGE BODY ORDERENTRY AS--   --   -- Package     : Order Entry Package Body -- Version     : 2.0 -- Author      : Dominic Giles -- Last Update : 14 June 2011 -- Description : Used in stress test of Oracle by swingbench test harness -- -- FUNCTION WarehouseOrdersQuery (warehouseid orders.warehouse_id%type, min_sleep integer, max_sleep integer ) return varchar is cursor c1 is SELECT   order_mode, orders.warehouse_id, SUM(order_total), COUNT(1) FROM orders, warehouses WHERE orders.warehouse_id   = warehouses.warehouse_id AND warehouses.warehouse_id = warehouseid GROUP BY cube(orders.order_mode, orders.warehouse_id); order_mode orders.order_mode%type; warehouse_id orders.warehouse_id%type; sumoforders orders.order_total%type; numberoforders integer; begin dbms_application_info.set_module('Warehouse Orders Query',null); init_info_array(); open c1; loop fetch c1 into order_mode,warehouse_id,sumoforders,numberoforders; exit when c1%notfound; end loop; increment_selects(1); sleep(min_sleep, max_sleep); dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); exception when others then dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); end WarehouseOrdersQuery;
END;

就是 gkxxkghxubh1a 这个sql 造成的.

89b7r2pg1cn4a

BEGIN :1 := orderentry.WarehouseActivityQuery(:2 , :3 , :4 ); END;
CREATE OR REPLACE PACKAGE BODY ORDERENTRY AS--   --   -- Package     : Order Entry Package Body -- Version     : 2.0 -- Author      : Dominic Giles -- Last Update : 14 June 2011 -- Description : Used in stress test of Oracle by swingbench test harness -- --
FUNCTION WarehouseActivityQuery (warehouseid orders.warehouse_id%type, min_sleep integer, max_sleep integer ) return varchar is cursor c1 is WITH stage1 AS -- get 12 rows of 5mins (SELECT /*+ materialize CARDINALITY(12) */ (rownum*(1/288)) offset FROM dual CONNECT BY rownum <= 12 ), stage2 AS -- get 12 rows with 2 columns, 1 col lagged behind the other (SELECT /*+ materialize CARDINALITY(12) */ lag(offset, 1, 0) over (order by rownum) ostart, offset oend FROM stage1 ), stage3 AS -- transform them to timestamps (SELECT /*+ materialize CARDINALITY(12) */ (systimestamp - ostart) date1, (systimestamp - oend) date2 FROM stage2 ) SELECT   warehouse_id, date1, date2, SUM(orders.order_total) "Value of Orders", COUNT(1) "Number of Orders" FROM stage3, orders WHERE order_date BETWEEN date2 AND date1 AND warehouse_id = warehouseid GROUP BY warehouse_id, date1, date2 ORDER BY date1, date2 DESC; warehouse_id orders.warehouse_id%type; date1 orders.order_date%type; date2 orders.order_date%type; sumoforders orders.order_total%type; numberoforders integer; begin dbms_application_info.set_module('Warehouse Activity Query',null); init_info_array(); open c1; loop fetch c1 into warehouse_id,date1,date2,sumoforders,numberoforders; exit when c1%notfound; end loop; increment_selects(1); sleep(min_sleep, max_sleep); dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); exception when others then dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); end WarehouseActivityQuery;
END;

就是 56pwkjspvmg3h 这个sql 造成的.

01jzc2mg6cg92

BEGIN :1 := orderentry.newcustomer(:2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10 ); END;

这个每执行一次需要 1.24s

CREATE OR REPLACE PACKAGE BODY ORDERENTRY AS--   --   -- Package     : Order Entry Package Body -- Version     : 2.0 -- Author      : Dominic Giles -- Last Update : 14 June 2011 -- Description : Used in stress test of Oracle by swingbench test harness -- --
function newCustomer(p_fname customers.cust_first_name%type, p_lname customers.cust_last_name%type, p_nls_lang customers.nls_language%type, p_nls_terr customers.nls_territory%type, p_town addresses.town%type, p_county addresses.county%type, p_country addresses.country%type, p_min_sleep integer, p_max_sleep integer) return varchar is l_customer_id customers.customer_id%type; l_address_id addresses.address_id%type; l_card_id card_details.card_id%type; l_customerArray customer_tab; begin dbms_application_info.set_module('Update Customer Details',null); init_info_array(); select   customer_seq.nextval into l_customer_id from dual;-- this could be returned more efficently using returns clause on insert select   address_seq.nextval into l_address_id from dual; select   card_details_seq.nextval into l_card_id from dual; increment_selects(3); INSERT INTO customers ( customer_id , cust_first_name , cust_last_name , nls_language , nls_territory , credit_limit , cust_email , account_mgr_id, customer_since, customer_class, suggestions, dob, mailshot, partner_mailshot, preferred_address, preferred_card ) VALUES ( l_customer_id, p_fname, p_lname, p_nls_lang, p_nls_terr, FLOOR(DBMS_RANDOM.value(MIN_CREDITLIMIT, MAX_CREDITLIMIT)), p_fname ||'.' ||p_lname ||'@' ||'oracle.com', FLOOR(DBMS_RANDOM.value(MIN_SALESID, MAX_SALESID)), TRUNC(SYSDATE), 'Occasional', 'Music', trunc(SYSDATE - (365*DBMS_RANDOM.value(20, 60))), 'Y', 'N', l_address_id, l_card_id ); increment_inserts(1); INSERT INTO ADDRESSES ( address_id, customer_id, date_created, house_no_or_name, street_name, town, county, country, post_code, zip_code ) VALUES ( l_address_Id, l_customer_Id, TRUNC(SYSDATE,'MI'), floor(DBMS_RANDOM.value(1, HOUSE_NO_RANGE)), 'Street Name', p_town, p_county, p_country, 'Postcode', NULL ); increment_inserts(1); INSERT INTO CARD_DETAILS ( CARD_ID, CUSTOMER_ID, CARD_TYPE, CARD_NUMBER, EXPIRY_DATE, IS_VALID, SECURITY_CODE ) VALUES ( l_card_id, l_customer_Id, 'Visa(Debit)', floor(DBMS_RANDOM.value(1111111111, 9999999999)), trunc(SYSDATE + (DBMS_RANDOM.value(365, 1460))), 'Y', floor(DBMS_RANDOM.value(1111, 9999)) ); oecommit; increment_inserts(1);increment_commits(1); sleep(p_min_sleep, p_max_sleep); logon(l_customer_id); increment_inserts(1);increment_selects(1);increment_commits(1); l_customerArray := getCustomerDetails(l_customer_id); increment_selects(1); dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); exception when others then DBMS_OUTPUT.PUT_LINE('Error code ' || SQLCODE || ': ' || SUBSTR(SQLERRM, 1 , 64)); rollback; increment_rollbacks(1); dbms_application_info.set_module(null,null); return getdmlarrayasstring(info_array); end newcustomer;
END;

先不动,再 swingbench 一次看看.

参考:

AWR 报告 SQL ordered by Elapsed Time相关推荐

  1. SQL ordered by Elapsed Time

    1.查询oracle快照  select t.snap_id as snap_id,         to_char(t.startup_time, 'yyyy-mm-dd hh24:mi:ss') ...

  2. oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本

    --提取&beg_snap .&end_snap select * from dba_hist_snapshot x ; --提取&dbid select * from v$d ...

  3. mysql awr flush_如何使用awr_set_report_thresholds控制AWR报告里的sql语句数量

    AWR报告里和sql语句有关的section有SQL ordered by Elapsed Time.SQL ordered by CPU Time.SQL ordered by User I/O W ...

  4. awr报告 解读_AWR报告分析解读

    http://blog.csdn.net/weiwangsisoftstone/article/details/7614430 1.AWR报告头信息 DB Name :数据库名字 DBid: 数据库i ...

  5. 【Oracle之AWR报告解析】

    AWR报告模板 Report Summary 一.DB Time远远小于Elapsed时间,说明数据库比较空闲.如果是大于则说明数据库比较繁忙 举例介绍: Report A:
Snap Id Snap ...

  6. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed Events Waits : 该等待事件发生的次数, 对于DB CPU此项不可用 Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程 ...

  7. Oracle AWR报告指标全解析

    1-5 Top 5 Timed Events Waits : 该等待事件发生的次数, 对于DB CPU此项不可用 Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程 ...

  8. Oracle AWR报告详细分析

    Oracle AWR报告详细分析  (文档 ID 1523048.1) AWR 是 Oracle  10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动 ...

  9. 十二.性能测试-AWR报告简要分析

    AWR 是 Oracle 10g 版本 推出的新特性, 全称叫 Automatic Workload Repository自动负载信息库 , AWR 是通过对比两次快照 (snapshot) 收集到的 ...

最新文章

  1. Velocity 入门(一)
  2. Java 多线程编程之 interruptException
  3. 【学术相关】揭秘2020年度百篇最具国际影响力论文-信息科学篇
  4. [译] ROS C++ 代码规范
  5. GVim中以十六进制方式打开文件
  6. 线性代数:矩阵运算之乘法?
  7. 新型智慧城市建设绘出沈阳“N朵云”
  8. 程序有时能运行有时不能_学法能有什么好处?有时候觉得挺“秃”然的..
  9. nafxcw.lib与LIBCMT.LIB链接冲突
  10. stm32GPIO8种模式
  11. PMSM的MTPA曲线绘制及其参数拟合——基于Matlab的AppDesigner
  12. 读书笔记:《穷查理宝典》
  13. 古人道中秋 | 制作一个可拖动的月球
  14. RFID天线技术 – 低频和高频RFID天线设计
  15. Microsoft Visual SourceSafe
  16. LeetCode-1758-生成交替二进制字符串的最少操作数
  17. scp在命令行中带密码远程下载文件 sshpass安装
  18. 于丹 论语 心得和感悟
  19. Android-SQLite数据库实例,Android的Io模型你了解多少
  20. 学习日志(10.21)

热门文章

  1. Google Glass终于像眼镜了
  2. 学计算机房空调功率是多少为好,空调功率是多少—空调功率一般有多少呢
  3. Pimp_my_Z1
  4. kisso是什么牌子_joway是什么牌子
  5. 加拿大计算机科学专业高中选课,科普 | 超全加拿大高中留学的选课攻略,如何选课是关键…...
  6. Android 集成FCM(Google 推送)导致上架失败,提前获取设备信息ANDROID ID
  7. 美国人初学Python之五
  8. 澤雷隨 (易經大意 韓長庚)
  9. 常见鸟的种类及特点_鸟的种类及图片(看图识鸟)
  10. 怎样设置windows桌面自动刷新