Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть вопрос про NickName, который используется в функции. Имеем СУБД (9.7). Есть функция, которая используется во многих местах. В этой функции используется через union несколько select - ов, как обычные таблицы , так и NickName. Функция возвращает таблицу (Return table). Из-за этой функции периодически возникают блокировки, дабы их не было. Хочется в функции прописать with ur (грязное чтение). В документации сказано, что это возможно: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.rn.doc%2Fdoc%2Fc0023718.htm Переписать, то я переписал, но идёт ругачка, типа в данном контексте with ur запрещён. Пробовал обернуть функцию в другую функцию, дабы в ней вызвать первую функцию with ur. Может кто нить что нибудь посоветовать? Переписать все вызовы функции в коде , нереально - их штук 150, что оооочень бы не хотелось! Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 10:16 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Забыл уточнить, удаленный источник для NICKNAME находится на том же инстансе в другой базе DB2. Тоесть база та же DB2 (9.7). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 11:14 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed, Потролю немножко, походу Марк в отпуске ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 16:21 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Кстати в процедурах такое возможно: Код: plsql 1. 2. 3. 4. .Но мне нужна именно функция, так как потом она используется как select id from table (FUNCK_NICKNAME). Есть какой то обходной путь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 17:32 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Марк, не выручите? Я выдохся - всё пробовал и исчерпал по данному вопросу свои силы. I need help! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 15:37 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed, Здравствуйте. Не нашел явного указания в документации, но, похоже, что нельзя в функциях, обращающихся к федеративным объектам, использовать isolation clause. Либо используйте процедуры, либо можете устанавить UR по-умолчанию для соединения (с помощью процедуры и параметра базы CONNECT_PROC), если это вам подойдёт, и у вас действительно блокировки из-за этой функции в удаленной базе. Кстати, как вы определили, что блокировки именно из-за этой функции? Какие именно блокировки она накладывает и на какие ресурсы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 16:03 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinmedoed, Здравствуйте. Не нашел явного указания в документации, но, похоже, что нельзя в функциях, обращающихся к федеративным объектам, использовать isolation clause. Либо используйте процедуры, либо можете устанавить UR по-умолчанию для соединения (с помощью процедуры и параметра базы CONNECT_PROC), если это вам подойдёт, и у вас действительно блокировки из-за этой функции в удаленной базе. Кстати, как вы определили, что блокировки именно из-за этой функции? Какие именно блокировки она накладывает и на какие ресурсы? Спасибо за отклик, Марк! Может зафиксите как баг для IBM от себя,(так точно быстрее должны поправить) было бы удобно уровни изоляции и к удаленным объектам применять! Процедуры мне не подойдут - я потом фукнкцию в конструкции from использую. Процедуру я в конструкцию select from table не засуну! >> либо можете устанавить UR по-умолчанию для соединения (с помощью процедуры и параметра базы CONNECT_PROC) А как это мне поможет? Ведь у меня в одной функции куча union к обычным таблицам и 2-ва к MQT. Дык вот функция компилится нормально а при выполнении пишет, что в данном контексте clause wth isolation use and keep is not allowed. Тоесть как только она видит Nickname c опцией with - все полный пипец! Раздробить на 2-ве для обычных таблиц и для NickName а потом соединить в одной и оставить with ur только для обычных таблиц - тоже ругачка при выполнении! >> Кстати, как вы определили, что блокировки именно из-за этой функции Сделал в централе задачу, которая каждую минуту сканит базу на предмет блокировок (from SYSIBMADM.MON_LOCKWAITS) и если есть записывает в таблицу для лога, потом в интерфейсе отображается этот лог для разных баз. >> Какие именно блокировки она накладывает и на какие ресурсы? При одновременном обновлении тех таблиц, на которых она базируется! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 17:01 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed >> либо можете устанавить UR по-умолчанию для соединения (с помощью процедуры и параметра базы CONNECT_PROC) А как это мне поможет? Ведь у меня в одной функции куча union к обычным таблицам и 2-ва к MQT. Дык вот функция компилится нормально а при выполнении пишет, что в данном контексте clause wth isolation use and keep is not allowed. Тоесть как только она видит Nickname c опцией with - все полный пипец! Раздробить на 2-ве для обычных таблиц и для NickName а потом соединить в одной и оставить with ur только для обычных таблиц - тоже ругачка при выполнении! 2-ва к MQT или к nickname? Уровень изоляции сессии при соединении мапится на соответствующий уровень изоляции удалённого сервера. Т.е. предположительно, если у вас будет UR по-умолчанию на федеративном сервере, то и запросы в удалённый будут идти тоже с UR, если вы явно в федеративном запросе не указываете уровень изоляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 17:26 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinmedoed >> либо можете устанавить UR по-умолчанию для соединения (с помощью процедуры и параметра базы CONNECT_PROC) А как это мне поможет? Ведь у меня в одной функции куча union к обычным таблицам и 2-ва к MQT. Дык вот функция компилится нормально а при выполнении пишет, что в данном контексте clause wth isolation use and keep is not allowed. Тоесть как только она видит Nickname c опцией with - все полный пипец! Раздробить на 2-ве для обычных таблиц и для NickName а потом соединить в одной и оставить with ur только для обычных таблиц - тоже ругачка при выполнении! 2-ва к MQT или к nickname? Уровень изоляции сессии при соединении мапится на соответствующий уровень изоляции удалённого сервера. Т.е. предположительно, если у вас будет UR по-умолчанию на федеративном сервере, то и запросы в удалённый будут идти тоже с UR, если вы явно в федеративном запросе не указываете уровень изоляции. 12 union к обычным таблицам и 2-ва к NickName конечно. Я понимаю, что если я укажу для всего федеративного сервера with ur -это мне поможет отчасти , но на 12 обычных таблиц в функции блокировки останутся! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 17:30 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed12 union к обычным таблицам и 2-ва к NickName конечно. Я понимаю, что если я укажу для всего федеративного сервера with ur -это мне поможет отчасти , но на 12 обычных таблиц в функции блокировки останутся!Нет, не останутся. У вас ведь уровень изоляции в сессии будет по-умолчанию - UR, и на локальных таблицах он тоже будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 18:14 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Марк, у меня на справочной базе и на базе с данными стоит по умолчанию уровень изоляции CS. Для одной функции, которая массово выбирает данные, я хочу поставить UR. Но с этим источником,как справочной базой работаюи и MQT и триггеры, я не хочу для баз прописывать UR. Или я чего то не понимаю и можно только для конкретных коннекций, к конкретным таблицам прописывать уровень изоляции UR и при этом на функцию, которая использует двенадцать обычных таблиц и 2-ва Nickname тоже уровень изоляции накатится UR, я не совсем понимаю, как это так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 19:17 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed, Уровень изоляции по-умолчанию можно задавать и менять на уровне приложения. С федеративными источниками правило такое: уровень изоляции соединения с источником по-умолчанию берётся с федеративного сервера, и потом в этой сессии его нет возможности изменить. Вы можете задавать уровень изоляции федеративного запроса явно, но там есть ограничения. Statement level isolation in a federated system В вашем случае, когда оно не разрешает WITH в функции, это, скорее всего, есть ограничение на WITH в подзапросе (subquery). Что вы можете попытаться сделать в этой выбранной вами архитектуре. Выше я неправильно указал, что можно попытаться установить уровень изоляции по-умолчанию (в процедуре, которая будет вызываться при connect) - оно не реагирует на это. Вы можете, в зависимости от типа соединения, устанавливать уровень по-умолчанию: jdbc - свойство defaultIsolationLevel=1 cli/odbc - свойство TxnIsolation =1 в db2cli.ini После установки соединения можно пнуть какой-нибудь федеративный запрос (цель - установить соединение с источником на текущем уровне изоляции - UR). Затем в сессии можно выдать команду типа: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 16:57 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinmedoed, Уровень изоляции по-умолчанию можно задавать и менять на уровне приложения. С федеративными источниками правило такое: уровень изоляции соединения с источником по-умолчанию берётся с федеративного сервера, и потом в этой сессии его нет возможности изменить. Вы можете задавать уровень изоляции федеративного запроса явно, но там есть ограничения. Statement level isolation in a federated system В вашем случае, когда оно не разрешает WITH в функции, это, скорее всего, есть ограничение на WITH в подзапросе (subquery). Что вы можете попытаться сделать в этой выбранной вами архитектуре. Выше я неправильно указал, что можно попытаться установить уровень изоляции по-умолчанию (в процедуре, которая будет вызываться при connect) - оно не реагирует на это. Вы можете, в зависимости от типа соединения, устанавливать уровень по-умолчанию: jdbc - свойство defaultIsolationLevel=1 cli/odbc - свойство TxnIsolation =1 в db2cli.ini После установки соединения можно пнуть какой-нибудь федеративный запрос (цель - установить соединение с источником на текущем уровне изоляции - UR). Затем в сессии можно выдать команду типа: Код: plaintext Спасибо, Марк! Боюсь это мне не поможет, в качестве интерфейса - у меня есть толстый клиент в виде конструктора, в нём я не могу менять свойство коннекта, в толстом клиенте, я наверное могу прописать команду set isolation level - но мне получается надо будет прописывать во многих местах. >> В итоге все обращения к локальным таблицам будут с CS, а к удалённым - с UR Спасибо , Марк! Но это не решение проблемы, потому как: Мне не надо ко всем обращениям к федеративному серверу читать по грязному (ведь я могу insert и в NickName сделать - c with ur - это плохо), мне надо только в рамках одной функции прописать для всех select - ов with ur (грязное чтение). Да хрен с ним уже с 2-мя union для NickName. Пусть хотя бы для 12 union - ов в функции к обычным таблицам будет грязное чтение, а для остальных 2-х union -ов с NickName - останется CS. Было бы логично разработчикам IBM - делать именно так, не можете в рамках функции менять уровень изоляции для NickName - не меняйте, но остальные то сущности почему должны страдать... P.S. После таких подстав от IBM - сильно ностальгируется по MSSQL, там nolock (грязное чтение) можно писать к каждой таблице и view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 17:24 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed, тогда у вас есть 2 выбора: - переписать вызов этих функций - реплицировать информацию из nickname-ов и обращаться только к локальным таблицам P.S.: Обычно, сначала разбираются с функциональностью продукта, а потом пишут много кода. А не наоборот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 17:54 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinmedoed, тогда у вас есть 2 выбора: - переписать вызов этих функций - реплицировать информацию из nickname-ов и обращаться только к локальным таблицам P.S.: Обычно, сначала разбираются с функциональностью продукта, а потом пишут много кода. А не наоборот... >> - переписать вызов этих функций Это на крайняк, но мы думаем об этом! >> - реплицировать информацию из nickname-ов и обращаться только к локальным таблицам Это опять MQT - и потом на многомиллионных таблицах ловить deadlock по 5-ть минут - нет спасибо, лучше с NickName остаться имхо! >>P.S.: Обычно, сначала разбираются с функциональностью продукта, а потом пишут много кода. Текущей системе лет -5 ть, я с ней только 2 месяца работаю и начал как раз с оптимизации, так получилось. А так то да - задним умом мы все крепки ! Марк, у меня уже было предложение к Вам - заявить это как баг в IBM (невозможность вызова NickName в функциях c определенным уровнем изоляции) Это же в любом случае улучшение системы СУБД DB2, если такие просьбы о доработках игнорировать, будет как с Sybase: http://www.sql.ru/forum/actualthread.aspx?tid=980507 Имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 18:09 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed>> - реплицировать информацию из nickname-ов и обращаться только к локальным таблицам Это опять MQT - и потом на многомиллионных таблицах ловить deadlock по 5-ть минут - нет спасибо, лучше с NickName остаться имхо! Почитайте про cache tables . Кроме того, вы можете не связываться с MQT на nickname и кэшированием (это та же репликация), а просто выкинуть nickname и настроить репликацию удаленного справочника. В обоих случаях не надо делать постоянно делать полный refresh. medoedМарк, у меня уже было предложение к Вам - заявить это как баг в IBM (невозможность вызова NickName в функциях c определенным уровнем изоляции) Это же в любом случае улучшение системы СУБД DB2...Такие предложения (DCR - Design Change Request) инициируются клиентами. Пишите в IBM - мол, вот, хочу, чтоб можно было делать так. В IBM посмотрят на экономическую целесообразность, на похожие требования других клиентов. Но в данном случае, если бы я, например, рассматривал такой запрос, то я бы сначала посоветовал примерно как в анекдоте: Приходит больной к доктору, крутит руками и говорит: - Доктор, мне больно когда я так делаю! - Ну не делайте так! И только если бы вы мне смогли доказать, что не крутить руками вот так нет никакой возможности, и ещё многие тоже никак не могут по-другому, то я бы начал лечить DB2 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 18:28 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
>>Почитайте про cache tables. >>Кроме того, вы можете не связываться с MQT на nickname и кэшированием (это та же репликация), а просто выкинуть nickname и >>настроить репликацию удаленного справочника. >>В обоих случаях не надо делать постоянно делать полный refresh. Оба Ваши варианта базируются на репликации, она пусть редко, но падает - это значит надо привлекать админа, как следствие накладывать на себя ограничения, админ может быть в отпуске или приболеть и всё- вся система встанет раком без репликации! У меня такое было в первом моём банке, причем репликационный сервер показывал, что все гут, а проводки на бэк- офис не проливались с фронта. Я бы понял ещё если бы был другой инстанс, находящийся где нибудь в другой стороне города, тогда возможно и репликация была бы нужна. Но если базы находятся на одном инстансе, делать репликацию - как то не логично. Для MSSQL это вообще не вопрос считать данные с другой базы select * from BASE2.dbo.table2 (nolock) в любой функции без проблем! >>Такие предложения (DCR - Design Change Request) инициируются клиентами. >>Пишите в IBM - мол, вот, хочу, чтоб можно было делать так. >>В IBM посмотрят на экономическую целесообразность, на похожие требования других клиентов. Sybase тоже все подсчитывало экономическую целесообразность (там менеджмент), правда патчи частенько выпускало. Пару лет назад их купил SAP)) . Мою заявку IBM будет мурыжить годами, Вашу как VIP- персоны - возможно рассмотрят за пару месяцев. >>Приходит больной к доктору, крутит руками и говорит: >>- Доктор, мне больно когда я так делаю! >>- Ну не делайте так! Если мне нужно руками крутить, так же как и соседу для того чтобы выполнять упражнение на турнике, например и допустимые махи руками вызывают боль я, впрочем как и другие пациенты рано или поздно выберут другого врача (хирурга или невролога), который назначит физио процедуры , снимки плечевого сустава, выпишет что нибудь аля диклофенака, назначит ЛФК)) И рано или поздно такой врач, который относится пофигистически к пациентам, к сожалению окажется без работы, рынок есть рынок. За 2 месяца работы с DB2 я наткнулся, как мне кажется на немало ограничений: 1) Триггеры нельзя disable/enable. 2) На одном инстансе нельзя напрямую обращаться к сущностям разных баз DB2. 3) Уровень изоляции ставится на блок, вместо того, чтобы применяться к каждой сущности. 4) Нет нормального монитора блокировок (аналог функции sp_lock), как на MSSQL или sp_showplan (план текущего выполнения процесса), как в Sybase. 5) Нет нормального профайлера (родного от IBM), который бы логину или по имени машины - показывал полный лог, до мельчайшей команды в realtime 6) При массовой вставке в IDENTITY поле, функция IDENTITY_VAL_LOCAL() - функция возвращает NULL, scope_identity() - в MSSQL так себя не ведёт. 7) В табличной функции DB2 (RETURN TABLE ) нельзя объявить табличную переменную, заполнить её и вернуть declare @t table и вернуть без всякого SET (только в процедуре). 8) Нельзя стандартными функциями DB2, работающими со строками - вернуть varchar(max), VARCHAR(32000). CLOB - все такми немного другое, имхо! 9) В интернете нет online базы для DB2, для тестов, а для других распотранённых субд есть sqlfiddle.com КАК то ТАК... Начальный вопрос темы вполне освещён, спасибо Марку ! Змоциональный выброс - прошу прощения, немного накипело ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 23:40 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Не всё так плохо. Но, в свою очередь, хочется выразить... удивление - системой, которую вы строите. Все эти федеративные базы на одном узле, табличные функции, которым к тому же непременно надо куда-то что-то записать, и т.п. Такое чувство, что вы пытаетесь воспрооизвести 1:1 подход, который вы обычно применяете на Sybase/MS SQL, и наверняка так оно и есть. На DB2 мне он кажется вредительством - то бишь, вы делаете лишнюю работу, с тем, чтобы получилось хуже (по производительности, как минимум). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 09:07 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
>> Не всё так плохо. Ну конечно есть плюсы, например к функции, можно обратиться в конструкции from, в MSSQL если мне не изменяет память, функцию, возвращающую таблицу можно join -ить только в cross aply. Есть в DB2 функция listagg для что собирает строку для столбца таблицы - в MSSQL через XML. Но по сравнению с Sybase/MS SQL плюсов честно говоря у DB2 меньше. Это я не стал вспоминать облачные технологии (у DB2 только тесты ещё идут), DTS => SSIS, RSIS, SSAS от MSSQL - тогда снова DB2 немного просядет в сравнении >> >>Все эти федеративные базы на одном узле Эта система внешняя с открытым кодом и федеративные базы появились не от меня, мне как MSSQL - щику эти федеративные базы кажутся лишними, но длительные ночные расчеты и стоимость железа - сделали свое дело, опять же решение не я принимал, это наследие... >> табличные функции, которым к тому же непременно надо куда-то что-то записать Я обошёлся без этого (без записи в доп. таблицу), но все почему - из-за ограничений DB2 - java функция для DB2 не умеет работать с NIckName (а мы хотим уйти от MQT), поэтому и пришлось переписать java- функцию, которая из строки указанного столбца таблицы - собирает строку - на SQL. >> Такое чувство, что вы пытаетесь воспрооизвести 1:1 подход, который вы обычно применяете на Sybase/MS SQL, и наверняка так оно и есть. Вы ошибаетесь, я полнокровно изучаю возможности DB2 (тем более, что пол года работы с Oracle есть за плечами тоже), часами читаю литературу и смотрю форумы по всему миру, дабы не изобретать велосипеды! К тому же часто устраиваю мозговой штурм с коллегами и начальством, дабы покритиковали мои решения. К тому же меня контролируют по производительности админы и начальство, например из-за моего монитора блокировок, который логирует каждую минуту состояние базы на предмет блокировок - увеличилось число дисковых операций, процентов на 10, но пока это терпимо (зато теперь знаем актуальных виновников ). Уйдём от блокировок, буду запускать монитор реже! >> На DB2 мне он кажется вредительством - то бишь, >>вы делаете лишнюю работу, с тем, чтобы получилось хуже (по производительности, как минимум) Пока результаты обнадёживают, процентов 20% блокировок с системы ушло, есть мысли как ещё 60% убрать. Скорость при этом тоже высчитывается и пока не падает. Буду мешать системе - мою работу прикроют, так что не беспокойтесь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 09:39 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoedПока результаты обнадёживают, процентов 20% блокировок с системы ушло, есть мысли как ещё 60% убрать. интересно, а какой объем памяти (от доступной субд) занимал lock list на пике ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 14:03 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
lockListmedoedПока результаты обнадёживают, процентов 20% блокировок с системы ушло, есть мысли как ещё 60% убрать. интересно, а какой объем памяти (от доступной субд) занимал lock list на пике ? Мы не смотрели оперативку, заюзанную под lock list (я не админ, сорри). Мы разбирали по сущностям, смотрели на гигантские MQT, refresh которых вызывал блокировки. Пока мы смогли одну 10- ти миллионую MQT заменить на NickName (c ежедневным обновлением статистики по NickName). Время запросов особо не увеличилось (где то уменьшилось, где то увеличилось по сравнению с MQT), а вот 5-ти минутного зависания (блокировок) из-за обновления той большой MQT не стало. Как то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 14:19 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
medoed, Присоединюсь к Виктору. Вы разбираетесь с плохим архитектурным решением и накручиваете сверху невесть что. Результат будет заведомо плохим. Различные базы в DB2 by design независимы. У них свои выделенные блоки памяти, свои агенты (работающие в данный момент с конкретной базой), свой scope транзакций . Агент не может взять и полезть в "соседнюю" базу за данными, весь обмен идёт по DRDA протоколу. Это а) идеологически правильно (за что лично я люблю DB2, и из этого самым неожиданным образом вдруг вырастают всякие вкусные вещи) б) позволяет изолированно управлять разными базами. Из рассказываемого Вами следует то, что всё это должно быть одной базой. Ну так слейте всё вместе, в чём проблема? На уровне БД более чем достаточно механизмов разделения ресурсов, которые позволят отделять решение одних задач от других. Если вы всё же не хотите, или есть веские причины этого не делать, то ПОЧЕМУ НУЖНО ОТКАЗЫВАТЬСЯ ОТ РОДНОГО МЕХАНИЗМА, специально предназначенного для инкрементального продуцирования изменений из базы в базу??? Репликации нуждаются в дополнительном maintenance? А кто обещал, что будет легко?! :) У вас нет бэкапа для админа (это, вообще, админская работа, настраивать, мониторить и поддерживать репликации; мониторинг состояния репликаций отлично автоматизируется) на продуктиве на время болезней/отпусков??? :O Ну... срочно растите у себя ещё одного админа или совместителя. Мне непонятно, как можно жить без такого бэкапа. Или ищите, кому можно отдать эту задачу на откуп (типа Triton ). Хороший вопрос, кстати, созрел ли у нас народ для подобных услуг (или, может, уже есть кто, такие услуги представляющий?). По претензиям (ограничениям): > 1) Триггеры нельзя disable/enable. Да, неудобно. Но, возможно, свой смысл в этом есть. Триггеры в DB2 "inlined" (с 9.7 для некоторых случаев можно сделать "compiled"), что означает, что тело триггера выполняется не как код в PVM (Procedure Virtual Machine), а встраивается непосредственно в запросы (и уже после компилируется и оптимизируются как единое целое). "Выключение" триггера сразу инвалидирует пакеты и планы запросов в кеше, с ним связанные, т.е. может иметь достаточно большой impact. При удалении, к примеру, view - это очевидно. "Выключении" триггера - не очень. С другой стороны, если мы хотя бы чуть-чуть "в теме", дело, вроде, нехитрое: Код: sql 1. (но надо ещё помнить про то, кто owner триггера, тут могут быть дыры в безопасности, как и с механизмом включения/выключения). > 3) Уровень изоляции ставится на блок, вместо того, чтобы применяться к каждой сущности. Не могу прокомментировать, пропустил часть обсуждения. Что именно Вам нужно (кроме как избавиться от блокировок на конкретном statement'е)? > 4) Нет нормального монитора блокировок (аналог функции sp_lock), как на MSSQL или Не хватает мощности MON_GET_LOCKS table function , MON_LOCKWAITS administrative view , MON_GET_APPL_LOCKWAIT table function , LOCKS_HELD administrative view , LOCKWAITS administrative view , их deprecated snapshot monitoring версий, locking event monitor'ов , диагностики в diagpath, db2pd ... -locks ... -wlocks ... ??? > sp_showplan (план текущего выполнения процесса), как в Sybase. Картина примерно такая же как с блокировками. > 5) Нет нормального профайлера (родного от IBM), который бы логину или по имени машины - показывал полный лог, до > мельчайшей команды в realtime Вы хотите сказать, что не нашли "on-line" визуализатора? Вообще говоря а) есть такие вещи как tracing (CLI/ODBC, JDBC), statement monitoring, event monitoring для activities и т.п. б) если мы говорим о взрослой серьёзной системе, то сотни/тысячи запросов, выплёвываемые в realtime вряд ли вам нужны. > 6) При массовой вставке в IDENTITY поле, функция IDENTITY_VAL_LOCAL() - функция возвращает NULL, > scope_identity() - в MSSQL так себя не ведёт. Ну, identity - это вообще отдельная песня. Я не уверен, что это хорошо, что IBM пошла на поводу у пользователей и ввела эту сущность в DB2. Разве что для облегчения миграций. Identity плохо вписываются (точнее - никак) в транзакционные механизмы, служат источником многих проблем в долго живущих системах ("А-а-а-ааа!!! У нас диапазон идентификаторов заканчивается!!!!!"), создают ОГРОМНЫЕ проблемы при слиянии информационных систем (например, нескольких баз, разделённых по регионам, в одну) и т.п. GENERATE_UNIQUE() - вот идеологически правильный путь. В данном же случае (scope_identity() после массовой вставки) - вопрос, нахре... зачем он нужен??? > 7) В табличной функции DB2 (RETURN TABLE ) нельзя объявить табличную переменную, > заполнить её и вернуть declare @t table и вернуть без всякого SET (только в процедуре). Это опять же определяется декларативной/функциональной природой, присущей inlined compound statement'ам, а не императивной/процедурной, присущей compiled блокам. Только в этом случае ф-я может быть предметом для оптимизации в рамках более общего выражения. Когда используемое выражение стоит во FROM это очень важно. Наложенное ограничение может быть несколько искусственно, но оно не даёт скатиться в полный трэш при разработке: чаще разработчики почему-то не умеют мыслить функционально и оперировать set'ами, проще понаделать временных таблиц, самостоятельно их заполнить, итеративно перебирая строки, потом уже итеративно проходить по этим временным таблицам и т.д. это мало того, что требует массовых и одновременно весьма дорогостоящих операций типа fetch (чаще - из случайных мест таблицы, т.е. prefetch не работает), так ещё и однозначно определяет план выполнения, который далеко не всегда оптимальный (или далеко не всегда будет оптимальный). Другой важный момент, для "compiled" табличных функций статистика была бы сильно урезана. Для external можно указать только предплолагаемую cardinality. Если можно было бы указать какую другую, то стояла бы большая проблема поддержки её актуальности. Для inlined табличных ф-ий статистика вычислима (хотя, зависит, конечно, от того, что мы внутри накрутим). PS Хотелось бы ко всему этому порекомендовать с осторожностью относиться ко всяким tips & tricks, встречаемым в сети. Они далеко не всегда разумны, подчас давно потеряли свою актуальность, иногда представляют какие-то новые фичи, которые не всегда проверены временем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 14:27 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
Добрый день, заранее извиняюсь что не по теме, подскажите пожалуйста необходимо: На сайте должна отображаться информация по клиентам которые зарегистрировались потом по ключу делается поиск и подтягивается информация. Как и куда обратиться? Что бы на сайт (база на MSQL) информация вытягивалось с другого сервера ( база на ДБ2). Вопросы: С чего начать или писать программу для передачи данныхх с базы DB2 в MSQL. Где почитать и с чего начать? или есть другой способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 15:55 |
|
||
|
NickName в функции (с низким уровнем изоляции)
|
|||
|---|---|---|---|
|
#18+
shaman902Добрый день, заранее извиняюсь что не по теме, подскажите пожалуйста необходимо: На сайте должна отображаться информация по клиентам которые зарегистрировались потом по ключу делается поиск и подтягивается информация. Как и куда обратиться? Что бы на сайт (база на MSQL) информация вытягивалось с другого сервера ( база на ДБ2). Вопросы: С чего начать или писать программу для передачи данныхх с базы DB2 в MSQL. Где почитать и с чего начать? или есть другой способ? Если таблицы небольшие, с которой идут запросы из DB2 и все происходит в рамках одного домена - Сделайте Linked Server на севере MSSQL для базы DB2 и тягайте информацию прямыми запросами. Если сервера не в одном домене или есть какой нить хитрый DMZ - используйте web services. В рамках 3-х звенной архитектуры web services более правильное решение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 17:03 |
|
||
|
|

start [/forum/topic.php?fid=43&tid=1601505]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 289ms |
| total: | 447ms |

| 0 / 0 |
