如何调整这个视图?获取时间需要 9.968,但我想要 0.5。那么如何提供更好的性能
Posted
技术标签:
【中文标题】如何调整这个视图?获取时间需要 9.968,但我想要 0.5。那么如何提供更好的性能【英文标题】:how to tune this view?fetching time takes 9.968 but i want in .5. so how to give better performance 【发布时间】:2011-03-11 02:57:19 【问题描述】: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
【问题讨论】:
您的提示中有一些拼写错误,所以 Oracle 会忽略它。没有尾随)
,并且ID_BL_REF_NO
不是查询中的表。
此外,没有别名(加上我们看不到您的数据库的事实)我们只能猜测哪些列属于哪些表。
【参考方案1】:
您的 WHERE 子句仅包含连接。没有过滤器。这意味着您的查询需要考虑至少一个表中的所有行。由此可见,您的查询应该对至少一个表执行全表扫描,而不是索引读取。全表扫描是获取表中所有行的最有效方法。
所以不要修正你的 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 有解释计划,它将向您展示数据库将如何执行查询。每个版本的查询优化器都会变得更好,因此您使用的数据库版本很重要。这里是the documentation for 10g。
需要注意的重要一点是,您需要为数据库提供准确的统计信息,以便它提出一个好的计划。 Find out more.
【讨论】:
【参考方案2】:在您的查询上运行 explain
并确保设置了正确的索引。会提高查询速度
http://www.sql.org/sql-database/postgresql/manual/sql-explain.html
【讨论】:
请注意,索引可能提高性能,但explain plan
不会自行改变性能。【参考方案3】:
您的问题表明查询需要 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
追踪愉快!
问候, 抢。
【讨论】:
以上是关于如何调整这个视图?获取时间需要 9.968,但我想要 0.5。那么如何提供更好的性能的主要内容,如果未能解决你的问题,请参考以下文章