2011-11-15 71 views
2

我在我的數據庫表中,對這些CONFIGS版本一起一些應用程序保存配置設置:如何擺脫'where'子句中的嵌套select?

app_id | config | version 
-------------------------- 
app1 | conf1v1 | 1 
app2 | conf2v1 | 1 
app1 | conf1v2 | 2 

我需要爲每個應用程序的最新配置信息(那些具有最大版本號)。我使用這樣的查詢:

select c.app_id, c.config, c.version 
from config c  
where 
    c.version=(select max(c2.version) from config c2 where c2.app_id = c.app_id) 

但它似乎是低效的。我想知道,是否有更有效的方法來完成這項任務?

+0

當你說它「*似乎*效率低下」時,你是什麼意思?你真的衡量了嗎?你有沒有調查執行計劃?從表面上看,如果所有需要的索引都已到位,我並不認爲這個查詢效率低下的明顯原因。 –

+0

@BrankoDimitrijevic我相信在where子句中選擇將導致查詢返回的每一行的表命中。 –

+0

@BrankoDimitrijevic我應該爲這張桌子創建什麼樣的索引? –

回答

4

您可以使用分析功能。這將至少提高效率,因爲它避免了兩次擊中表格。

SELECT app_id, config, version 
    FROM (SELECT app_id, 
       config, 
       version, 
       row_number() over (partition by app_id order by version desc) rnk 
      FROM config) 
WHERE rnk = 1 
1

結合了ROW_NUMBER一個CTE()將允許表中的一條解析(使用索引(如果可用),以進一步降低讀取)...

WITH 
    reversioned_config 
AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY app_id ORDER BY version DESC) as descending_version 
    FROM 
    config 
) 
SELECT 
    app_id, 
    config, 
    version 
FROM 
    reversioned_config 
WHERE 
    descending_version = 1 
+0

請問下臺選手爲什麼會給出一個理由? – MatBailie

0

什麼

select app_id, config, MAX(version) version from config 
group by app_id, config 
+0

由於我們假設configs不同,查詢將返回不同配置的應用程序的重複行。 –