来自农村的老实娃
分类: Oracle
2007-11-27 14:42:54
但请考虑以下调整案例:假设一个索引确实有助于某个查询,但该查询只执行一次。这样,即使该查询可以得益于此索引,但创建索引的成本也会超出其带来的好处。要按这种方式分析案例,您需要了解查询的访问频率和原因。
另一个顾问程序 (SQL Access Advisor) 可执行这种类型的分析。除了像在 Oracle 数据库 10g 中一样可以分析索引、物化视图等,Oracle 数据库 11g 中的 SQL Access Advisor 还可以分析表和查询以识别可能的分区策略 — 这在设计最佳模式时可以提供很大帮助。在 Oracle 数据库 11g 中,SQL Access Advisor 现在可以提供与整个负载相关的建议,包括考虑创建成本和维护访问结构。在本文中,您将了解新的 SQL Access Advisor 如何解决常见问题。(注:出于演示目的,我们将通过一个语句演示这个功能;但是,Oracle 建议使用 SQL Access Advisor 来帮助调整整个负载,而不只是一个 SQL 语句。)
下面是一个典型问题。应用程序发出了以下 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 涉及两个表,即 RES 和 TRANS;后者是前者的子表。您需要找到提高查询性能的解决方案 — SQL Access Advisor 正是最合适的工具。
您可以通过命令行或 Oracle 企业管理器数据库控制与顾问程序进行交互,但使用 GUI 可以提供更好的值(GUI 可让您将解决方案可视化,并将许多任务简化为简单的点击操作)。
要使用企业管理器中的 SQL Access Advisor 解决 SQL 中的问题,请遵循以下步骤。
但是,在某些情况下,您并不需要共享池中的所有语句;而仅需要其中的一组特定语句。为此,您需要在另一个屏幕上创建一个“SQL 调整工具集”,然后在这里(即,该屏幕中)引用集合名。
此外,您可能希望根据理论上预期会发生的情况来运行复合负载。这些类型的 SQL 语句将不会位于共享池中,因为它们尚未处理。相反,您需要创建这些语句并将其存储在一个特殊表中。在第三个选项 (Create a Hypothetical Workload...) 中,您需要提供该表的名称以及模式名。
对于本文,假设您希望从共享池中获取 SQL。因此,选择第一个选项(即默认选项),如屏幕所示。
要确切了解可以提高哪个 SQL 语句,单击 ID,这将显示以下屏幕。当然,该分析只有一个语句,因此这里只显示一项内容。如果您有多个语句,应该可以看到所有内容。
如果您单击 Action 列下方的 PARTITION TABLE,将看到 Oracle 为使其成为分区表而生成的实际脚本。但是,在单击之前,在文本框中填入表空间名称。这将允许 SQL Access Advisor 在构建该脚本时使用该表空间:
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";脚本实际上将构建一个新表,然后将其重命名以匹配原始表。
在上面的第 10 步中,我使用了一个对高级设置的引用。我们来看看这些设置的作用。
单击 Advanced Options 左侧的加号,这将显示一个屏幕,如下所示:
该屏幕允许您输入将在其中创建索引的表空间的名称、索引的创建模式等。对于分区建议,您可以指定实现分区的表空间等。
看来,最重要的元素是 Consider access structures creation costs recommendations 复选框。如果您选中该复选框,SQL Access Advisor 将考虑索引本身的创建成本。例如,是否应该创建 10 个新索引,相关成本可能会导致 SQL Access Advisor 建议不创建它们。
您还可以在该屏幕中指定索引的最大大小。
在简介中,我只简单描述了该工具与 SQL Tuning Advisor 的不同,下面我们来详细说明它们之间的差异。一个简单演示可以最好地说明这些差异。
从 SQL Advisors 屏幕中,选择 SQL Tuning Advisor 并运行。完成后,下面是显示结果的屏幕部分:
现在,如果您单击 View 查看建议,将显示一个如下所示的屏幕:
SQL Tuning Advisor 提出的建议只对应以下四个目标之一:
调整数据库结构是最费时费力的棘手任务之一,同时也是最有成效的任务之一。同样,分区是一个非常有效的调整工具,但分区的选择很难轻松决定。SQL Access Advisor 在这些过程中提供了一个非常有用的帮助。