:: Не фоксом единым
запрос через линк
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Есть база Oracl-а, в ней линк на базу MS SQL. Если делаю запрос:

select
"TermID"
FROM VW_GetTermPay_test@Eventwatch2
WHERE "InitialDateTime" between to_timestamp('14.02.17'||' 17:42:00')
and to_timestamp('15.02.17 17:42:00');

отрабатывает менее, чем за секунду.

Если делаю

select
"TermID"
FROM VW_GetTermPay_test@Eventwatch2
WHERE "InitialDateTime" between to_timestamp(to_char(sysdate-2)||' 17:42:00')
and to_timestamp('15.02.17 17:42:00');

отрабатывает, скажем так, довольно долго.

Если сделать

select to_char(sysdate-2) from dual

высвечивается "14.02.17"

Вопрос - где логика? Почему? Как побороть?
Ratings: 0 negative/0 positive
Re: запрос через линк
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
docs.oracle.com
in brevi:
Если оракловский сервер не может конвертировать условие запроса в синтаксис целевого сервера (в данном случае в синтаксис MSSQL), то он пошлёт запрос вынимающий ВСЕ данные (опцию WHERE он пропустит), а потом уже локально будет их фильтровать своими силами.
Естественно оракловская псевдо-функция sysdate никак не может быть сконвертирована в mssql-ный запрос.

Если вычислить эти параметры на стороне оракла (например в подзапросе из dual - по типу как в твоём третьем запросе) и потом использовать join к "внешней" таблице, то есть шанс что оракл пропихнёт на MSSQL уже вычисленное подзапросом скалярное значение как условие для выборки (надо читать про оптимизацию join-ов между "родными" и внешними таблицами).
Плюс к тому я бы очень внимательно почитал про работу с timestamp типом через тот transparent gateway который у вас используется (и несколько есть - и "специфические" под конкретные СУБД, и "общие" a-la ODBC). С датой-временем могут быть самые разные "косяки". Вот официальное предупреждение в документации
docs.oracle.com


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: запрос через линк
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Если оракловский сервер не может конвертировать условие запроса в синтаксис целевого сервера (в данном случае в синтаксис MSSQL), то он пошлёт запрос вынимающий ВСЕ данные (опцию WHERE он пропустит), а потом уже локально будет их фильтровать своими силами.
Вот же сволочь какая - условие WHERE с синтаксиса oracl-а в синтаксис ms sql-я конверсировать не может

Спасибо - теперь логика понятна.

Igor Korolyov
Если вычислить эти параметры на стороне оракла (например в подзапросе из dual - по типу как в твоём третьем запросе) и потом использовать join к "внешней" таблице, ...

Попробовал - если добавить join (select to_char(sysdate-2) from dual) ... увы, всё равно индекс "не замечает". Есть другой вариант. Запрос будет дёргаться из C#-ной программы. Можно попробовать параметризированный запрос - прямо в C# DateTime.Now. В крайнем случае, всегда остаётся вариант "на лету" формирования текста SQL (склеивая в одну строку). Хотя, это уже будет горбыль...



Исправлено 1 раз(а). Последнее : S-type, 17.02.17 20:09
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика