SQL 2005 - Verbindungsserver zu Oracle-Abfragen Extrem Langsam
Auf meinem SQL 2005 server, ich habe einen linked server Verbindung zu Oracle über die OraOLEDB.Oracle-provider.
Wenn ich eine Abfrage ausführen, die durch den Teil 4 id etwa so:
SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345
Dauert es über eine minute, um abzuschließen. Wenn ich die gleiche Abfrage in etwa so:
SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345')
Es führt sofort. Gibt es eine Einstellung fehlt mir irgendwo um die erste Abfrage ausgeführt werden, die in einer annehmbaren Zeit? Oder bin ich stecken mit openquery?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In deinem ersten Beispiel mit Hilfe der "dot" - notation, client cursor engine verwendet wird und die meisten Dinge sind lokal ausgewertet. Wenn Sie die Auswahl aus einer großen Tabelle und eine WHERE-Klausel werden die Datensätze nach unten gezogen lokal von der remote-db. Sobald die Daten gezogen worden ist, über die verknüpften server, nur dann ist die WHERE-Klausel wird lokal angewendet. Oft ist diese Folge ist ein Leistungseinbruch. Indizes, die auf dem remote-db sind im Grunde nutzlos.
Abwechselnd, wenn Sie die OPENQUERY verwenden, SQL Server sendet die sql-Anweisung an die Ziel-Datenbank für die Verarbeitung. Während der Verarbeitung werden alle Indizes für die Tabellen genutzt werden. Auch die where-Klausel angewendet wird, auf der Oracle-Seite vor dem senden die Ergebnismenge zurück zu SQL Server.
Meiner Erfahrung, außer für die einfachsten Abfragen, OPENQUERY ist gehen, um Ihnen eine bessere Leistung.
Ich würde empfehlen, mit OpenQuery für alles, was aus den oben genannten Gründen.
Einer der kritischen Punkte bei der Verwendung von OpenQuery, dass Sie haben vielleicht schon festgestellt, ist das einfache Anführungszeichen. Wenn der sql-string gesendet werden, um die remote-db erfordert einfache Anführungszeichen um eine Zeichenkette oder Datum, die Sie benötigen, zu entkommen. Da Sie sonst versehentlich beenden Sie die sql-Zeichenfolge.
Hier ist eine Vorlage, die ich verwenden, wenn ich den Umgang mit Variablen in einer openquery-Anweisung, um einen verknüpften server zu kümmern, der Apostroph problem: