Ich habe drei Tabellen:SQL Query Ausführungsverknüpfung ODER Logik?
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
hat, höchstens ein paar Dutzend Datensätze. BigTable
hat ein paar Millionen, und ist eigentlich eine Ansicht, die UNIONS eine Tabelle in dieser Datenbank mit einer Tabelle in einer anderen Datenbank auf dem gleichen Server.
Hier ist die Logik verbinden:
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
Durchschnittliche verbundene Größe ein paar tausend Ergebnisse ist. Alles angezeigt wird indiziert.
Für die meisten SmallTable
Aufzeichnungen, flag1
und flag2
sind 1
gesetzt, so gibt es wirklich keine Notwendigkeit, auch den Index Zugriff auf BigTable.text1, aber SQL Server tut es trotzdem, zu einem teueren indizierte Scan und geschachtelte Schleife führt.
Gibt es einen besseren Weg, um SQL Server anzudeuten, dass, wenn flag1
und flag2
beide 1
gesetzt werden, sollte es nicht einmal bei text1
plagen suchen?
Eigentlich, wenn ich die Verknüpfung zu BigTable vollständig in diesen Fällen vermeiden kann (JoinTable verwaltet, so würde dies kein Problem verursachen), würde diese Schlüsselabfrage noch schneller machen.
+1 für interessante Frage. Hoffe, mehr davon selbst zu lernen! – AdaTheDev
Sie haben einen Index-Scan auf 'BigTable' erwähnt, bei dem es sich um eine Ansicht handelt. Ist es eine indizierte Sicht oder wird die Indexsuche für die zugrunde liegenden Tabellen durchgeführt? Könnten Sie bitte den Abfrageplan hier posten? – Quassnoi