【发布时间】:2017-11-21 12:23:18
【问题描述】:
以下SQL:
SELECT *
FROM Transaction_Auth_Series t
WHERE t.Auth_ID =
(
SELECT MAX(p.Session_ID)
FROM Clone_Db_Derective p
WHERE p.Date = trunc(sysdate)
AND p.Regularity = 'THEME'
);
当引用的表包含大约 3 亿行时非常慢。但是,在两个游标中写入 SQL 只是几秒钟的问题,即
CURSOR GetMaxValue IS
SELECT MAX(p.Session_ID)
FROM Clone_Db_Derective p
WHERE p.Date = trunc(sysdate)
AND p.Regularity = 'THEME'
CURSOR GetAllItems(temp VARCHAR2) IS
SELECT *
FROM Transaction_Auth_Series t
WHERE t.Auth_ID = temp;
和
........
FOR item in GETMAX LOOP
FOR itemx in GETITEMS(item.aaa) LOOP.......
由于表不相关,联接将不起作用。请问如何优化上面的主SQL?
【问题讨论】:
-
执行计划可能不是最优的。例如,优化器可能已经在内部对其进行了转换,以根据表统计信息首先执行连接。如果是这样,您也许可以修复统计信息或重新排列或提示查询。
-
您能否详细说明您的建议@WilliamRobertson?
-
如果执行计划对于这样的简单查询不好,通常意味着统计信息错误。因此,SQL 调优练习涉及检查计划和查看统计信息。他们看起来怎么样?
-
统计 ----------------------------------------- ----------------- 1205 递归调用 0 db 块获取 87542484 一致获取 3225786 物理读取 10984 重做大小 833979 字节通过 SQLNet 发送到客户端 1862 字节通过 SQL来自客户端的网络 138 SQL*Net 往返客户端 23 排序(内存) 0 排序(磁盘) 2047 行处理
-
这很可爱,但不是执行计划或表统计信息。