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

时间:2011-03-11 02:57:20

标签: 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

3 个答案:

答案 0 :(得分:5)

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

所以不要修复INDEX提示的语法,去除它。

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

  

“总结BL_DETAILS和BL_FREIGHT   对于BL_CONTAINERS中的每一行。“

在这种情况下,您可能认为需要对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,它将向您展示数据库将如何执行查询。每个版本的查询优化器都会变得更好,因此您使用的是哪个版本的数据库都很重要。这是the documentation for 10g

需要注意的重要一点是,您需要为数据库提供准确的统计信息,以便它能够提出一个好的计划。 Find out more.

答案 1 :(得分:2)

在查询上运行explain并确保设置了正确的索引。将提高查询的速度

http://www.sql.org/sql-database/postgresql/manual/sql-explain.html

答案 2 :(得分:2)

您的问题表明查询需要9.968秒,您希望它为0.5秒或更短。只有在知道花费9.968秒的位置时,才能有效地完成这项工作(如果可能的话)。要知道查询中的时间花在哪里,您不仅要解释该语句,还要跟踪该查询的执行情况。后者将为您提供查询时间的细分方法。

OTN上有两个线程描述了如何做到这一点。

如果您想做到最低限度,请遵循以下规则: http://forums.oracle.com/forums/thread.jspa?messageID=1812597

如果您想提供完整的详细信息,请按以下步骤操作: http://forums.oracle.com/forums/thread.jspa?threadID=863295

快乐的追踪!

的问候,
罗布。