Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Ferndatenzugriff und Arbeit mit Massendaten » Auf entfernte Daten zugreifen » Interne Vorgänge

 

Partielles Passthrough der Anweisung

Wenn eine Anweisung Bezugnahmen auf mehrere Server enthält oder SQL-Funktionen benutzt, die von einem Fremdserver nicht unterstützt werden, wird die Abfrage in einfachere Teile zerlegt.

SELECT

SELECT-Anweisungen werden aufgeteilt, indem Teile entfernt werden, die nicht weitergegeben werden können und daher von SQL Anywhere verarbeitet werden. Nehmen wir z.B. an, dass ein Fremdserver die ATAN2-Funktion in der folgenden Anweisung nicht verarbeiten kann:

SELECT a,b,c
WHERE ATAN2( b, 10 ) > 3
AND c = 10;

Die an den Fremdserver gesendete Anweisung würde wie folgt umgewandelt werden:

SELECT a,b,c WHERE c = 10;

SQL Anywhere wendet dann WHERE ATAN2( b, 10 ) > 3 lokal auf die Zwischenergebnismenge an.

Joins

Wenn zwei Tabellen verknüpft werden, wird eine Tabelle als äußere Tabelle definiert. Die äußere Tabelle wird basierend auf den WHERE-Bedingungen durchsucht, die auf sie passen. Für jede gefundene qualifizierte Zeile wird die andere, die innere Tabelle, auf eine Zeile durchsucht, die zur Join-Bedingung passt.

Derselbe Algorithmus wird verwendet, wenn auf entfernte Tabellen Bezug genommen wird. Da der Aufwand für das Durchsuchen einer entfernten Tabelle in der Regel höher ist als bei einer lokalen Tabelle (wegen des erforderlichen Datenverkehrs im Netzwerk), sollte alles getan werden, dass im Join die entfernte Tabelle als äußere Tabelle definiert wird.

UPDATE und DELETE

Wenn eine qualifizierende Zeile gefunden wird und SQL Anywhere eine UPDATE- oder DELETE-Anweisung nicht komplett an einen Fremdserver weitergeben kann, muss er die Anweisung in einen Tabellensuchvorgang umwandeln, der so viel von der ursprünglichen WHERE-Klausel wie möglich enthält. Darauf folgt eine positionsgesteuerte UPDATE- oder DELETE-Anweisung, die WHERE CURRENT OF Cursorname angibt.

Wenn z.B. die Funktion ATAN2 von einem Fremdserver nicht unterstützt wird, gestaltet sich der Vorgang folgendermaßen:

UPDATE t1
SET a = atan2( b, 10 )
WHERE b > 5;

Diese Anweisung wird wie folgt umgewandelt:

SELECT a,b
FROM t1
WHERE  b > 5;

Wenn eine Zeile gefunden wird, berechnet SQL Anywhere den neuen Wert von "a" und arbeitet wie folgt weiter:

UPDATE t1
SET a = 'new value'
WHERE CURRENT OF CURSOR;

Wenn "a" bereits einen Wert hat, der dem neuen Wert entspricht, ist ein positionsbasiertes UPDATE nicht erforderlich und wird daher nicht an den Fremdserver geschickt.

Um eine UPDATE- oder DELETE-Anweisung auszuführen, für die das Durchsuchen einer Tabelle erforderlich ist, muss die entfernte Datenquelle ein positionsbasiertes UPDATE oder DELETE (WHERE CURRENT OF Cursorname) unterstützen. Einige Datenquellen unterstützen diese Funktion nicht.

Temporäre Tabellen können nicht aktualisiert werden

Wenn eine temporäre Tabelle erforderlich ist, kann keine UPDATE oder DELETE-Anweisung durchgeführt werden. Dies kommt in Abfragen mit ORDER BY und einigen Abfragen mit Unterabfragen vor.