如何调整此视图?获取时间需要9.968但我想要.5.那么如何提供更好的表现呢

Ran*_*mar 0 sql oracle query-tuning

SELECT
/*+ INDEX(ID_BL_REF_NO REF_number_BL_idx*/ DECODE(BL_TYPE,'E',BL_ORIGIN_NAME,'I',BL_FINAL_NAME) FROM_PORT,
 DECODE(BL_TYPE,'I',BL_ORIGIN_NAME,'E',BL_FINAL_NAME) TO_PORT,
(BL_VESSEL_CONNECT||'/'||BL_VOYAGE_CONNECT||'/'||BL_PORT_CONNECT) Mother_vessel_voyage_port,
SUM(BLC_SIZE) No_of_20s,
SUM(BLC_SIZE)  No_of_40s,
SUM(DECODE(BLC_SIZE,'20',1,'40',2)) Teus,
SUM(BLC_GROSSWT) GrossWt,
round((BLC_GROSSWT/SUM(DECODE(BLC_SIZE,'20',1,'40',2))),2) AverageWt,
SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)) PREPAID,
SUM(DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)) COLLECT,
SUM(DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT)) ELSEWHERE,
(SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT))/SUM(DECODE(BLC_SIZE,'20',1,'40',2))) AVERAGE
FROM ID_BL_DETAILS,id_bl_containers,ID_BL_FREIGHT
WHERE BL_REFNO=BLC_REFNO
AND BLF_REFNO=BLC_REFNO
GROUP BY BL_VESSEL_CONNECT,BL_VOYAGE_CONNECT,BL_PORT_CONNECT,BL_ORIGIN_NAME,BL_LODPORT,BL_DISPORT,BL_FINAL_NAME,BLC_GROSSWT,BL_TYPE
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 5

您的WHERE子句仅包含连接.没有过滤器.这意味着您的查询需要考虑至少一个表中的所有行.由此可见,您的查询应该执行至少一个表的FULL TABLE SCAN,而不是索引读取.全表扫描是获取表中所有行的最有效方法.

因此,不要修复INDEX提示的语法,摆脱它.

接下来,找出应该驱动查询的表.这是业务逻辑.可能你的要求是这样的

"总结BL_CONTAINERS中每一行的BL_DETAILS和BL_FREIGHT."

在这种情况下,您可能认为需要对BL_CONTAINERS进行全表扫描.但是如果BL_FREIGHT的行数多于BL_CONTAINERS,并且每个BLF_REF_NO都匹配BL_REF_NO(即BL_FREIGHT.BLF_REF_NO引用BL_CONTAINERS.BL_REF_NO时有外键),那么从BL_FREIGHT驱动可能会更好.

请注意,如果您只对具有匹配BL_FREIGHT行的BL_CONTAINERS感兴趣,则情况属实.但是如果要包含尚未使用的容器(即它们没有匹配的BL_FREIGHT记录),则需要使用外连接并驱除BL_CONTAINERS表.

将BL_DETAILS投入混合时,这些注意事项会变得更加复杂.您的报告似乎基于BL_DETAILS类别(因为Jeffrey注意到我们很难理解您的查询而没有别名或描述).所以也许BL_DETAILS是驾驶表的合适人选.

如您所见,调优需要深入了解业务逻辑和数据模型的详细信息.你有本地知识,我们没有.

有一些工具可以帮助你.Oracle有EXPLAIN PLAN,它将向您展示数据库将如何执行查询.每个版本的查询优化器都会变得更好,因此您使用的是哪个版本的数据库都很重要.这是10g的文档.

需要注意的重要一点是,您需要为数据库提供准确的统计信息,以便为其提供一个好的计划. 了解更多.