搜索
首页数据库mysql教程SQL Access Advisor的使用

问题 下面是一个典型问题。应用程序发出了以下 SQL 语句。该查询乎要消耗大量资源并且速度很慢。 select store_id, guest_id, count(1) cnt from res r, trans t where r.res_id between 2 and 40 and t.res_id = r.res_id group by store_id, guest_id / 您

问题

下面是一个典型问题。应用程序发出了以下 SQL 语句。该查询似乎要消耗大量资源并且速度很慢。

<span>select store_id, guest_id, count(1) cnt from res r, trans t where r.res_id between 2 and 40 and t.res_id = r.res_id group by store_id, guest_id /                        
 
您可以通过命令行或 Oracle 企业管理器数据库控制与顾问程序进行交互,但<strong>使用</strong> GUI 可以提供更好的值(GUI 可让您将解决方案可视化,并将许多任务简化为简单的点击操作)。
</span><p><span>要<strong>使用</strong>企业管理器中的 SQL Access Advisor 解决 SQL 中的问题,请遵循以下步骤。</span></p><ol>
<li>
<span>当然,第一个任务是启动企业管理器。在 Database 主页上,向下滚动到页面底部,您将在这里看到几个超链接,如下图所示:          </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F114311.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>在该菜单中,单击 <strong>Advisor Central</strong>,这将显示一个与下图类似的屏幕。下面仅显示了该屏幕的顶部。         </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F117605.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>单击 <strong>SQL Advisors</strong>,这将显示一个与下图类似的屏幕。  </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F123806.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>在该屏幕中,您可以计划 SQL Access Advisor 会话,并指定其选项。顾问程序必须收集一些要<strong>使用</strong>的 SQL 语句。最简单的选项就是通过 Current and Recent SQL Activity 从共享池获取它们。选择该选项,您可以获取共享池中缓存的所有 SQL 语句来进行分析。 </span><p><span>但是,在某些情况下,您并不需要共享池中的所有语句;而仅需要其中的一组特定语句。为此,您需要在另一个屏幕上创建一个“SQL 调整工具集”,然后在这里(即,该屏幕中)引用集合名。 </span></p>
<p><span>此外,您可能希望根据理论上预期会发生的情况来运行复合负载。这些类型的 SQL 语句将不会位于共享池中,因为它们尚未处理。相反,您需要创建这些语句并将其存储在一个特殊表中。在第三个选项 (<strong>Create a Hypothetical Workload...</strong>) 中,您需要提供该表的名称以及模式名。    </span></p>
<p><span>对于本文,假设您希望从共享池中获取 SQL。因此,选择第一个选项(即默认选项),如屏幕所示。 
</span></p>
</li>
<li>
<span>但是,您可能并不需要所有语句,而只需要一些关键语句。例如,您可能只希望分析用户 SCOTT(即应用程序用户)执行的 SQL。所有其他用户可能会执行即席 SQL 语句,但您希望在分析中排除它们。在这种情况下,单击 <strong>Filter Options</strong> 前面的“+”号,如下图所示。      </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F104252.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li><span>在该屏幕中,在要求您输入用户的文本框中输入 SCOTT,然后选择单选按钮 <strong>Include only SQL...</strong>(默认选项)。同样,您也可以排除某些用户。例如,您希望捕获数据库中的所有活动,除了用户 SYS、SYSTEM 和 SYSMAN。您可以在文本框中输入这些用户,然后单击按钮 <strong>Exclude all SQL statements...</strong>。 </span></li>
<li><span>您可以按 Module Id、Action 甚至 SQL 语句中的特定字符串来过滤语句中访问的表。其目的是确保只分析感兴趣的语句。选择整个 SQL 缓存的小型子集可以加快分析速度。在本例中,我们假设用户 SCOTT 仅执行了一个语句。如果不是这样,您可以施加额外的过滤条件,将分析集合减少到只有一个 SQL(即,原始问题语句中提到的那个 SQL)。 </span></li>
<li>
<span>单击 <strong>Next</strong>。这将显示以下屏幕(仅显示了顶部):     </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F104207.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li><span>在该屏幕中,您可以指定应该搜索哪些类型的建议。例如,在本例中,我们希望顾问程序查找潜在的索引、物化视图和分区,因此应选中这些项旁边的所有复选框。对于 Advisor Mode,您可以进行选择;默认选项 Limited Mode 仅处理高成本 SQL 语句。当然,这可以加快速度并获得更好的结果集。要分析所有 SQL,应<strong>使用</strong> Comprehensive Mode。(在本例中,模式的选择无关紧要,因为您只有一个 SQL。) </span></li>
<li><span>屏幕的后半部分显示了高级选项,例如,应该如何确定 SQL 语句的优先顺序、所<strong>使用</strong>的表空间等等。您可以保留默认项为标记状态(稍后将描述更多内容)。单击 <strong>Next</strong>,这将显示计划屏幕。选择 <strong>Run Immediately</strong>,并单击 <strong>Next</strong>。 </span></li>
<li><span>单击 <strong>Submit</strong>。这将创建一个 Scheduler 作业。您可以单击该屏幕中显示的作业超链接,它们位于页面顶部。作业将显示为 <strong>Running</strong>。 </span></li>
<li><span>反复单击 <strong>Refresh</strong> 直到您看到 <strong>Last Run Status</strong> 列下方的值更改为 <strong>SUCCEEDED</strong>。 </span></li>
<li>
<span>现在,返回 Database 主页并单击 <strong>Advisor Central</strong>,正如您在第一步中所做的那样。现在,您将看到 <strong>SQL Access Advisor</strong> 行,如下图所示:  </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F123123.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>该屏幕表明 SQL Access Advisor 任务已经 <strong>COMPLETED</strong>。现在,单击按钮 <strong>View Result</strong>。屏幕显示如下:     </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F119058.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>该屏幕说明了一切!SQL Access Advisor 分析了 SQL 语句,并发现某些解决方案可以将查询性能提高十倍。要查看提供了哪些具体建议,单击 <strong>Recommendations</strong> 选项卡,这将显示详细信息屏幕,如下所示。       </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F116660.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>从较高级别看,该屏幕提供了许多很好的信息。例如,对于 ID = 1 的语句,Actions 列下方有两个建议操作。下一列 Action Types 显示了操作类型,由彩色方块表示。根据下方的图标指南,您可以了解这两个操作分别针对索引和分区。它们可以共同将性能提高几个数量级。 </span><p><span>要确切了解可以提高哪个 SQL 语句,单击 ID,这将显示以下屏幕。当然,该分析只有一个语句,因此这里只显示一项内容。如果您有多个语句,应该可以看到所有内容。     </span></p>
<p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F104210.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>在上面的屏幕上,请注意 Recommendation ID 列。单击超链接将显示详细建议,如下所示:      </span><p><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fwww.oracle.com%2Focom%2Fgroups%2Fpublic%2F%40otn%2Fdocuments%2Fdigitalasset%2F116329.jpg&refer=http%3A%2F%2Fblog.csdn.net%2Fhaungyuncheng%2Farticle%2Fdetails%2F23039705" class="lazy" alt="SQL Access Advisor的使用" ></span></p>
</li>
<li>
<span>该屏幕将提供非常清楚的解决方案描述。它提出了两个建议:创建分区表和<strong>使用</strong>索引。随后,它发现索引已经存在,因此建议保留该索引。 </span><p><span>如果您单击 Action 列下方的 <strong>PARTITION TABLE</strong>,将看到 Oracle 为使其成为分区表而生成的实际脚本。但是,在单击之前,在文本框中填入表空间名称。这将允许 SQL Access Advisor 在构建该脚本时<strong>使用</strong>该表空间:</span></p>
<pre class="brush:php;toolbar:false"><span>Rem 
Rem Repartitioning table "SCOTT"."TRANS"
Rem 

