2017-05-07 122 views
0

我想要捕獲其值已根據任何更新/插入修改的日期時間列更改的所有行。SQL:優化聯合查詢以獲取更新/插入的行

有一個父表和幾個子表。

我使用UNION來做到這一點,但它很慢。我有什麼選擇?我怎樣才能更好地構建查詢以在更短的時間內運行?

Tables - 
ParentT - Rowid(PK),column1,last_update 
ChildT1 - column1,last_update,parent_rowid(FK to ParentT.Rowid) 
ChiltT2 - column1,last_update,parent_rowid(FK to ParentT.Rowid) 
ChildT3 - column1,last_update,parent_rowid(FK to ParentT.Rowid) 

查詢:

SELECT Rowid FROM ParentT 
WHERE Rowid IN (
    SELECT Rowid FROM ParentT pT WHERE pT.last_update > somedatetime 
    UNION 
    SELECT Parent_rowid FROM ChildT1 cT1 WHERE cT1.last_update > somedatetime 
    UNION 
    SELECT Parent_rowid FROM ChildT2 cT2 WHERE cT2.last_update > somedatetime 
    UNION 
    SELECT Parent_rowid FROM ChildT3 cT3 WHERE cT3.last_update > somedatetime 
) 

回答

0

由於您使用的,您不需要不同的值。所以請使用UNION ALL而不是UNION的。 UNION做工會和試圖做重複數據刪除是複雜的過程,並不需要爲您的查詢

你可以改變你的查詢,如下:

SELECT Rowid FROM ParentT 
WHERE Rowid IN (
    SELECT Rowid FROM ParentT pT WHERE pT.last_update > somedatetime 
    UNION ALL --Added ALL 
    SELECT Parent_rowid FROM ChildT1 cT1 WHERE cT1.last_update > somedatetime 
    UNION ALL --Added ALL 
    SELECT Parent_rowid FROM ChildT2 cT2 WHERE cT2.last_update > somedatetime 
    UNION ALL --Added ALL 
    SELECT Parent_rowid FROM ChildT3 cT3 WHERE cT3.last_update > somedatetime 
) 
+0

對於我的數據,聯盟執行比UNION ALL更好。 – user2276910

+0

ParentT表和Child表上的索引是什麼? –

+0

如果您能夠提供有利於進一步分析的執行計劃 –

0

使用單獨的條件:

SELECT Rowid 
FROM ParentT 
WHERE Rowid IN (SELECT Rowid FROM ParentT pT WHERE pT.last_update > somedatetime) OR 
     Rowid IN (SELECT Parent_rowid FROM ChildT1 cT1 WHERE cT1.last_update > somedatetime) OR 
     Rowid IN (SELECT Parent_rowid FROM ChildT2 cT2 WHERE cT2.last_update > somedatetime) OR 
     Rowid IN (SELECT Parent_rowid FROM ChildT3 cT3 WHERE cT3.last_update > somedatetime); 

這允許每個查詢獨立優化,例如使用可用索引。

0

試試這個,

SELECT Rowid FROM ParentT PT 
WHERE pT.last_update > somedatetime and exists (

    SELECT Parent_rowid FROM ChildT1 cT1 WHERE cT1.Rowid=pt.Rowid 
    and cT1.last_update > somedatetime 
    UNION ALL --Added ALL 
    SELECT Parent_rowid FROM ChildT2 cT2 WHERE cT2.Rowid=pt.Rowid 
    and cT2.last_update > somedatetime 
    UNION ALL --Added ALL 
    SELECT Parent_rowid FROM ChildT3 cT3 WHERE cT3.Rowid=pt.Rowid 
    and cT3.last_update > somedatetime 
)