当前位置: 首页 > news >正文

oracle dbms_sqltune 使用

创建测试表

CREATE TABLE test_table (
    id NUMBER PRIMARY KEY,
    event_date DATE,
    value NUMBER
);

插入测试数据

DECLARE
    i NUMBER;
BEGIN
    FOR i IN 1..1000000 LOOP
        INSERT INTO test_table (id, event_date, value)
        VALUES (i, SYSDATE - MOD(i, 365), DBMS_RANDOM.VALUE(1, 1000));
    END LOOP;
    COMMIT;
END;
/

PL/SQL procedure successfully completed.

查询指定日期的记录

SELECT *   
FROM test_table  
WHERE TRUNC(event_date) = TO_DATE('2025-02-04', 'YYYY-MM-DD') ;

使用 DBMS_SQLTUNE 进行优化

我们可以使用 DBMS_SQLTUNE 来分析和优化这个查询
创建一个SQL Tuning Task

DECLARE
    l_sql_tune_task_id VARCHAR2(100);
BEGIN
    l_sql_tune_task_id := DBMS_SQLTUNE.CREATE_TUNING_TASK(
        sql_text => 'SELECT * FROM test_table WHERE TRUNC(event_date) = TO_DATE(''2025-02-04'', ''YYYY-MM-DD'')',
        user_name => 'test', -- 替换为你的用户名
        scope => 'COMPREHENSIVE',
        time_limit => 60,
        task_name => 'tune_test_table_query',
        description => 'Tuning task for test_table query'
    );
    DBMS_OUTPUT.PUT_LINE('Task ID: ' || l_sql_tune_task_id);
END;
/

PL/SQL procedure successfully completed.

执行SQL Tuning Task

BEGIN
    DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => 'tune_test_table_query');
END;
/
PL/SQL procedure successfully completed.

查看优化建议

SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('tune_test_table_query') AS recommendations FROM DUAL;



RECOMMENDATIONS
--------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : tune_test_table_query
Tuning Task Owner  : TEST
Workload Type	   : Single SQL Statement
Scope		   : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status  : COMPLETED
Started at	   : 02/11/2025 09:51:15
Completed at	   : 02/11/2025 09:51:16


RECOMMENDATIONS
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Schema Name   : TEST
Container Name: CDB$ROOT
SQL ID	      : 45hf7qdyz87kz
SQL Text      : SELECT * FROM test_table WHERE TRUNC(event_date) =
		TO_DATE('2025-02-04', 'YYYY-MM-DD')

-------------------------------------------------------------------------------
FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------


RECOMMENDATIONS
--------------------------------------------------------------------------------
1- Statistics Finding
---------------------
  Index "TEST"."SYS_C007727" was not analyzed.

  Recommendation
  --------------
  - Consider collecting optimizer statistics for this index.
    execute dbms_stats.gather_index_stats(ownname => 'TEST', indname =>
	    'SYS_C007727', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE);

  Rationale

RECOMMENDATIONS
--------------------------------------------------------------------------------
  ---------
    The optimizer requires up-to-date statistics for the index in order to
    select a good execution plan.

2- Statistics Finding
---------------------
  Table "TEST"."TEST_TABLE" was not analyzed.

  Recommendation
  --------------
  - Consider collecting optimizer statistics for this table.

RECOMMENDATIONS
--------------------------------------------------------------------------------
    execute dbms_stats.gather_table_stats(ownname => 'TEST', tabname =>
	    'TEST_TABLE', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
	    method_opt => 'FOR ALL COLUMNS SIZE AUTO');

  Rationale
  ---------
    The optimizer requires up-to-date statistics for the table in order to
    select a good execution plan.

3- Restructure SQL finding (see plan 1 in explain plans section)
----------------------------------------------------------------

