Как указать литерал даты при написании SQL-запроса от SQL Server, который связан с Oracle?

У меня есть база данных SQL Server 12.0, которая связана с базой данных Oracle 12.1.

Я хочу создать представление в базе данных 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

РЕДАКТИРОВАТЬ: Я только что нашел очень похожий вопрос: Принудительное выполнение SQL Remote Query вместо локальной

8
задан Community 23 May 2017 в 11:46
поделиться