如何调整这个视图?获取时间需要 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。那么如何提供更好的性能的主要内容,如果未能解决你的问题,请参考以下文章

在两个方向调整视图大小?

如何在 iOS 7 中使用加载器

从自定义表格视图单元格类加载时如何调整单元格的高度?

如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?

如何从主 Activity 获取视图

输入长文本时如何调整文本视图的大小?