RECOMMENDATIONS
--------------------------------------------------------------------------------
  The predicate TRUNC("TEST_TABLE"."EVENT_DATE")=TO_DATE(' 2025-02-04
  00:00:00', 'syyyy-mm-dd hh24:mi:ss') used at line ID 1 of the execution plan
  contains an expression on indexed column "EVENT_DATE". This expression
  prevents the optimizer from selecting indices on table "TEST"."TEST_TABLE".

  Recommendation
  --------------
  - Rewrite the predicate into an equivalent form to take advantage of
    indices. Alternatively, create a function-based index on the expression.

-------------------------------------------------------------------------------

RECOMMENDATIONS
--------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original
-----------
Plan hash value: 3979868219

--------------------------------------------------------------------------------
| Id  | Operation	  | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	       |  3603 |   123K|  1530	 (2)| 00:00:01 |

RECOMMENDATIONS
--------------------------------------------------------------------------------
|*  1 |  TABLE ACCESS FULL| TEST_TABLE |  3603 |   123K|  1530	 (2)| 00:00:01 |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TRUNC(INTERNAL_FUNCTION("EVENT_DATE"))=TO_DATE('
	      2025-02-04 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

创建索引并查询执行计划

CREATE INDEX idx_event_date ON test_table(event_date);

根据 DBMS_SQLTUNE 提供的建议,你可以应用这些优化建议来改进查询性能。例如,可能会建议创建新的索引、修改查询语句等。
优化建议: 查看 DBMS_SQLTUNE 提供的优化建议,了解哪些方面可以改进。
执行计划: 比较优化前后的执行计划,看看是否有显著变化。
执行时间: 比较优化前后的执行时间,看看性能是否有提升。

SQL_ID方式

DECLARE
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
sql_id => '8v8surz5t2173',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 60,
task_name => '8v8surz5t2173_tuning_task111',
description => 'Tuning task1 for statement 8v8surz5t2173');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
/


EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => '8v8surz5t2173_tuning_task111');

SET LONG 10000
SET LONGCHUNKSIZE 1000
SET LINESIZE 100
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('8v8surz5t2173_tuning_task111')
FROM   DUAL;

查询优化状态
SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='8v8surz5t2173_tuning_task111';
SQL> SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='8v8surz5t2173_tuning_task111';

TASK_NAME                                                    STATUS
------------------------------------------------------------ ----------------------
8v8surz5t2173_tuning_task111                                 COMPLETED

删除
SQL> EXEC DBMS_SQLTUNE.DROP_TUNING_TASK('8v8surz5t2173_tuning_task111');

PL/SQL procedure successfully completed.

SQL> SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='8v8surz5t2173_tuning_task111';

no rows selected

相关文章:

  • 软件测试常见面试题
  • 国内Ubuntu离线安装和配置Ollama服务
  • 实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)
  • Python查询成交量较前5天平均值
  • 250213-异常exception
  • RabbitMQ学习—day2—安装
  • 介绍下SpringBoot如何处理大数据量业务
  • 51单片机俄罗斯方块计分函数
  • linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上
  • CF Round 997 记录 题解 (div. 2 A - E)
  • 机器学习-监督学习
  • C++模板编程——typelist的实现
  • Unity-Mirror网络框架-从入门到精通之Pong示例
  • 【漫话机器学习系列】091.置信区间(Confidence Intervals)
  • (2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)
  • HCIA-Datacom笔记2:网络类型与网络拓扑
  • Linux权限提升-内核溢出
  • springboot241-springboot在线教学平台(源码+论文+PPT+部署讲解等)
  • 物联网平台-分布式的设备接入与管理系统
  • 探索DeepSeek:开源大模型领域的中国力量
  • c 建设web网站的流程图/教育培训机构平台
  • 网站建设推广咨询平台/济南seo的排名优化
  • 咸阳学校网站建设价格/链接买卖
  • 怎样做网站的优化 排名/上海优化seo排名
  • 网站建设大数据服务案例/百度推广培训班
  • 中山做网站建设联系电话/百度平台客服电话