I have a SQL Server 12.0 database that is connected to an Oracle 12.1 database.
I want to create a view in a SQL Server database that returns data from an Oracle table filtered by date. An Oracle table has an index in a date column.
The request was successfully completed:
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
However, this is very slow. I assume this is because the comparison is happening in SQL Server, so every row is returned.
If I go:
DECLARE @earliest date = '20140701'; select * from ORADB..SCHEMA.MYTABLE where MYDATE >= @earliest;
Then it runs fast, presumably because the condition is passed to Oracle, so it uses the Oracle index in the table.
My problem is that I want to create a view. I cannot find a way to use the second version of the code to create the view. If I just do:
create myview as select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
Then it works slowly.
Is there a different format for the date literal that SQL Server will migrate to Oracle, or is there another solution? I also wondered if this is due to the parameters used when creating the Oracle link. For reference, they:
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
EDIT: I just found a very similar question: Forcing a remote SQL query to filter remotely rather than locally