powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странное поведение Informix при работе с текстовыми функциями.
22 сообщений из 22, страница 1 из 1
Странное поведение Informix при работе с текстовыми функциями.
    #38502173
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулись на то, что при выборке данных, используя функцию substr инфоримкс выдает разные данные.
Для примера. Берем таблицу, а которой более 40 млн. записей.
Запускаем две сессии dbaccess.
Почти одновременно запускаем два одинаковых запроса и сравниваем данные.
Результат ошеломляющий на 250000 тысячи строк, расхождение от 3000 до 5000.

Выполняемые запросы:
Один тип запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
unload to /tmp/1.unl
select first 250000 a.id, substr(a.u_id,14,10),a.u_id
from ptempl a

unload to /tmp/1.unl
select first 250000 a.id, substr(a.u_id,14,10),a.u_id
from ptempl a




второй тип запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
unload to /tmp/3.unl
select a.id, substr(a.u_id,14,10),a.u_id
from ptempl a
where id < 250000

unload to /tmp/4.unl
select a.id, substr(a.u_id,14,10),a.u_id
from ptempl a
where id < 250000



Все время расхождение во втором поле. Опробовали на всех версиях 11.50 и 11.70. Результат тот же. Неужели информих при большом количестве сессий (обращение к одной и той же таблицы) ведет себя не корректно. Поле ID имеет тип данных INT, и это поле является первичным ключем. Функция REPLACE выдает в процентом отношении еще больше ошибок.
Развернул последний бэкап и повторил опыт. РАСХОЖДЕНИЙ НЕТ. На сервере было 2 моих сессии. На «боевом» серверах от 100 до 500 активных сессий. Файлы сверял программой beyond comare на винде. Есть у кого какие-либо предположения?

Поля разделены "|". Сначала идет поле ID, затем SUBSTR(u_id), u_id. Затем через символ ";"данные второго запроса.
Жирным выделил то, что должно отображаться во второй колонке.


40205784|0402057848|5005065095936 04020578487 ; 40205784|0402799069|5005065095936 04020578487
40205796|0402057961|5005183932754 04020579616 ; 40205796|0402799250|5005183932754 04020579616
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38502189
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не совсем внимательно прочитал чего Вьі хотели добиться. Но для получения идентичности вьіборок нужен хотя бьі order by по первичному ключу. Без него сервер отдаст те первьіе 250000 какие ему будут удобньі в данньій момент.

P.S. Вчитался внимательнее, ума не приложу, что ето может бьіть. Какого типа u_id ?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38502226
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините плиз, что коряво написал.
данные отсортированы по ID. Когда я сравниваю два запроса поля ID и U.ID совпадают, а в поле SUBSTR(u.id,14,10) идет расхождение. Т.е. я делаю вывод, что СУБД или "криво" работает, или я что-то не понимаю.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38502250
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл написать u_id VARCHAR(24) not null
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38502473
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, как ведут себя a.u_id[14,24] или substring
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38502570
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
функции substr and substring ведут себя одинаково - плохо. Во вложенном файле сравнение двух запросов (вырезал кусок)
Правильно ведет себя a.u_id[14,24]. Но я завтра потестирую, выгружу раз 10 и сравню результат. Но почему substr and substring "врут" примерно на 5_ти процентах строк?
Хочу еще раз повторить, если эти запросы гонять на тестовой базе (кроме меня никого нет), то расхождений нет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
unload to /tmp/2.unl
select first 250000 a.id_paymtempl, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.utemplid
from paymtempl a

unload to /tmp/1.unl
select first 250000 a.id_paymtempl, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.utemplid
from paymtempl a
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38504673
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчера повторил тестирование, запуская два одинаковых запроса одновременно. Запускал 5 раз.
Результат тотже. Идет расхождение по полям, где работают функции substr и substring. Количество расхождений не постоянно и варируются от 3000 до 5000 строк.
Это "баг" информикса?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38504780
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень похоже на баг. Классический случай для обращения в саппорт. Баги в Substr и в Substring-е встречались и в более свежих версиях, правда в более запутанньіх случаях. Информация сугубо через Google, так как у меня только 10-я версия и то уже в архиве.
Для спасения чести информикса, запрос делается в DIRTY READ ? Информация, отбираемая по запросу, меняется в процессе?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38505064
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое.
Поддержка есть, будем обращаться в саппорт.
Но все равно не понятно. Почему на восстановленном бэкапе при одновременном запуске одинаковых запросов расхождений нет, а
в базе куда подключены за сотни пользователей расхождения есть? При этом хочу сказать, что во время проведения опытов, в эту таблицу не было не INSERT, ни UPDATE.

Для спасения чести информикса, запрос делается в DIRTY READ ?
Нет не стоит.

