为什么interbase的View在使用了left outer join后,就变得非常慢了。
我数据库中的记录也才1000来条,但查询时却花了大概30秒时间,太慢了!
如果去掉left outer join后,只用两三秒就出来了。
大家有没有办法解决啊,谢谢!
问题点数:80、回复次数:4Top
1 楼CuteBit(康)回复于 2003-11-04 18:42:55 得分 0
你用的是 ib/fb? 版本?连接的两个表中的数据量?索引情况?最好把你全部 DDL 语句粘贴出来让我们分析.Top
2 楼powerpeople(小鬼)回复于 2003-11-08 09:02:14 得分 0
我用的是ib7.1,DLL如下:
CREATE VIEW "V_MONTHLYSUPPLIERSTOCKSH" (
"F_ID",
"F_NAME",
"F_MONTH",
"F_LASTMONTHSUM",
"F_STOCKSSUM",
"F_SALESUM",
"F_GROSSPROFITSUM",
"F_COSTSUM",
"F_BALANCESUM",
"F_PREPAYSUM",
"F_PAYABLE",
"F_PAYABLESUM"
) AS
SELECT T_SUPPLIER.F_ID, T_SUPPLIER.F_NAME,
V_SUPPLIERBALANCE.F_MONTH,
( V_SUPPLIERBALANCE.F_BALANCE + V_SUPPLIERSALE.F_COST - V_SUPPLIERSTOCKS.F_STOCKSSUM ) F_LASTMONTHSUM,
V_SUPPLIERSTOCKS.F_STOCKSSUM,
V_SUPPLIERSALE.F_SALESUM,
V_SUPPLIERSALE.F_GROSSPROFIT F_GROSSPROFITSUM,
V_SUPPLIERSALE.F_COST F_COSTSUM,
V_SUPPLIERBALANCE.F_BALANCE F_BALANCESUM,
V_SUPPLIERPREPAY.F_PREPAYSUM,
V_SUPPLIERSTOCKS.F_STOCKSSUM - V_SUPPLIERPREPAY.F_PREPAYSUM F_Payable,
T_SUPPLIER.F_Payable F_PayableSum
FROM V_SUPPLIERPREPAY
RIGHT OUTER JOIN T_SUPPLIER ON (V_SUPPLIERPREPAY.F_SUPPLIERID = T_SUPPLIER.F_ID)
LEFT OUTER JOIN V_SUPPLIERSALE ON (T_SUPPLIER.F_ID = V_SUPPLIERSALE.F_SUPPLIERID)
LEFT OUTER JOIN V_SUPPLIERBALANCE ON (T_SUPPLIER.F_ID = V_SUPPLIERBALANCE.F_SUPPLIERID)
LEFT OUTER JOIN V_SUPPLIERSTOCKS ON (T_SUPPLIER.F_ID = V_SUPPLIERSTOCKS.F_SUPPLIERID)
;Top
3 楼CuteBit(康)回复于 2003-11-10 23:34:00 得分 40
hi,powerpeople(小鬼)
你提供的资料漏了各个表中的数据量了.我猜你的 LEFT OUTER JOIN 的那些表的数据量应该不小,好像是业务数据表 :)
外连接本来就是很耗性能的一种查询,是性能的一个杀手.
建议你使用分析一下你的查询索引使用情况,以及索引状态,如果这些都不奏效,要提高性能就只能重新设计这部分了.Top
4 楼erickleung()回复于 2003-11-11 13:17:21 得分 40
To: powerpeople(小鬼)
用两个只10条纪录的表, 以一个 outer join 连的数据集是多少呢?
做四次外连接会是多少?
你可以考虑用 union 把两或几个sql select 组成你所需的数据集, 但省却不少资源.Top




