将T-SQL与Oracle DB一起使用

时间:2009-02-26 16:20:22

标签: sql-server-2005

我在Microsoft SQL Server Studio的查询窗口中直接使用T-SQL查询来反对大型Oracle数据库,而我的SQL服务器是2005年。

我创建了一个链接服务器作为myOracleServer。通过使用以下T-SQL查询:

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

只需拨打一个电话就需要1分钟以上。对于小尺寸表,没关系,但Oracle端的myTable非常大,有数百万行数据。

我发现我可以使用OPENQUERY与SQL查询进行类似的调用作为传递。结果非常快。执行时间是00:00:02!

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

我遇到的问题是查询不是常量字符串。我可以在查询中更改id和Dt值,例如:

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

OPENQUERY不支持变量作为查询字符串或表达式。

是否有其他方法可以快速提升传递查询到Oracle?

3 个答案:

答案 0 :(得分:0)

尝试这样的事情

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

答案 1 :(得分:0)

您是否尝试过根据该查询创建视图?如果可行的话,你应该可以像使用本地表一样使用View。

答案 2 :(得分:0)

当我尝试将查询从SQL 2005服务器传递到Oracle数据库时,我想我找到了解决缓慢问题的解决方案。

有三种方法可以做到。 第一个类似于:

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

如果Oracle端的表格很大,例如3M行数据,则执行时间很长。今天我在我的SQL服务器上再次尝试了它,只需要一个查询大约需要2'44“(也许桌子在工作日非常繁忙)。

第二种方法是使用OPENQUERY,正如我在我的问题中所述:

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

非常快。我再次运行它,执行时间是00:00:00,快速惊人!但是,此方法的问题是OPENQUERY不支持变量作为查询。

实际上,我发现了这种方法并且昨天晚上工作结果非常激动。我昨晚写了一篇博客on this issue。今天早上,当我尝试将其投入生产(存储过程)时,我无法使用OPENQUERY,因为在我的情况下,必须在id和date上构建变量查询。

好消息是我找到了第三种方式,这是解决这个问题的绝佳方法:

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;

这里的关键点是使用EXEC和AT来指定远程服务器或链接服务器,并且不要忘记使用()括起@sql变量。执行时间是00:00:00!

我的沼泽将在今晚更新。