Информация, отбираемая по запросу, меняется в процессе?
Теоритически возможно, но вероятность слишком мала (стремится к нулю).
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38505737
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно все это.
Хотелось бы увидеть вывод вместе с самим полем u_id
Код: sql
1.
2.
3.
4.
...
select first 250000 a.id_paymtempl, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.u_id
from paymtempl a
...

[/quot]

Также неплохо было бы узнать значение конфигурационного параметра SQL_LOGICAL_CHAR
и переменных окружения DB_LOCALE и CLIENT_LOCALE.

Еще интереснее, что скажет саппорт.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38505772
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Б,

попробуйте предварительно загрузить во временную таблицу
а потом уже выгрузить в файл:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
select first 250000 a.id_paymtempl::int, a.u_id::char(24)
from paymtempl a
into temp temptable;
...
unload to tmp.unl
select first 250000 a.id_paymtempl, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.u_id
from tempbale;
...



Попробуйте поменять каталог выгрузки (на всякий случай :), а вдруг он битый
Попробуйте запустить oncheck на таблицу paymtempl.
И обязательно отпишитесь о результатах, если это действительно баг, то очень серьёзный,
все ещё оставшиеся пользователи Informix должны быть в курсе.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38506624
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to victor16
1. Выгрузка данных запроса в новый каталог.
Обратите внимание на овал, выделенный синим цветом. Это количество не совпадений. Выгрузка осуществляется на юниксовую машину, затем эти файлы я копирую на винду и там эти файлы сравниваю.

Код: sql
1.
2.
3.
4.
5.
6.
7.
unload to /usr/informix/1.unl
select first 250000 a.id, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.u_id
from paymtempl a

unload to /usr/informix/2.unl
select first 250000 a.id, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.u_id
from paymtempl a



2. Выгрузка в темповые таблицы и сравнение результатов.
Выгружал 5 раз и сравнивал результаты. Расхождений нет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select first 250000 a.id::int as id, 
substr(a.utemplid,14,10)::char(10) as substr_u_id,
a.utemplid[14,24]::char(10) as u_id_ok,
substring(a.utemplid FROM 14 FOR 10)::char(10) as substring_u_id,
a.utemplid::char(24) as u_id
from paymtempl a
into temp paymtempl1;
unload to /usr/informix/paymtempl1.unl select * from paymtempl1;
DROP TABLE paymtempl1;

select first 250000 a.id::int as id, 
substr(a.utemplid,14,10)::char(10) as substr_u_id,
a.utemplid[14,24]::char(10) as u_id_ok,
substring(a.utemplid FROM 14 FOR 10)::char(10) as substring_u_id,
a.utemplid::char(24) as u_id
from paymtempl a
into temp paymtempl2;
unload to /usr/informix/paymtempl2.unl select * from paymtempl2;
DROP TABLE paymtempl2;



3. При анализе расхождений мы пробовали и такую конструкцию

Код: sql
1.
2.
3.
4.
5.
6.
unload to /usr/informix/ttt.unl
select * from
(
select first 250000 a.id, substr(a.u_id,14,10),a.u_id[14,24],substring(a.u_id FROM 14 FOR 10),a.u_id
from paymtempl a
)



В таком выражении тоже расхождений нет. Вывод: расхождения идут во время фетча (что-то происходит, но не известно что и из-за чего).

Проверка таблицы и ее индексов ошибок не выдала
$ oncheck –cD paymtempl
TBLspace data check for paymtempl

$ oncheck –cI paymtempl

А что молчат представители IBM, я обращаюсь к GVF112GVF?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38507027
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей БВывод: расхождения идут во время фетча
У вас похоже, ко всему прочему и ошибка проявляется случайным образом, судя по листингу.
Еще один вопрос, структура таблицы менялась в последнее время?
Если менялась, был ли inplace-alter?
Если был inplace-alter, какое количество версий у этой таблицы?
Если был inplace-alter, не было ли после этого перехода на новую версию Informix?

Попробуйте сделать копию таблицы в другом db-пространстве и поработать с ней,
будет ли повторяться ошибка?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38507081
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaugavaОчень похоже на баг. Классический случай для обращения в саппорт. Баги в Substr и в Substring-е встречались и в более свежих версиях, правда в более запутанньіх случаях. Информация сугубо через Google, так как у меня только 10-я версия и то уже в архиве
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38507083
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей БДля спасения чести информикса, запрос делается в DIRTY READ ?
Нет не стоит.

При обращении в саппорт предоставляйте всю информацию.
Нам вы ответили, что уровень изоляции не DIRTY READ, но указали, какой же он всё таки.

