powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чудеса провайдера Oracle Provider for OLE DB
25 сообщений из 39, страница 1 из 2
Чудеса провайдера Oracle Provider for OLE DB
    #40024743
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Сегодня произошла очень интересная история, которой я не нахожу в принципе никакого объяснения. Хотел узнать какие могут быть соображения на эту тему и может кто то сталкивался с этим дивом дивным:)

На сервере существует уже лет 10 процесс, который инкрементально по максимальному id загружает данные с ораклового сервера
на сервер mssql.

Загрузка очень простая и имеет следующий вид:

Есть таблица
Код: sql
1.
dst_table (id bigint, val varchar(max))


Есть аналогичная таблица в оракле
Код: sql
1.
src_table (id bigint, val clob)



Загрузка работает в цикле загружая по 1000 строк, берется максимальный id из dst_table
и загружает с оракла 1000 строчек где id больше.

Код: sql
1.
2.
INSERT INTO dst_table 
SELECT id,val FROM OPENQUERY(ORA_SRC, 'SELECT id,val from (select id,val from src_table where id > [максимальный id из dst_table] order by id) where rownum <= 1000 ')



Сегодня перед глазами возникает следующая картина:

Поля val стали приходить из других строк таблицы, например в оракле есть такие строчки
id val
1 А
2 Б
3 В

А запрос возвращает:
id val
1 Ж
2 Б
3 З

1) Если написать запрос в oracle sql developer, то он возвращает правильные данные
2) Если в запросе вместо rownum <=1000 поменять на <=100, то запрос возвращает правильные данные
3) Если написать аналогичный запрос на другом сервере где есть такой же линк, то запрос возвращает правильные данные

А на текущем сервере вот такой цирк абсурда:) Получается драйвер Oracle Provider for OLE DB на сервере сошел с ума и его нужно переустанавливать?

ps - Я вменяем и трезв, коллеги сначала тоже упорно не верили пока им не показал это воочию)))
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024746
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Поля val стали приходить из других строк таблицы, например в оракле есть такие строчки
То есть id возвращаются правильные?
Чудеса какие то.
А вы можете в оракле посмотреть, какой запрос туда приходит, и как он выполняется (в сиквеле эта штука называется профайлер)
И сравнить запрос от девелопера и от линка
Кстати, заодно убедитесь, что сервер прилинкован тот, который вам нужен :-)

99% за то, что ошиблись с сервером или схемой, которая у вас, кстати, в запросах не указана. В том числе со схемой можно ошибиться доп. параметрами коннекта.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024747
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, я писал покороче для примера, схемы там одинаковые.

При выполнении двух одинаковых запросов в одном окне, в зависимости от значения поля rownum получается либо корректное заполнение полей, либо нет.

Из интересного наблюдения когда rownum < 104, то данные возвращается корректно, при любом другом значении >= 104 некорректно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024751
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пруфы :)
Заранее добавлю, это не может быть какое то другое поле c таким же evnum, тк в таблице нет дублей по полю evnum, там уникальный кластерный индекс
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024765
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

А что вернет

Код: sql
1.
select * from rm.sm3_reg_log where evnum = 9978530046;



Не мешало бы проверить как заполняется поле evnum на источнике.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024768
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
flexgen,
вернет верный результат как во втором примере
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024793
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
там уникальный кластерный индекс
Это же таблица, не вьюха?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024794
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
assmsk
там уникальный кластерный индекс
Это же таблица, не вьюха?
А поле in_parms - это просто поле? Не вычисляемое?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024797
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
alexeyvg, я писал покороче для примера, схемы там одинаковые.
Лучше просто скопируйте текст, а то если захочется написать имя поля и т.п., придётся их набирать, а не копировать :-)

И повторю совет, посмотрите профайлером (как он там в оракле называется)
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024803
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запросы выполняются в разное время, соответственно к далеко не полному множеству вариантов (наи-)возможных
причин указанных alexeyvg можно добавить различие данных в таблице на момент запроса.
evnum - это PK или они в исходнике не уникальны? (тем более что в первом наборе ограничение на 100 строк, а во втором на 200)
тип данных в источнике на evnum точно (big-)int? Бывает кто-то шаманит по настройкам драйверов (и как они конвертируют типы)
Можно почитать по Оракловской псевдо-функции rownum и гарантирует-ли она постоянность порядка строк.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024806
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
flexgen,
вернет верный результат как во втором примере


А если в
Код: sql
1.
select * from rm.sm3_reg_log where evnum = 9978530046

добавить все условия запроса? У тебя там еще два поля. Тоже вернет одну строку?

assmskуникальный кластерный индекс
Это где? В базе Oracle? В Oracle нет такого понятия "кластерный индекс". Ближе всего к кластерному индексу может быть index-organized table (IOT). Есть еще CLUSTER и соответственно CLUSTER INDEX, но это совсем другое.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024876
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen
assmskуникальный кластерный индекс

Это где? В базе Oracle? В Oracle нет такого понятия "кластерный индекс". Ближе всего к кластерному индексу может быть index-organized table (IOT). Есть еще CLUSTER и соответственно CLUSTER INDEX, но это совсем другое.Наверное, автор сказал в терминах сиквела, что бы быть в контексте нашего раздела. Видимо, ПК имел в виду.
Но вообще самое правильное - дать DDL таблицы rm.sm3_reg_log
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024977
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

rownum - это что, top ()? Если да, то нужен порядок сортировки.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025005
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

Ещё предположение, может, сиквельный OPENQUERY делает какое то "грязное" чтение? И в момент перемещения страниц или чего то подобного читает некий мусор?
Повторю в третий раз - нужно смотреть, что происходит на стороне Оракла.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025009
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудес не бывает, там или какое-то усечение, или дубли. Надо внимательно провести анализ данных.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025025
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну в целом я подобные ответы и предполагал, собственно тоже наехал сначала на владельцев системы что у них данные меняются... а зря

Но факты:
1) Поле evnum на источнике уникальное
2) В таблице ничего никогда не апдейтиться, туда только инкрементально записываются данные. 101% что поле IN_PARMS НЕ может поменяться
3) Есть 3 сервера msqlsql на которых настроен этот линк и оракл девелопер на локальной машине, через оракл девелопер и на двух серверах все работает хорошо и не возникает такой херни, а только на одном из серверов (тнс'ки везде одинаковые и драйвера тоже)


Мне самому с трудом вериться, что так себя может вести драйвер на конкретном сервере, но судя по всему это так и есть. Видимо придется обращаться в поддержку mssql...
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025039
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
assmsk,
внешний вид запросов к ораклу очень даже располагает к тому, чтобы нарваться на такую вот неприятную штуку .
С год назад получил некоторое количество неприятных ощущений на вываливании в дамп SQL сервера, как оказалось из-за любви к комментированию через --
Вроде как сносит процесс из-за бардака в куче, но если бардак маленький...
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025049
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Видимо придется обращаться в поддержку mssql...
Они всё равно попросят хоть какую то информацию :-)
Если просто написать, как здесь "не работает", то результат будет такой же :-)
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025050
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

Код: plsql
1.
SELECT id,val from (select id,val from src_table where id > [максимальный id из dst_table] order by id) where rownum <= 1000

если я правильно понял, в Оракле очередная порция может содержать больше 1000 записей, а вы хотите затянуть из этой порции первую тысячу
обычно приведенный запрос так в Оракле и работает,
но есть ли исключения - лучше спросить на форуме Оракл

Зы: а есть ли ситуации, когда записи в Оракле комитятся не в порядке ид?


Хм: еще раз перечитал вопрос
мне не встречались ситуации, когда данные между строками перепутаны
хотя обмен между МССКЛ и Оракл с блобами у нас проходит регулярно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025053
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
assmsk
Видимо придется обращаться в поддержку mssql...
Они всё равно попросят хоть какую то информацию :-)
Если просто написать, как здесь "не работает", то результат будет такой же :-)
наши админы обращались в МС по поводу обмена МССКЛ-ОРАКЛ
ответ - поменяйте версию клиента
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025056
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Пруфы :)
Заранее добавлю, это не может быть какое то другое поле c таким же evnum, тк в таблице нет дублей по полю evnum, там уникальный кластерный индекс

выглядит так, как будто драйвер блобы перепутал между строками
в первом примере в строке *47 блоб похож на блоб со второго примера со строки *46
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025059
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственное реальное объяснение - sm3_req_log это представлениt с функцией, вытягивающей блоб
всё остальное похоже на глюки драйвера
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025068
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
Да, ровно так. Данные подтягиваются из других строк, хотя по некоторым записям все верно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025069
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
andreymx,
Да, ровно так. Данные подтягиваются из других строк, хотя по некоторым записям все верно
нужен скрипт этой задачи, возможно, что-то подскажу
у нас была аналогичная ситуация
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025072
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
так вроде же примеры есть в теме или я не понял что именно требуется?
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чудеса провайдера Oracle Provider for OLE DB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]