作者lueichun (no anonymous)
看板Database
标题[SQL ] Oracle查询语句效能
时间Tue Apr 30 11:13:41 2019
资料库名称:Oracle
资料库版本:12c
内容/问题描述:我有一段同时join好几张表格的查询sql:
select * from t1,t2,t3,t4
where tl.t1a=t2.t2a
and t1.t1b=t2.t2b
and t1.t1c=t2.t2c
and t1.t1d=t2.t2d
and t3.t3a=t1.t1c
and t3.t3b='AAA'
and t2.t2e='BBB'
and t1.t1e=t4.t4a
这样的语法,在查询时的效率尚可,但是如果将上面的语法变成子查询,
然後查出共有多少笔资料:
slect count(*) from
(
select * from t1,t2,t3,t4
where tl.t1a=t2.t2a
and t1.t1b=t2.t2b
and t1.t1c=t2.t2c
and t1.t1d=t2.t2d
and t3.t3a=t1.t1c
and t3.t3b='AAA'
and t2.t2e='BBB'
and t1.t1e=t4.t4a
)
写成以上这样,要去取得资料的总笔数,速度却慢了将近10倍!!
第一笔SQL花3秒钟,第二笔SQL却花了整整30秒!!
请问这样的话,有办法只修改SQL本身,让查询总笔数的SQL可以加速吗
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.216.198.51
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1556594023.A.7BE.html
1F:推 criky: 直接把1的*改成count(*)呢? 04/30 13:05
2F:推 bij831: plan 有差很多?加paraller 试看看 05/03 11:21
3F:推 terader: 建议不要用count(*),可以的话将*改成栏位名称 05/08 15:16
4F:→ terader: 另外注意一下是否有工具的问题,像在SQLDeveloper执行 05/08 15:19
5F:→ terader: 你的第一种SQL的话,理论上会先吐50笔给你,但背後可能 05/08 15:20
6F:→ terader: 还在执行,若可以的话可从EM去监控SQL执行状况 05/08 15:20