簡體   English   中英

提高查詢性能和可維護性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM