Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Перетаскиваю старую программу на новый сервер. В старой программе вся логика производилась на стороне клиента. Сейчас я просто тупо, один-к-одному перенёс логику в ХП, и получилось следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. И вот я думаю - а нужны ли все эти сложные проверки, перед тем как осуществить операцию изменения/добавления? Ведь таблица уже содержит все необходимые ограничения целостности - непустое и уникальное поле "NAME". Может быть, лучше не производить никаких предварительных проверок, а просто сразу выполнять операцию изменения/добавления, с отловом возникающих ошибок и передачей соответствующего сообщения пользователю? Какая стратегия для АСА более эффективна, в плане уменьшения нагрузки на сервер - с предварительной проверкой или с последующей обработкой ошибок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 08:14 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Проверки абсолютно не нужны. Во первых сервер это сделает автоматически, во вторых для того, чтобы вернуть клиентскому приложению осмысленный текст, а не текст самой ошибки, можно или в клиентской части централизованно обрабатывать ошибки по кодам или же в процедуре добавить блок exception и в нем по кодам ошибок возвращать RAISERROR. Так что своя проверка таких ошибок - это просто увеличение нагрузок на сервер, так как по любому их сервер тоже будет производить. P.S. Я, глядя на код, рекомендовал бы обратить внимание на следующие вещи: 1. Убрать тексты с RAISERROR и зарегистрировать ошибки через CREATE MESSAGE c нужными параметрами в тексте. 2. В CASE добавить еще ELSE и генерить ошибку "Неизвестная операция" - дополнительная проверка работы клиентской части. 3. Очень задуматься над тем, что GUID в качестве ключей это ужасно неэффективная вещь, которая станет тормозить уже даже на нескольких тысячах записей и пока не поздно перевести все на GLOBAL AUTOINCREMENT. Обьясняю - индексы по GUID строятся ужасно в силу его природы, я лично имею реальный опыт, где в принципе то небольшая базка на GUID-ах просто тормозила, перевели на инкременты и база сейчас уже ого го и никаких тормозов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 08:24 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
1. Если я правильно понял смысл замены RAISERROR на CREATE MESSAGE, то строка MESSAGE создаётся как глобальный объект и может принимать параметры %1. То есть замена делается просто ради экономии и уменьшения скрипта? Но тут возникает другая проблема. Если у меня в таблице есть два или больше поля с условиями NOT NULL и <>'', то при добавлении записи возникнет ошибка - а как тогда я определю, на каком именно поле нарушено ограничение целостности? Это нужно для того, чтобы на клиенте установить фокус на ошибочном поле ввода. 2. Обязательно сделаю. 3. ГУИД'ы использовались для обеспечения репликации. GLOBAL AUTOINCREMENT - судя по БОЛу, тоже предназначен для репликации. Но ведь при добавлении записей на основной и удалённой БД записи будут всё равно иметь одинаковые значения ключа? Или это разрешается только через указание диапазона ключевых значений для каждой удалённой БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 13:56 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Евгений_СТ1. Если я правильно понял смысл замены RAISERROR на CREATE MESSAGE, то строка MESSAGE создаётся как глобальный объект и может принимать параметры %1. То есть замена делается просто ради экономии и уменьшения скрипта? Это позволяет сделать централизованное хранение ошибок, если нужно, с многоязыковой поддержкой. Не нужно текст одной и той же ошибки клонировать по скриптам, легко изменять текст ошибки, и т.д. Евгений_СТНо тут возникает другая проблема. Если у меня в таблице есть два или больше поля с условиями NOT NULL и <>'', то при добавлении записи возникнет ошибка - а как тогда я определю, на каком именно поле нарушено ограничение целостности? Это нужно для того, чтобы на клиенте установить фокус на ошибочном поле ввода. Вот здесь как раз самое лучшее не извращаться над сервером, а проверять такие условия прямо на клиенте, ДО посылки сохранения изменений на сервере. Тогда и будет легко определить ошибку, и фокус поставить куда нужно и главное не напрягать сервер и сеть тем, что можно быстро локально проверить. Евгений_СТ3. ГУИД'ы использовались для обеспечения репликации. GLOBAL AUTOINCREMENT - судя по БОЛу, тоже предназначен для репликации. Но ведь при добавлении записей на основной и удалённой БД записи будут всё равно иметь одинаковые значения ключа? Или это разрешается только через указание диапазона ключевых значений для каждой удалённой БД? Упс, срочно читать BOL про Global Autoincrement :) В том то и дело, что он именно и сделан как раз для репликаций, то есть когда он указывается на таблицу, ему дается диапазон действия (например ставим 1000000). Для каждой БД в репликации выставляем в опции Global_Database_id ее номер. Например для консолидированной ставим 0. Значит разрез инкремента id в таблице будет от 1 до 1000000. Ставим для удаленной 1, значит она работает в разрезе от 1000001 до 2000000, и т.д. Причем когда на консолидированную или удаленную БД вставляются записи из других БД, то они не сбивают последнее показание счетчика, так как не попадают в диапазон его действия на текущей БД. Вывод - однозначно отказываться от GUID, иначе проблем поимеете на свою голову просто огромное кол-во и со скоростью и с сопровождением и с размером БД и еще страшно представить каких. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 14:21 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
/topic/203181 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 14:29 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Всё понял. Спасибо большое за обстоятельный ответ. Буду работать дальше в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 14:30 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
ASCRUS, так какие проблемы могут быть, если первичный ключ фиксированной длины будет длиннее на 30 байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 14:42 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Рыжий КотASCRUS, так какие проблемы могут быть, если первичный ключ фиксированной длины будет длиннее на 30 байт? Ну во первых, чем короче размер поля таблицы, тем компактнее индекс. Надо думать, на PK будут ссылаться FK, которые могут еще и в составные PK входить. Там 30 байт, здесь 30 байт и схлопотали compressed или hash-индекс. Далее - чем меньше ширина записи, тем больше их поместиться на страницу, а значит и осядет в кэше. Далее - GUID генериться без какой либо последовательности, а значит при вставках новых записей на индексах это будет выглядеть не самым оптимальным образом. Снижается скорость вставки и поиска по индексам. Поэтому лично мое мнение - GUID может быть нужен действительно для присвоения уникального в мировых масштабах идентификатора, но плохой кандидат на роль замены инкрементов как синтетический ключ, хотя конечно выглядит удобным с точки зрения репликаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 14:52 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
>>Снижается скорость вставки и поиска по индексам. 1. Скорость. Неужели у вас поиск в базе по символьным полям в 50-100 символов с индексами настолько медленнен? Вставка. Вы отключаете индекс, вставляете и перестраиваете его каждый раз в каждой таблице где есть символьное поле с индексом? Вот проблемы с большими целыми числами - потеря разрядности - на примере php и excel я привел, и они вполне реальные. А вот проблем с guid, описанных вами... сколько не жду, никак не появляются... упорядоченность вставки записей достигается при помощи поля insert_time datetime current utc timestamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 15:07 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Гм, я привел пример из личного опыта - была рабочая БД с неплохим обьемом таблиц и данных, завязанная на GUID. Перевели GUID на инкременты, существенно сократился прирост файлов БД и даже на глаз увеличилась скорость выполнения долгоиграющих запросов, особенно по аналитике. Отсюда и мои личные выводы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 16:10 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
а примерный размер БД в МБ не подскажете? и кол-во строк в самой большой табличке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 16:17 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
мне не нужно точно, мне б только порядок цифр :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 16:18 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Рыжий Кота примерный размер БД в МБ не подскажете? и кол-во строк в самой большой табличке? Давно это было :) Тогда БД помнится где то весила 15 гб, в наиболее тяжелых таблицах было в среднем 1-5 миллионов записей. Ключи были сделаны не как char, а как нативный домен (то есть фактически как binary(16)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 16:50 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
И вот я думаю - а нужны ли все эти сложные проверки, перед тем как осуществить операцию изменения/добавления? Ведь таблица уже содержит все необходимые ограничения целостности - непустое и уникальное поле "NAME". Нагрузка тут ни при чем. Проверки нужны только чтобы выдать человеческое сообщение об ошибке, если оно вам нужно . Если нет - можно не делать проверок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 16:52 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
ASCRUS Рыжий Кота примерный размер БД в МБ не подскажете? и кол-во строк в самой большой табличке? Давно это было :) Тогда БД помнится где то весила 15 гб, в наиболее тяжелых таблицах было в среднем 1-5 миллионов записей. Ключи были сделаны не как char, а как нативный домен (то есть фактически как binary(16)). понятно, мне до такого объема еще лет 10 ждать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 18:17 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
ASCRUS Global Autoincrement ... сделан как раз для репликаций, то есть когда он указывается на таблицу, ему дается диапазон действия (например ставим 1000000). Давайте просчитаем. Тип integer даёт максимальное значение 2147483647. (БИГ-ИНТ не подходит, так как не все клиентские приложения могут работать с такими числами.) Если принять число филиалов до 100, то тогда под Global_database_id необходимо зарезервировать первые 3 разряда - 0 для центральной БД, 1..99 для удалённых. Остаётся 2147483647 всего 7 свободных разрядов под ИН записей. То есть 9 999 999, для просторы расчётов примем - 10 миллионов номеров на каждую таблицу, учавствующую в репликации. Пусть в филиале с БД одновременно работает 10 клиентов, каждый из которых за рабочий день вводит 250 новых записей (это если вручную, при 8 часовом рабочем дне - по целых 2 минуты на одну запись, а автоматический ввод может быть и 10 000, и 100 000). Рабочих дней в месяце примем 20, месяцев в году 12. Итого: 10 000 000 / (10*250*20*12) = 16 лет Но при попытке добавить запись с неверными значениями полей, нарушающих условие целостности, счётик AUTOINCREMENT будет накручиваться вхолостую. То есть в реальности эта таблица будет содержать не 10 миллионов записей, а немного поменьше. Исчерпание номеров ИН произойдет не через 16 лет, а раньше. Например, у меня на предприятии в таблицу показаний счётчиков ежемесячно заносится чуть меньше 10 000 значений. Получаем: 10 000 000 / (10*10 000*12) = 8 лет То есть исчерпание номеров реально может произойти через 5-6 лет. Однако, весьма неприятная ситуация. Можно, конечно уменьшить разрядность зарезервированную под Global_database_id до 2. Тогда получим: 2147483647 - 8 разрядов под ИН, то есть 100 000 000 / (10*10 000*12) = 83 года. Отлично. Но под собственные номера баз остаётся только диапазон 0..20, то есть одна центральная база и 19 удалённых филиалов. В некоторых задачах такое ограничение может оказаться критичным. Особенно, если на предприятии широко используют ноутбуки и КПК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 04:21 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Ну во первых тип unsigned integer дает уже не 2, а 4 миллиарда и думаю с инкрементом никто не расстроится, что все значения беззнаковые. Во вторых основные средства разработки клиентского ПО, поддерживают таки unsigned bigint. В третьих даже если мы примем такие расчеты, то стоит еще учитывать, что в ASA есть событие переполнения счетчика и возможность изменить на новый свободный глобальный код БД - так что подошел разрез в какой либо таблице к концу, вызывалось событие, считали максимальный номер БД по своей табличке, участвующей в репликации, поменяли свой узел на новый номер и установили его в GLOBALDATABASE_ID. Все - счетчики БД едут в новых разрезах, новые записи без проблем вставляются. Так что - абсолютно не вижу проблем с глобальными инкрементами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 07:53 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
Кстати, почему для репликации в ASA принято резервировать непрерывный диапазон ключей? По другой схеме для филиалов задаются разные начальные значения и одинаковый инкремент, равный максимальному числу филиалов, т.е. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 10:21 |
|
||
|
Проверять до или обрабатывать ошибку после?
|
|||
|---|---|---|---|
|
#18+
ASCRUSНу во первых тип unsigned integer дает уже не 2, а 4 миллиарда Во вторых основные средства разработки клиентского ПО, поддерживают таки unsigned bigint. То средство разработки, на котором я работаю сейчас, не поддерживает unsigned и тем более bigint. Только 4-х байтные целые со знаком. ASCRUSВ третьих даже если мы примем такие расчеты, то стоит еще учитывать, что в ASA есть событие переполнения счетчика и возможность изменить на новый свободный глобальный код БД Ага, вот теперь понятно. Вопрос с возможным исчерпанием номеров полностью снимается. Интересно, а смена Global_database_id на одной базе не может повлиять на другие? Наверное, эту замену надо проводить очень аккуратно, чтобы не произошло совпадения Global_database_id на разных БД. sn1251Кстати, почему для репликации в ASA принято резервировать непрерывный диапазон ключей? Наверное, так проще и удобнее. По тому, в каком диапазоне номеров находится значение ИН, сразу становится видно, в какой БД была создана эта запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 12:39 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=55&tid=2013105]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 406ms |

| 0 / 0 |
