SQL: Optimieren Sie die Abfrage der Union, um aktualisierte / eingefügte Zeilen zu erhalten

Ich möchte alle Zeilen erfassen, deren Werte sich geändert haben, basierend auf einer datetime Spalte, die bei jedem Update / Insert geändert wird.

Es gibt einen Elterntisch und zwei Kindertische.

Ich benutze UNION, um dies zu tun, aber es ist langsam. Was sind meine Alternativen? Wie kann ich die Abfrage besser in viel weniger time laufen lassen?

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) 

Abfrage:

 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 ) 

Da Sie IN verwenden, benötigen Sie keine unterschiedlichen Werte … also bitte UNION ALL anstelle von UNION. UNION hat Gewerkschaft und versucht, De-Duplizierung zu tun, die komplex ist und nicht für Ihre Abfrage benötigt wird

Sie können Ihre Abfrage wie folgt ändern:

 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 ) 

Verwenden Sie separate Bedingungen:

 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); 

Dadurch kann jede Abfrage unabhängig voneinander optimiert werden, wobei beispielsweise verfügbare Indizes verwendet werden.

Versuche dies,

 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 )