Wo werden Verbindungsserverabfragen ausgeführt?

8

Ich habe zwei Instanzen, ServerA und ServerB , und ich habe in ServerA für ServerB einen Verbindungsserver als Linksrv_B erstellt .

Ich kann eine Abfrage auf ServerA mithilfe der vierteiligen Namenskonvention ausführen :

SELECT * FROM Linksrv_B.master.sys.databases

oder OPENQUERY():

SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  

Ich weiß, dass der Verbindungsserver in einer heterogenen Datenbank mit verteilten Transaktionen als Rowset funktioniert.

  1. Wo wird der OLEDB-Anbieter initiiert / verbunden? ServerA oder ServerB?
  2. Wo wird die Abfrage auf ServerA oder ServerB ausgeführt? Kommt der Optimierer ins Spiel, wenn ja, auf welchem ​​Server?
  3. Wo wird die Ergebnismenge zwischengespeichert?
  4. Könnte uns jemand eine detaillierte Erklärung geben, wie der Verbindungsserver funktioniert.
info.sqldba
quelle
1
Kendra Little hat ein tolles Video zu diesem Thema: brentozar.com/archive/2015/05/…
MguerraTorres

Antworten:

5

1 - Der OLEDB-Anbieter wird auf Server A initiiert. Server B sieht dies als normale Verbindung und Abfrage an. Er weiß nicht, dass Server A ein SQL Server ist, sondern nur ein Client für ihn.

2 - Die Abfrage wird auf beiden ausgeführt. Server A übergibt die Abfrage an Server B, der sie ausführt, und Server A arbeitet mit den Ergebnissen. Der Optimierer kommt auf beiden ins Spiel, kann aber nicht mit den anderen Servern kommunizieren.

Bei einer Abfrage ohne Komplexität ist die Leistung gleichwertig. Wenn Sie jedoch mit komplexen Abfragen oder großen Datenmengen beginnen, werden Sie Leistungssteigerungen feststellen, wenn Sie genau das, was Sie von Server B benötigen, in eine temporäre Tabelle abrufen und diese dann mit den auf Server A enthaltenen Daten verwenden. (Angenommen, Sie müssen und mischen Daten zwischen Servern abgleichen). Im Wesentlichen übergeben Sie mit der OPENQUERY-Syntax die Abfrage als Ganzes an Server B (hoffentlich einschließlich einer where-Klausel), der dann Daten an Serer A zurückgibt. Mit der vierteiligen Benennung haben Sie keine Kontrolle und der Optimierer entscheidet sich schnell für eine gerechte Entscheidung Rufen Sie alle Daten in der Tabelle von Server B ab und entfernen Sie sie dann anhand anderer Kriterien (Verknüpfungen, wo usw.).

3 - Das Ergebnis wird nicht zwischengespeichert (außer wenn SQL Daten normalerweise zwischenspeichert). Es sei denn, Sie speichern die Ergebnisse der Verbindungsserverabfrage irgendwo in einer temporären Tabelle.

4 - Wenn Sie wissen, wie Anwendungen eine Verbindung zu einer Datenbank herstellen und Abfragen ausführen, ist der Prozess sehr ähnlich. Abgesehen von Authentifizierungsunterschieden ist es dasselbe, nur dass Daten von mehreren Servern einfach zu einer einzigen Ergebnismenge gemischt und abgeglichen werden können. Ihre Leistung hängt jedoch stark davon ab, wie viele Daten von Server B abgerufen werden, und Sie müssen sich der eingeschränkten Fähigkeit des Optimierers bewusst sein, zu verhindern, dass Sie die gesamte Tabelle von Server B abrufen, selbst wenn Sie nur 5 dieser Zeilen benötigen.

Jonathan Fite
quelle