Сергей БИнформация, отбираемая по запросу, меняется в процессе?
Теоритически возможно, но вероятность слишком мала (стремится к нулю).
Очень существенный момент.
Вы всё-таки сомневаетесь?
Добавьте триггер на обновление с логированием изменения поля. Или включите аудит на обновление.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38507085
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, опечатался. Правильно:
АнатоЛойНам вы ответили, что уровень изоляции не DIRTY READ, но НЕ указали, какой же он всё таки.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38508134
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Victor.
Структура менялась, но не значительно (нашел июльскую схему БД и сравнил структуры таблиц). Добавлялись только ограничения типа NOT NULL, DEFAULT. Поле, по которому идет SUBSTR, точно не менялось.
inplace-alter при мне не было. Вот что выдало oncheck –pT:paymtempl
Data (Home) 0
----------
Total Pages 87798

Home Data Page Version Summary
Version Count
0 (current) 0

Попробуйте сделать копию таблицы в другом db-пространстве и поработать с ней,
будет ли повторяться ошибка?

К сожалению не возможно сделать копию этой таблицы (17 Гб) в другом dbspace (нет места на диске). Могу только создать такую же таблицу и закачать туда данных процентов 60). Попробовать?

АнатоЛой. Уровня изоляции вообще никакого не стоит.
Данные в таблицу добавляются, но только ночью, примерно с часа до 3.

Не много истории и дополнений для ясности.
Когда заметили, что при выборке данных выдаются разные данные (было замечено 2 раза за полгода бухгалтерией). То сначала начали проводить эксперимент на реплике. Затем перешли на архивный сервер, т.к. там меньше активных сессий и он меньше нагружен. (На архивную базу данные переливаются с часа ночи до 3 по всем таблицам за 1 день). Так что во время тестирования данные не изменялись (для АнатоЛой). Версии информикса 11.50.FC4 (бой) и 11.70.FC6(архив).

Какие будут еще предложения?
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38508380
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Таки оформить обращение в саппорт.
2. Пока саппорт пытается вам помочь, использовать обходное решение.
Варианты:
а) вместо SubStr использовать [<с>, <по>];
б) если это не реально - пойти на повышение сложности обработки: создать и использовать собственную функцию.
Варианты:
б.1) делать обрезание двумя способами (substr, substring). Сравнивать результаты, в случае расхождения, делать повторно допустимое число раз - вдруг ошибка зависит от момента времени выполнения;
Обратил внимание, что в вашем примере сбоит то одна функция, то другая, но не видел строк, где сбойнули на одной записи обе - можете проверить у себя на полной выборке :).
б.2) написать свою функцию вырезания, работающую посимвольно.
....

П.С.:
3. просьба не дать умереть от любопытства и информировать о состоянии проблемы :).
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38508383
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой б.2) написать свою функцию вырезания, работающую посимвольно.
....

Например, вот отсюда :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create procedure substr (sText varchar(255), iFPos smallint, iLen smallint)
  returning varchar(255);

  define i smallint;
  define sReturn varchar(255);

  if iFPos > 1 then
    for i = 1 to iFPos  - 1 step 1
      let sText = sText[2,255];
    end for;
  end if;

  let sReturn = sText[1,1];
  if iLen > 1 then
    let sText = sText[2,255];
    for i = 2 to iLen step 1
      let sReturn = sReturn || sText[1,1];
      let sText = sText[2,255];
    end for;
  end if;

  return sReturn;

end procedure;
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38510068
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Как временное решение будем использовать

Код: sql
1.
substr(value,14,10)



Лично у меня нет возможности обратиться в саппорт. Тот кто знает "явки и пароли" временно не доступен.
Буду вас держать в курсе в при любом раскладе.
"Баги"не только в функциях substr and substring. Если применить функцию replace, то процент ошибочных данных возрастает чуть ли не в 2 раза больше.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38510780
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей БКак временное решение будем использовать

Код: sql
1.
substr(value,14,10)




Мне почему-то кажется, что проблема не в самом substr(), а в том, как эта функция обрабатывает тип varchar.
Неплохо было бы таки узнать значения конфигурационного параметра SQL_LOGICAL_CHAR
и переменных окружения DB_LOCALE и CLIENT_LOCALE.
...
Рейтинг: 0 / 0
Странное поведение Informix при работе с текстовыми функциями.
    #38511064
Сергей Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините за опечатку. Как временное решение будем использовать

Код: sql
1.
table.column [14,24]




настройки 11.70.FC6
SQL_LOGICAL_CHAR off
Код: sql
1.
2.
3.
env | grep LOCALE
CLIENT_LOCALE=ru_RU.1251
DB_LOCALE=ru_RU.1251




настройки 11.50.FC4
нет такой настройки в файле onconfig SQL_LOGICAL_CHAR
Код: sql
1.
2.
3.
env | grep LOCALE
CLIENT_LOCALE=ru_RU.1251
DB_LOCALE=ru_RU.1251



Виктор, я сильно сомневаюсь, что это происходит из-за поля, которое имеет тип varchar.
Я в предыдущих сообщениях описывал, что если брать статическую БД (нет ни одного пользователя, кроме моих 2-3 сессий), то эти строковые функции работают без ошибок.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странное поведение Informix при работе с текстовыми функциями.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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