【发布时间】:2016-01-18 15:31:49
【问题描述】:
我有一个链接到 Oracle 12.1 数据库的 SQL Server 12.0 数据库。
我想在 SQL Server 数据库中创建一个视图,该视图返回按日期过滤的 Oracle 表中的数据。 Oracle 表在日期列上有一个索引。
一个成功的查询是:
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
但是这运行非常缓慢。我认为这是因为比较是在 SQL Server 中进行的,所以每行都被返回。
如果我去:
DECLARE @earliest date = '20140701';
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= @earliest;
然后它跑得很快,大概是因为条件被传递给Oracle所以正在使用表上的Oracle索引。
我的问题是我想创建一个视图。我找不到使用第二版代码创建视图的方法。如果我只是这样做:
create myview as select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
然后它运行缓慢。
SQL Server 将传递给 Oracle 的日期文字是否有另一种格式,或者是否有其他解决方案?我还想知道这是否与创建 Oracle 链接时使用的参数有关。供参考:
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'ORADB', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'DPDB'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ORADB',@useself=N'False',@locallogin=NULL,@rmtuser=N'MYUSER',@rmtpassword='#######'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
编辑:我刚刚发现了一个非常相似的问题:Forcing a SQL Remote Query to filter remotely instead of locally
【问题讨论】:
-
试试ISO格式
'2014-01-01'YYYY-MM-DD -
谢谢@lad2025,我试过了,但还是很慢。
-
既然不能创建带参数的视图,为什么不直接创建一个函数呢?你可以像视图一样使用它,加入它,并拥有参数。
-
感谢@iDevlop,我试图让事情变得简单。这可能是我的下一个方法。另一种是将视图过滤移回Oracle,但我试图避免这种情况。
-
您遇到的问题与日期文字的格式无关...您必须找到将日期作为参数传递的解决方案。
标签: sql sql-server oracle date-formatting