2009-02-26 6 views
0

Ich bin T-SQL-Abfrage direkt in Microsoft SQL Server Studio Abfragefenster gegen zu einer großen Oracle DB, und meinen SQL-Server 2005.Mit T-SQL mit Oracle DB

ich einen verknüpften Server erstellt habe, als myOracleServer. Durch Verwendung der folgenden T-SQL-Abfrage:

SELECT COUNT(*) FROM myOracleServer..owner.myTable WHERE id = 1000 AND Dt = '2009-02-26' 

Es dauert mehr als 1 Minute, um nur einen Anruf zu tätigen. Für eine kleine Tabelle ist es OK, aber myTable auf der Oracle-Seite ist sehr groß mit Millionen von Zeilen Daten.

Was ich herausgefunden habe ist, dass ich verwenden OPENQUERY könnte man einen ähnlichen Anruf mit SQL-Abfrage als Pass-Through zu machen. Das Ergebnis ist sehr schnell. Die Ausführungszeit ist 00:00:02!

SELECT * FROM OPENQUERY(myOracleServer, 'SELECT COUNT(*) FROM owner.myTable WHERE ...'); 

Das Problem, das ich habe, ist, dass die Abfrage keine konstante Zeichenfolge ist. Ich kann id und Dt-Werte in der Abfrage, so etwas wie ändern:

'SELECT COUNT(*) FROM ownwer.myTable WHERE id = ' + CAST(@id AS VARCHAR)... 

OPENQUERY nicht eine Variable als Query-String noch Ausdruck nicht unterstützt.

Gibt es eine andere Art und Weise die Pass-Through-Abfrage zu Oracle mit schnellen Leistung zu bekommen?

Antwort

0

Ich glaube, ich eine Lösung herauszufinden Langsamkeit Problem zu beheben, wenn ich versuche, eine Abfrage von SQL Server 2005 zu einer Oracle-DB zu übergeben.

Es gibt drei Möglichkeiten, dies zu tun. Die erste ist so etwas wie:

SELECT COUNT(*) FROM myOracleServer..owner.myTable 
    WHERE id = 1000 AND Dt = '2009-02-26' 

Wenn die Tabelle auf Oracle Seite ein großes ist, mit 3M Reihen von Daten beispielsweise die Ausführungszeit sehr lang ist. Heute habe ich versucht, es wieder auf meinem SQL Server und es dauerte etwa 2'44" nur für eine Abfrage (vielleicht die Tabelle während der Werktage sehr beschäftigt ist).

Die zweite Methode ist OPENQUERY zu verwenden, wie ich festgestellt in meiner Frage:.

SELECT COUNT(*) FROM OPENQUERY(myOracleServer, N'SELECT COUNT(*) FROM 
    owner.myTable WHERE id = 1000 AND Dt = TO_DATE(''2009-02-26'')'); 

es ist sehr schnell ich laufen sie wieder und die Ausführungszeit ist 00.00.00, atemberaubend schnell Allerdings ist das Problem bei dieser Methode, dass OPENQUERY nicht variabel als nicht unterstützt! Abfrage.

Eigentlich habe ich diese Methode gefunden und war sehr über das Ergebnis spät bei der Arbeit gestern verlassen. ich schrieb einen bl og on this issue letzte Nacht. Heute Morgen, als ich versuchte, dies in die Produktion zu bringen (eine gespeicherte Prozedur), konnte ich OPENQUERY nicht verwenden, da in meinem Fall eine variable Abfrage nach ID und Datum erstellt werden musste.

Die gute Nachricht ist, dass ich den dritte Weg, eine hervorragende Lösung für das Problem gefunden:

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + 
    CAST(@id AS VARCHAR) + N' AND Dt = TO_DATE(''' + @dt + 
    N''', ''yyyy-mm--dd'')'); 
EXEC (@sql) AT myOracleServer; 

Der entscheidende Punkt ist hier verwenden EXEC mit an einem entfernten Server oder Verbindungsserver zu spezifizieren, und vergiss nicht,() zu verwenden, um @sql-Variable zu umklammern. Die Ausführungszeit ist 00:00:00!

Mein Moor wird heute Abend aktualisiert.

0

Probieren Sie etwas wie dieses

DECLARE @sql varchar(2000) 
SET @sql = SELECT COUNT(*) FROM owner.MyTable WHERE id = " + CAST(@id to varchar(9)) 
SELECT * FROM OPENQUERY(myOracleServer, @Sql) 
+0

wie ich erwähnte, unterstützt OPENQUERY Variable. Siehe msdn für OPENQUERY. –

+0

Entschuldigung für Tippfehler: unterstützt nicht ... –

+0

Ja, ich habe es nur angeschaut. Außerhalb der Box könnten Sie einen "temporären" Sproc mit der Anweisung erstellen, aber es wäre ein bisschen Overkill, wenn der Perf-Unterschied nicht wirklich atemberaubend wäre. Ich frage mich, ob ein CLR-Proc eine Option ist. –

0

Haben Sie versucht, einen Blick zu schaffen auf diese Abfrage basiert? Wenn das funktioniert, sollten Sie in der Lage sein, die Ansicht wie eine lokale Tabelle zu verwenden.

+0

Wenn es als lokale Tabelle tut, ist das der Grund, niedrig zu verursachen, denke ich. Ich mag Pass-Through-Abfrage, funktioniert aber nicht, wenn es für OPENQUERY nicht const ist. –