使用T-SQL和Oracle数据库
我使用T-SQL查询直接在Microsoft SQL Server Studio的针对一个大型Oracle数据库的查询窗口,我的SQL服务器2005使用T-SQL和Oracle数据库
我创建了一个链接服务器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?
我想我找出解决缓慢问题的解决方案,当我尝试从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不支持变量作为!查询
其实我找到了这个方法,并且在昨天晚上工作的时候非常激动我写了一个bl og 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!
我的沼气将在今晚更新。
尝试这样的事情
DECLARE @sql varchar(2000)
SET @sql = SELECT COUNT(*) FROM owner.MyTable WHERE id = " + CAST(@id to varchar(9))
SELECT * FROM OPENQUERY(myOracleServer, @Sql)
您是否尝试过创建一个基于查询视图?如果可行,你应该可以像使用本地表一样使用视图。
正如我所说OPENQUERY确实支持变量。请参阅msdn for OPENQUERY。 – 2009-02-26 17:10:06
抱歉,错字:不支持... – 2009-02-26 17:11:27