暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 使用用户定义的工作量填充 SQL调整集

原创 Asher.HU 2021-02-04
539


工作负载由一个或多个SQL语句以及完全描述每个语句的统计信息和属性组成。

完整的工作负载包含目标业务应用程序中的所有SQL语句。部分工作负载包含SQL语句的子集。区别在于,对于完整的工作负载,SQL Access Advisor可能建议删除未使用的实例化视图和索引。

没有工作负载,就无法使用SQL Access Advisor。SQL Access Advisor根据特定的统计信息,业务重要性或两者的组合对条目进行排名,这使Advisor可以首先处理最重要的SQL语句。

SQL Access Advisor在基于实际使用情况的工作负载下表现最佳。您可以采用SQL调优集的形式存储多个工作负载,以便可以在数据库实例启动和关闭的整个生命周期中,长期查看实际数据仓库或OLTP环境的不同用途。

下表描述了可用于用用户定义的工作负荷填充STS的过程。

表25-1加载STS的过程

程序描述了解更多

DBMS_SQLTUNE.LOAD_SQLSET 

 DBMS_SQLSET.LOAD_SQLSET

使用一组选定的SQL填充SQL调整集。您可以多次调用该过程以添加新的SQL语句或替换现有语句的属性。

Oracle数据库PL / SQL软件包和类型参考

DBMS_ADVISOR.COPY_SQLWKLD_TO_STS

将SQL工作负载数据复制到用户指定的SQL调整集中。用户必须具有所需的SQL调优设置特权和所需的ADVISOR特权。

Oracle数据库PL / SQL软件包和类型参考

假设条件

本教程假定您要执行以下操作:

  • 创建一个表以sh.user_workload存储有关SQL语句的信息
  • sh.user_workload使用有关sh架构 中表的三个查询的信息加载
  • 填充中创建的STS  创建SQL调优集作为输入的SQL访问顾问 中包含的工作量sh.user_workload
  • 使用DBMS_SQLTUNE.LOAD_SQLSET代替DBMS_SQLSET.LOAD_SQLSET

要用用户定义的工作量填充STS:

  1. 在SQL * Plus中,以user身份登录数据库sh
  2. 创建user_workload表。

    例如,输入以下命令:

    DROP TABLE user_workload;
    CREATE TABLE user_workload
    (
      username             varchar2(128),   /* User who executes statement */
      module               varchar2(64),        /* Application module name */
      action               varchar2(64),        /* Application action name */
      elapsed_time         number,               /* Elapsed time for query */
      cpu_time             number,                   /* CPU time for query */
      buffer_gets          number,        /* Buffer gets consumed by query */
      disk_reads           number,         /* Disk reads consumed by query */
      rows_processed       number,         /* # of rows processed by query */
      executions           number,            /* # of times query executed */
      optimizer_cost       number,             /* Optimizer cost for query */
      priority             number,             /* User-priority (1,2 or 3) */
      last_execution_date  date,               /* Last time query executed */
      stat_period          number,          /* Window exec time in seconds */
      sql_text             clob                           /* Full SQL Text */
    );
    
    复制
  3. user_workload用有关查询的信息加载表。

    例如,执行以下语句:

    -- aggregation with selection
    INSERT INTO user_workload (username, module, action, priority, sql_text)
    VALUES ('SH', 'Example1', 'Action', 2,
    'SELECT   t.week_ending_day, p.prod_subcategory, 
              SUM(s.amount_sold) AS dollars, s.channel_id, s.promo_id
     FROM     sales s, times t, products p 
     WHERE    s.time_id = t.time_id
     AND      s.prod_id = p.prod_id 
     AND      s.prod_id > 10 
     AND      s.prod_id < 50
     GROUP BY t.week_ending_day, p.prod_subcategory, s.channel_id, s.promo_id')
    /
     
    -- aggregation with selection
    INSERT INTO user_workload (username, module, action, priority, sql_text)
    VALUES ('SH', 'Example1', 'Action', 2,
     'SELECT   t.calendar_month_desc, SUM(s.amount_sold) AS dollars
      FROM     sales s , times t
      WHERE    s.time_id = t.time_id
      AND      s.time_id BETWEEN TO_DATE(''01-JAN-2000'', ''DD-MON-YYYY'')
      AND      TO_DATE(''01-JUL-2000'', ''DD-MON-YYYY'')
      GROUP BY t.calendar_month_desc')
    /
     
    -- order by
    INSERT INTO user_workload (username, module, action, priority, sql_text)
    VALUES ('SH', 'Example1', 'Action', 2,
     'SELECT   c.country_id, c.cust_city, c.cust_last_name
      FROM     customers c
      WHERE    c.country_id IN (52790, 52789)
      ORDER BY c.country_id, c.cust_city, c.cust_last_name')
    /
    COMMIT;
    
    复制
  4. 执行一个PL / SQL程序,用user_workload表中的行填充游标,然后将该游标的内容加载到名为的STS中MY_STS_WORKLOAD

    例如,执行以下PL / SQL程序:

    DECLARE
      sqlset_cur DBMS_SQLTUNE.SQLSET_CURSOR;
    BEGIN
      OPEN sqlset_cur FOR
        SELECT SQLSET_ROW(null,null, SQL_TEXT, null, null, 'SH', module,
                         'Action', 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, null, 2, 3,
                         sysdate, 0, 0, null, 0, null, null)
        FROM USER_WORKLOAD;
      DBMS_SQLTUNE.LOAD_SQLSET('MY_STS_WORKLOAD', sqlset_cur);
    END;
    /
    复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论