【发布时间】:2019-02-20 13:53:54
【问题描述】:
优化查询
我有一个查询从一个表中获取数据并从其他两个表中获取两个计数 在 varchar 字段类型上。我需要从 TABLE2 中获取计数,其中 TYPE=TABLE1.TYPE 和 从 TABLE3 开始计数,其中 TYPE=TABLE1.TYPE
此时我无法在这些字段上创建任何索引,因此我决定使用能带来原始查询执行时间的函数 减少到 5 秒,这仍然太多了。有关如何进一步优化我的查询的任何建议?
SELECT a.ID,
a.FIELD1,
a.FIELD2,
a.TYPE,
GET_COUNT_1(a.TYPE) as COUNT1,
GET_COUNT_2(a.TYPE) as COUNT2,
FROM TABLE1 a
我原来的查询是:
SELECT a.ID,
a.FIELD1,
a.FIELD2,
a.TYPE,
(SELECT COUNT(*) FROM TABLE2 b WHERE b.TYPE=a.TYPE) as COUNT1,
(SELECT COUNT(*) FROM TABLE3 c WHERE c.TYPE=a.TYPE) as COUNT2
FROM TABLE1 a
【问题讨论】:
-
您尝试过使用 JOIN 吗?可以发一下你原来的SQL和时间吗?
-
对选定的每一行使用一个函数不太可能是最快的方法,因为 SQL 和 PL/SQL 之间的上下文切换。您可以尝试相关的子查询 - 例如(select count(*) from table2 where table2.type=a.type) as count1 - 但加入通常会提供最佳性能。你有关于表格的最新统计信息吗?什么是使用 join 的查询计划?
-
@rs。我添加了我的原始查询,虽然我知道它非常低效
-
@Lord Peter,这正是我之前所做的,花了大约 15 秒。使用功能它下降到 5 秒
-
两个子查询似乎相同,应该产生相同的计数。这真的是你想要的吗?