[英]Improve query performance and maintainability
我有一個這樣的查詢:
select Table1.column1 AS CODE, COUNT(DINSTINCT(Table2.column1 || '|' || Table2.column2)) AS COUNT
FROM Table2
INNER JOIN Table3 ON Table3.referenceColumn = Table2.referenceColumn
INNER JOIN Table1 ON Table1.referenceColumn = Table2.referenceColumn
WHERE
....
AND Table1.column1 <> ''
查詢的輸出將是這樣的,基本上是一個 CODE 和相應的 COUNT,例如:
CODE COUNT
ref002 3
ref003 1
在第一個查詢之后,我有一個foreach
將迭代上述查詢的結果。 在foreach
內部,對於上面查詢的每個結果,我想獲取一些在 Table3 中可用的信息,基本上,我想要每個 CODE(Table1.Column1)的 Table3.column1 中的所有值。 所以在foreach
我有另一個查詢來獲取每個迭代結果的 Table3.column:
select Table3.column1
FROM Table3
INNER JOIN Table3 ON Table3.referenceColumn = Table2.referenceColumn
INNER JOIN Table1 ON Table1.referenceColumn = Table2.referenceColumn
WHERE ....
AND Table1.column1 = (equal to a parameter (Table1.column1) that is available in each foreach iteration)
像這樣,我可以獲得第一個查詢的每個 Table1.column1(對於每個 CODE)的所有Table3.column1
值。
懷疑
兩個查詢幾乎相同。 foreach
之前的查詢和foreach
內部的查詢之間的唯一區別在於SELECT
部分和WHERE
,基本上 where 只是有一個附加條件。 因此,這兩個查詢在性能和可維護性方面似乎不太好,因為這兩個查詢幾乎相同。 因此應該可以在第一個查詢中獲得所有必要的信息,而不是在foreach
中使用第二個查詢。
您知道在第一個查詢中需要更改什么,除了返回 CODE 和 COUNT 之外,還為每個 CODE 返回 Table3.column1 中的所有值嗎? 那么可以刪除 foreach 中的查詢並獲得只需要一個查詢(第一個查詢)所需的所有內容? 第一個查詢的必要輸出應該是這樣的:
CODE COUNT IDNUMBERS
ref002 3 ab00, cd00
ref003 1 ef00
您的策略為每個代碼生成一個查詢,加上一個用於初始查詢的查詢,因此這確實是低效的。
一個簡單的選擇是在原始查詢中使用字符串聚合函數來生成附加列。
在 Oracle 中,您可以listagg()
使用listagg()
:
select
t1.column1 as code,
count(distinct t2.column1 || '|' || t2.column2) as cnt,
listagg(t3.column1) idnumbers
from table2 t2
inner join table3 t3 on t3.referencecolumn = t2.referencecolumn
inner join table1 t1 on t1.referencecolumn = t1.referencecolumn
where ...
group by t1.column1
listagg()
具有用於格式化、重復管理和排序的各種選項 - 您可以在文檔中找到詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.