2009-02-26 7 views
0

J'utilise la requête T-SQL directement dans la fenêtre de requête de Microsoft SQL Server Management Studio contre un grand Oracle DB, et mon serveur SQL est 2005.Utilisation de T-SQL avec Oracle DB

J'ai créé un serveur lié comme myOracleServer. En utilisant la requête T-SQL suivante:

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

Il faut plus d'une minute pour effectuer un seul appel. Pour une table de petite taille, c'est OK, mais myTable sur Oracle est très grand avec des millions de lignes de données. Ce que j'ai découvert, c'est que je pourrais utiliser OPENQUERY pour faire un appel similaire avec une requête SQL en tant que pass-through. Le résultat est très rapide. L'heure d'exécution est 00:00:02! Le problème que j'ai est que la requête n'est pas une chaîne constante. Je peux changer id et les valeurs Dt dans la requête, quelque chose comme:

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

OPENQUERY ne supporte pas une variable sous forme de chaîne de requête, ni expression.

Existe-t-il un autre moyen d'obtenir la requête directe auprès d'Oracle avec des performances rapides?

Répondre

0

Je pense que je trouve une solution pour résoudre le problème de lenteur lorsque j'essaie de passer une requête du serveur SQL 2005 à une base de données Oracle.

Il y a trois façons de le faire. Le premier est quelque chose comme:

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

Si la table Oracle sur le côté est un grand, avec des lignes 3M de données par exemple, le temps d'exécution est très longue. Aujourd'hui, je l'ai essayé à nouveau sur mon serveur SQL et il a fallu environ 2'44 "juste pour une requête (peut-être la table est très occupée pendant les jours ouvrables)

La deuxième méthode est d'utiliser OPENQUERY, comme je l'ai dit à ma question.

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

il est très rapide, je le lance à nouveau et le temps d'exécution est 00:00:00 superbe rapide Cependant, le problème avec cette méthode est que OPENQUERY ne supporte pas variable en!

En fait, j'ai trouvé cette méthode et j'ai été très excité à propos du résultat tard au travail hier. og on this issue hier soir. Ce matin quand j'ai essayé de mettre cela en production (une procédure stockée), je n'ai pas pu utiliser OPENQUERY puisque dans mon cas, une requête variable doit être construite sur l'identifiant et la date.

Les bonnes nouvelles sont que j'ai trouvé la troisième voie, une excellente solution à la question:

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; 

Le point clé ici est d'utiliser EXEC avec AT pour spécifier un serveur distant ou serveur lié, et n'oubliez pas d'utiliser() pour mettre la variable @sql entre crochets. L'heure d'exécution est 00:00:00!

Mon tourbillon sera mis à jour ce soir.

0

Essayez quelque chose comme ça

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

comme je l'ai mentionné OPENQUERY prend en charge la variable. Voir msdn pour OPENQUERY. –

+0

désolé pour faute de frappe: ne supporte pas ... –

+0

Ouais, je viens de le regarder. En dehors de la boîte, vous pourriez créer un sproc "temp" avec la déclaration, mais ce serait un peu exagéré à moins que la différence de perf était absolument magnifique. Je me demande si un proc CLR est une option. –

0

Avez-vous essayé de créer une vue basée sur cette requête? Si cela fonctionne, vous devriez pouvoir utiliser la vue comme s'il s'agissait d'une table locale.

+0

S'il fait comme table locale, c'est la raison pour causer bas, je pense. J'aime la requête directe, mais ne fonctionne pas si elle n'est pas const pour OPENQUERY. –

Questions connexes