Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странное поведение Informix при работе с текстовыми функциями. / 22 сообщений из 22, страница 1 из 1
16.12.2013, 14:21
    #38502173
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Наткнулись на то, что при выборке данных, используя функцию 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
16.12.2013, 14:27
    #38502189
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Может я не совсем внимательно прочитал чего Вьі хотели добиться. Но для получения идентичности вьіборок нужен хотя бьі order by по первичному ключу. Без него сервер отдаст те первьіе 250000 какие ему будут удобньі в данньій момент.

P.S. Вчитался внимательнее, ума не приложу, что ето может бьіть. Какого типа u_id ?
...
Рейтинг: 0 / 0
16.12.2013, 14:51
    #38502226
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Извините плиз, что коряво написал.
данные отсортированы по ID. Когда я сравниваю два запроса поля ID и U.ID совпадают, а в поле SUBSTR(u.id,14,10) идет расхождение. Т.е. я делаю вывод, что СУБД или "криво" работает, или я что-то не понимаю.
...
Рейтинг: 0 / 0
16.12.2013, 15:05
    #38502250
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Забыл написать u_id VARCHAR(24) not null
...
Рейтинг: 0 / 0
16.12.2013, 17:08
    #38502473
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Интересно, как ведут себя a.u_id[14,24] или substring
...
Рейтинг: 0 / 0
16.12.2013, 18:24
    #38502570
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
функции 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
18.12.2013, 10:38
    #38504673
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Вчера повторил тестирование, запуская два одинаковых запроса одновременно. Запускал 5 раз.
Результат тотже. Идет расхождение по полям, где работают функции substr и substring. Количество расхождений не постоянно и варируются от 3000 до 5000 строк.
Это "баг" информикса?
...
Рейтинг: 0 / 0
18.12.2013, 11:43
    #38504780
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Очень похоже на баг. Классический случай для обращения в саппорт. Баги в Substr и в Substring-е встречались и в более свежих версиях, правда в более запутанньіх случаях. Информация сугубо через Google, так как у меня только 10-я версия и то уже в архиве.
Для спасения чести информикса, запрос делается в DIRTY READ ? Информация, отбираемая по запросу, меняется в процессе?
...
Рейтинг: 0 / 0
18.12.2013, 13:33
    #38505064
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Спасибо большое.
Поддержка есть, будем обращаться в саппорт.
Но все равно не понятно. Почему на восстановленном бэкапе при одновременном запуске одинаковых запросов расхождений нет, а
в базе куда подключены за сотни пользователей расхождения есть? При этом хочу сказать, что во время проведения опытов, в эту таблицу не было не INSERT, ни UPDATE.

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

Информация, отбираемая по запросу, меняется в процессе?
Теоритически возможно, но вероятность слишком мала (стремится к нулю).
...
Рейтинг: 0 / 0
18.12.2013, 19:12
    #38505737
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Странно все это.
Хотелось бы увидеть вывод вместе с самим полем 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
18.12.2013, 19:36
    #38505772
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Сергей Б,

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

Код: 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
19.12.2013, 15:21
    #38506624
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
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
19.12.2013, 18:33
    #38507027
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Сергей БВывод: расхождения идут во время фетча
У вас похоже, ко всему прочему и ошибка проявляется случайным образом, судя по листингу.
Еще один вопрос, структура таблицы менялась в последнее время?
Если менялась, был ли inplace-alter?
Если был inplace-alter, какое количество версий у этой таблицы?
Если был inplace-alter, не было ли после этого перехода на новую версию Informix?

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

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

Сергей БИнформация, отбираемая по запросу, меняется в процессе?
Теоритически возможно, но вероятность слишком мала (стремится к нулю).
Очень существенный момент.
Вы всё-таки сомневаетесь?
Добавьте триггер на обновление с логированием изменения поля. Или включите аудит на обновление.
...
Рейтинг: 0 / 0
19.12.2013, 19:24
    #38507085
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Пардон, опечатался. Правильно:
АнатоЛойНам вы ответили, что уровень изоляции не DIRTY READ, но НЕ указали, какой же он всё таки.
...
Рейтинг: 0 / 0
20.12.2013, 16:22
    #38508134
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
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
20.12.2013, 18:50
    #38508380
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
1. Таки оформить обращение в саппорт.
2. Пока саппорт пытается вам помочь, использовать обходное решение.
Варианты:
а) вместо SubStr использовать [<с>, <по>];
б) если это не реально - пойти на повышение сложности обработки: создать и использовать собственную функцию.
Варианты:
б.1) делать обрезание двумя способами (substr, substring). Сравнивать результаты, в случае расхождения, делать повторно допустимое число раз - вдруг ошибка зависит от момента времени выполнения;
Обратил внимание, что в вашем примере сбоит то одна функция, то другая, но не видел строк, где сбойнули на одной записи обе - можете проверить у себя на полной выборке :).
б.2) написать свою функцию вырезания, работающую посимвольно.
....

П.С.:
3. просьба не дать умереть от любопытства и информировать о состоянии проблемы :).
...
Рейтинг: 0 / 0
20.12.2013, 18:55
    #38508383
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
АнатоЛой б.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
23.12.2013, 15:23
    #38510068
Сергей Б
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение Informix при работе с текстовыми функциями.
Спасибо.
Как временное решение будем использовать

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



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

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




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

Код: 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
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странное поведение Informix при работе с текстовыми функциями. / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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