我在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?
答案 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!
我的沼泽将在今晚更新。