SET SERVEROUTPUT ON
SET ECHO ON

Rem 
Rem Creating new partitioned table
Rem 
CREATE TABLE "SCOTT"."TRANS1" 
(    "TRANS_ID" NUMBER, 
    "RES_ID" NUMBER, 
    "TRANS_DATE" DATE, 
    "AMT" NUMBER, 
    "STORE_ID" NUMBER(3,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS" 
PARTITION BY RANGE ("RES_ID") INTERVAL( 3000) ( PARTITION VALUES LESS THAN (3000)
);

begin
dbms_stats.gather_table_stats('"SCOTT"', '"TRANS1"', NULL, dbms_stats.auto_sample_size);
end;
/

Rem 
Rem Copying constraints to new partitioned table
Rem 
ALTER TABLE "SCOTT"."TRANS1" MODIFY ("TRANS_ID" NOT NULL ENABLE);

Rem 
Rem Copying referential constraints to new partitioned table
Rem 
ALTER TABLE "SCOTT"."TRANS1" ADD CONSTRAINT "FK_TRANS_011" FOREIGN KEY ("RES_ID")
     REFERENCES "SCOTT"."RES" ("RES_ID") ENABLE;

Rem 
Rem Populating new partitioned table with data from original table
Rem 
INSERT /*+ APPEND */ INTO "SCOTT"."TRANS1"
SELECT * FROM "SCOTT"."TRANS";
COMMIT;

Rem 
Rem Renaming tables to give new partitioned table the original table name
Rem 
ALTER TABLE "SCOTT"."TRANS" RENAME TO "TRANS11";
ALTER TABLE "SCOTT"."TRANS1" RENAME TO "TRANS";              </span>

脚本实际上将构建一个新表,然后将其重命名以匹配原始表。

  • 最后一个选项卡 Details 将显示有关任务的某些有趣的详细信息。尽管它们对于分析并不重要,但可以提供有关顾问程序如何得出这些结论的有价值线索,从而有助于您自己的思考过程。该屏幕分为两部分,第一个部分是 Workload and Task Options,如下所示。

    SQL Access Advisor的使用

  • 屏幕的后半部分显示任务的运行日志。有时,顾问程序无法处理所有 SQL 语句。如果某些 SQL 语句被舍弃,就会在这里显示,并计入 Invalid SQL String:Statements discarded 计数。如果您不明白为什么只分析了数个 SQL 语句,下面就是原因。

    SQL Access Advisor的使用


  • 高级选项

    在上面的第 10 步中,我使用了一个对高级设置的引用。我们来看看这些设置的作用。

    单击 Advanced Options 左侧的加号,这将显示一个屏幕,如下所示:

    SQL Access Advisor的使用

    该屏幕允许您输入将在其中创建索引的表空间的名称、索引的创建模式等。对于分区建议,您可以指定实现分区的表空间等。

    看来,最重要的元素是 Consider access structures creation costs recommendations 复选框。如果您选中该复选框,SQL Access Advisor 将考虑索引本身的创建成本。例如,是否应该创建 10 个新索引,相关成本可能会导致 SQL Access Advisor 建议不创建它们。

    您还可以在该屏幕中指定索引的最大大小。


    与 SQL Tuning Advisor 的差异

    在简介中,我只简单描述了该工具与 SQL Tuning Advisor 的不同,下面我们来详细说明它们之间的差异。一个简单演示可以最好地说明这些差异。

    SQL Advisors 屏幕中,选择 SQL Tuning Advisor 并运行。完成后,下面是显示结果的屏幕部分:

    SQL Access Advisor的使用

    现在,如果您单击 View 查看建议,将显示一个如下所示的屏幕:

    SQL Access Advisor的使用

    SQL Tuning Advisor 提出的建议只对应以下四个目标之一:

    • 为统计信息丢失或失效的对象收集统计信息
    • 考虑优化器的任何数据偏差、复杂谓词或失效的统计信息
    • 重新构建 SQL 以优化性能
    • 提出新索引建议

    用例

    1. 搜索高成本 SQL 语句,或者(更好的是)评估整个负载。
    2. 将可疑语句放入 SQL 调整工具集。
    3. 使用 SQL Tuning Advisor 和 SQL Access Advisor 对其进行分析。
    4. 得到分析结果;记录建议。
    5. 将建议插入 SQL Performance Analyzer(参见本文)。
    6. 在 SQL Performance Analyzer 中检查更改前后的情况,并得出最佳解决方案。
    7. 重复上述操作,直到获得最佳模式设计。
    8. 获得最佳模式设计之后,您可能希望使用 SQL 计划管理基准锁定该计划(如本文所述)。

    结论

    调整数据库结构是最费时费力的棘手任务之一,同时也是最有成效的任务之一。同样,分区是一个非常有效的调整工具,但分区的选择很难轻松决定。SQL Access Advisor 在这些过程中提供了一个非常有用的帮助。

    声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    MySQL中的存储过程是什么?MySQL中的存储过程是什么?May 01, 2025 am 12:27 AM

    存储过程是MySQL中的预编译SQL语句集合,用于提高性能和简化复杂操作。1.提高性能:首次编译后,后续调用无需重新编译。2.提高安全性:通过权限控制限制数据表访问。3.简化复杂操作:将多条SQL语句组合,简化应用层逻辑。

    查询缓存如何在MySQL中工作?查询缓存如何在MySQL中工作?May 01, 2025 am 12:26 AM

    MySQL查询缓存的工作原理是通过存储SELECT查询的结果,当相同查询再次执行时,直接返回缓存结果。1)查询缓存提高数据库读取性能,通过哈希值查找缓存结果。2)配置简单,在MySQL配置文件中设置query_cache_type和query_cache_size。3)使用SQL_NO_CACHE关键字可以禁用特定查询的缓存。4)在高频更新环境中,查询缓存可能导致性能瓶颈,需通过监控和调整参数优化使用。

    与其他关系数据库相比,使用MySQL的优点是什么?与其他关系数据库相比,使用MySQL的优点是什么?May 01, 2025 am 12:18 AM

    MySQL被广泛应用于各种项目中的原因包括:1.高性能与可扩展性,支持多种存储引擎;2.易于使用和维护,配置简单且工具丰富;3.丰富的生态系统,吸引大量社区和第三方工具支持;4.跨平台支持,适用于多种操作系统。

    您如何处理MySQL中的数据库升级?您如何处理MySQL中的数据库升级?Apr 30, 2025 am 12:28 AM

    MySQL数据库升级的步骤包括:1.备份数据库,2.停止当前MySQL服务,3.安装新版本MySQL,4.启动新版本MySQL服务,5.恢复数据库。升级过程需注意兼容性问题,并可使用高级工具如PerconaToolkit进行测试和优化。

    您可以使用MySQL的不同备份策略是什么?您可以使用MySQL的不同备份策略是什么?Apr 30, 2025 am 12:28 AM

    MySQL备份策略包括逻辑备份、物理备份、增量备份、基于复制的备份和云备份。1.逻辑备份使用mysqldump导出数据库结构和数据,适合小型数据库和版本迁移。2.物理备份通过复制数据文件,速度快且全面,但需数据库一致性。3.增量备份利用二进制日志记录变化,适用于大型数据库。4.基于复制的备份通过从服务器备份,减少对生产系统的影响。5.云备份如AmazonRDS提供自动化解决方案,但成本和控制需考虑。选择策略时应考虑数据库大小、停机容忍度、恢复时间和恢复点目标。

    什么是mySQL聚类?什么是mySQL聚类?Apr 30, 2025 am 12:28 AM

    MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

    如何优化数据库架构设计以在MySQL中的性能?如何优化数据库架构设计以在MySQL中的性能?Apr 30, 2025 am 12:27 AM

    在MySQL中优化数据库模式设计可通过以下步骤提升性能:1.索引优化:在常用查询列上创建索引,平衡查询和插入更新的开销。2.表结构优化:通过规范化或反规范化减少数据冗余,提高访问效率。3.数据类型选择:使用合适的数据类型,如INT替代VARCHAR,减少存储空间。4.分区和分表:对于大数据量,使用分区和分表分散数据,提升查询和维护效率。

    您如何优化MySQL性能?您如何优化MySQL性能?Apr 30, 2025 am 12:26 AM

    tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

    螳螂BT

    螳螂BT

    Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    SecLists

    SecLists

    SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)