|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Как правильно организовать приложение, чтобы оно позволяло осуществлять сквозную нумерацию документов при условии, что документы возникают в разных местах. т.е. пользователи могут одновременно создавать карточки с разных клиентских мест, но нумерация должна быть сквозной и правильной. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:13 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Очень многим решения этого вопроса не избежать, тоже иногда размышляю на эту тему. Мне кажется, что решение лежит больше в организационной плоскости, пока ничего лучше, чем уже есть не придумал, я имею ввиду регистрацию пользователей в системах типа ICQ, т.е. этот УИН и должен быть префиксом (не обязательно видимым) ко всем документам, и не только документам. Эта схема позволяет не различать, со своего компьютера вошел пользователь или с чужого, главное, он должен правильно залогиниться. УИН-ы должны иметь сквозную уникальность, выдаваться конкретному пользователи и при удалении, больше никому не назначаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:25 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
kanalexКак правильно организовать приложение, чтобы оно позволяло осуществлять сквозную нумерацию документов при условии, что документы возникают в разных местах. т.е. пользователи могут одновременно создавать карточки с разных клиентских мест, но нумерация должна быть сквозной и правильной. Здесь, я думаю, поможет схема разрешения коллизий, реализованная, например, в схеме закрытого хеширования. Я думаю, что должно быть так: Хранить в таблице последний "занятый" номер. Когда пользователь обратится за номером: - заблокировать доступ к данной записи / таблице; - расчитать следующий номер; - записать его в таблицу; - разблокировать запись / таблицу; - вернуть номер тому пользователю, который его запрашивал... Блокировка нужна для того, чтобы исключить коллизию, когда один и тот же номер будет присвоен двум разным документам... Без блокирования таблицы можно это оформить следующим образом: - сохранить значение "занятого" номера в локальной переменной; - расчитать новый номер; - при записи в таблицу вычисленного "занятого" номера проверить текущее значение "занятого" номера в таблице; - если оно изменилось, то повторить расчет номера и попытку его сохранения; - если оно не изменилось - записать новое значение и возвратить номер пользователю... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:35 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Programmer_OrtodoxОчень многим решения этого вопроса не избежать, тоже иногда размышляю на эту тему. Мне кажется, что решение лежит больше в организационной плоскости, пока ничего лучше, чем уже есть не придумал, я имею ввиду регистрацию пользователей в системах типа ICQ, т.е. этот УИН и должен быть префиксом (не обязательно видимым) ко всем документам, и не только документам. Эта схема позволяет не различать, со своего компьютера вошел пользователь или с чужого, главное, он должен правильно залогиниться. УИН-ы должны иметь сквозную уникальность, выдаваться конкретному пользователи и при удалении, больше никому не назначаться. Это Вы немного о другом. Так мы получим уникальные идентификаторы, а нужно получить сквозную нумерацию определенного вида документов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:41 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:55 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
kanalexКак правильно организовать приложение, чтобы оно позволяло осуществлять сквозную нумерацию документов при условии, что документы возникают в разных местах. т.е. пользователи могут одновременно создавать карточки с разных клиентских мест, но нумерация должна быть сквозной и правильной. регистрировать документы под сквозными номерами централизовано документы могут возникать в разных местах, регистрироваться должны в одном месте и получать порядковый номер централизовано... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 09:56 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
kanalexКак правильно организовать приложение, чтобы оно позволяло осуществлять сквозную нумерацию документов при условии, что документы возникают в разных местах. т.е. пользователи могут одновременно создавать карточки с разных клиентских мест, но нумерация должна быть сквозной и правильной. В разных местах создаются документы, но порядковая нумерация у всех единая и растет в соответствии с датами создания документов? 1. Подумать, зачем это нужно, и организационно избежать подобного документооборота. 2. Регистрировать под временными номерами, потом на центральном узле перенумеровывать их и отправлять скорректированный документ обратно. Двунаправленная синхронизация - веселая жизнь вам обеспечена. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 16:34 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
2 templar Так может только клиенты далеко, а база одна и под ORACLE. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2005, 17:08 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
ModelR2 templar Так может только клиенты далеко, а база одна и под ORACLE. Тогда и проблемы нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2005, 13:40 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Сахават Юсифов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Так делать не советую. Будут дублированные номера. Если в прогаммах Сахавата принята такая идеология, то достоверность данных в многопользовательской среде они не обеспечат ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 12:31 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Что плохо и как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 12:38 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
kanalexКак правильно организовать приложение, чтобы оно позволяло осуществлять сквозную нумерацию документов при условии, что документы возникают в разных местах. т.е. пользователи могут одновременно создавать карточки с разных клиентских мест, но нумерация должна быть сквозной и правильной. Здесь очень важно договориться о терминологии. Сквозная нумерация - очень расплывчатый термин Есть подходящие понятия: - Непрерывная нумерация. Все номера использованы. Дыр в номерах нет. Но возможны аномалии в хронологии. - Монотонно возрастающая нумерация. Если документ2 хрнологически создан позже документа1, то номер документа2 больше, чем номер документа1. Но возможны дыры Сделать одновременно и монотонно возрастающую и непрерывную нумерацию можно. Но придется слишком много ограничений на пользователя накладывать. Например, нельзя отменить создание документа, после того, как пользователь нажал кнопку Создать, заполнение документа обязательно должно быть доведено до конца, до записи. Или, например, номер генерируется не при создании, а при записи (это значит, что до момента записи документа у него нет номера) Непрерывная же нумерация потребует хранения неиспользованных номеров. Например, пользователь начал создавать документ, номер сгенерировался. Пользователь передумал, нажал ESC, номер освободился и перешел в таблицу неиспользованных номеров. Естественно, при создании документа сначала рассматривается таблица неиспользованных номеров. Если там что-нибудь есть - номер берется оттуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 12:43 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy Непрерывная же нумерация потребует хранения неиспользованных номеров. Например, пользователь начал создавать документ, номер сгенерировался. Пользователь передумал, нажал ESC, номер освободился и перешел в таблицу неиспользованных номеров. Естественно, при создании документа сначала рассматривается таблица неиспользованных номеров. Если там что-нибудь есть - номер берется оттуда. Так я делал в ДОСе для генерации позиционных кодов.(материалы и т.д.) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 12:50 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Сахават ЮсифовТак я делал в ДОСе для генерации позиционных кодов.(материалы и т.д.) Ура! Сахават, вы молодец (если вы это сказали только для похвальбы) А по делу есть что сказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 12:52 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
2 автор А предметно, где это нужно? Как правило, нужна всего лишь монотонная нумерация. Не забывайте, пользователь всегда имеет право удалить запись и получится дырка, как бы Вы не старались. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:01 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
michael_Как правило, нужна всего лишь монотонная нумерация. Мало того, рискну утверждать, что как правило достаточно генерировать уникальные номера. Последовательность не обязательно должна быть монотонной. Причем часто требование можно сделать еще менее сильным: как правило достаточно повторяющихся с очень малой вероятностью номеров (пример таких номеров - GUID) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:08 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
генерации позиционных кодов Это и есть дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:13 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Сергей! Как Аксапта генерирует коды при создании спецификации для полной модификации на на основании базовой спецификации? (например: изделие отличается только линейными размерами) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:23 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Сахават, вообще говоря, здесь спрашивали про другое. Может лучше новую тему открыть. Кратко: как укажет консультант в нумераторе. Либо ручная нумерация, либо монотонная, либо непрерывная. Но номер не зависит от характеристик. Может все таки новую тему? Вернемся к нумераторам? итак позиционная нумерация. Расскажите, подробнее, пожалуйста. Думаю, будет интересно. Кроме того, расскажите - парсите ли вы номер или он используется как атомарное значение, а значения позиций хранятся в отдельных полях таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:28 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Давайте вот с чем определимся: есть номер (например номер документа) и есть PK так вот номер не обязательно должен быть уникален в сквозном варианте. Он может быть например уникален в пределах года или месяца, причем это может зависеть от текущего законодательства. И не нужно номер использовать для идентификации записи как PK. Для PK есть GUID или identity. Другой дело, что нумерация без дыр хоть и в пределах года все так и вещь необходимая. Тут выделяют пул свободных номеров. При создании документа номер из пула блокируется, при сохранении - удаляется из пула. Для ситуаций обрыва связи и прочих внештатных работает JOB, который освобождает блокировки номеров из пула, например, по тайм ауту и возвращает номер в пул. Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:30 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Роман Дынник так вот номер не обязательно должен быть уникален в сквозном варианте. Он может быть например уникален в пределах года или месяца, причем это может зависеть от текущего законодательства. :) Уникален. Просто у вас номер - составной. Состоит из нескольких полей. Роман Дынник И не нужно номер использовать для идентификации записи как PK. Для PK есть GUID или identity. Ой. Это вопрос не нумерации. Это вопрос искусственных и естественных ключей. Тут столько битв на эту тему было. http://www.sql.ru/forum/actualthread.aspx?tid=104535 Может не надо, а? Нет, Роман, вы не решили проблему. Вы просто замели ее под коврик. GUID или identity - это и есть номера. Просто вы решили использовать стандартные средства для генерации номеров. Но решения у вас нет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:36 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Ой, поторопился. Про генерацию номеров... Роман Дынник Тут выделяют пул свободных номеров. При создании документа номер из пула блокируется, при сохранении - удаляется из пула. Для ситуаций обрыва связи и прочих внештатных работает JOB, который освобождает блокировки номеров из пула, например, по тайм ауту и возвращает номер в пул. Или так. Это одна из реализаций для хранения неиспользованных номеров. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:40 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Роман Дынник Другой дело, что нумерация без дыр хоть и в пределах года все так и вещь необходимая. На практике где помешает дырка? В платежках - нет, в счетах-фактурах тоже никто ничего не запрещал, номера могут быть в России и составными. В справочнике товаров - вообще бред. Вопрос не КАК НАДО, а ГДЕ НАДО? Ну добъетесь Вы ввода без дырок, а пользователь удалит запись из середины списка и что дальше? Достаточно уникального номера, в некоторых случаях монотонно возростающего. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:43 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
michael_Ну добъетесь Вы ввода без дырок, а пользователь удалит запись из середины списка и что дальше? Если речь идет о непрерывных, то номер удаленной записи: 1. попадает в список неиспользуемых номеров и 2. выдается следующей новой записи michael_Достаточно уникального номера, в некоторых случаях монотонно возростающего. А вот с этим согласен. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:46 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
:) Уникален. Просто у вас номер - составной. Состоит из нескольких полей. В терминах БД не уникален, уникальным был бы альтернативный уникальный ключ по двум полям: номер, год Ой. Это вопрос не нумерации. Это вопрос искусственных и естественных ключей. Тут столько битв на эту тему было. Может не надо, а? Не надо, все для себя уже давно все решили. Лично я выбрал guid и не мучаюсь. А вот в этом топике мы видимо не определились номер - он только для нумерации или еще как PK? Нет, Роман, вы не решили проблему. Вы просто замели ее под коврик. GUID или identity - это и есть номера. Просто вы решили использовать стандартные средства для генерации номеров. Но решения у вас нет :) Решение у меня давно есть и хорошо работает. GUID и identity - это не номера, это уникальные PK-ключи и смысла делать для них нумерацию без дыр никакого нет. А Номер есть номер, это атрибут документа. Хотите для его создания используйте стандартные средства, хотите - свои. Но не надо смешивать номер с PK. Если продолжить обсуждение на этом поприще то все выльется в тоже "естественные против искуственных". Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:51 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy michael_Ну добъетесь Вы ввода без дырок, а пользователь удалит запись из середины списка и что дальше? Если речь идет о непрерывных, то номер удаленной записи: 1. попадает в список неиспользуемых номеров и 2. выдается следующей новой записи Это-то понятно. Только при условии, что следующая запись будет вообще добавлена ;))). А если год уже закрыт, что так и будем с дыркой в старом году сидеть? Ужас!!! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:54 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Роман Дынник GUID и identity - это не номера, это уникальные PK-ключи и смысла делать для них нумерацию без дыр никакого нет. Согласен. Позволю себе только напомнить, что GUID - не уникальный. А повторяющийся с очень малой вероятностью код :) Роман Дынник А Номер есть номер, это атрибут документа. Хотите для его создания используйте стандартные средства, хотите - свои. Но не надо смешивать номер с PK. про первичный ключ вы первым начали. у автора вопроса про ключи ничего не было. был вопрос вне СУБД. на общую логику. Роман Дынник Если продолжить обсуждение на этом поприще то все выльется в тоже "естественные против искуственных". Да уж... Не хотелось бы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:55 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
michael_А если год уже закрыт, что так и будем с дыркой в старом году сидеть? Ужас!!! :) А с какой стати это вы запись удалили, если год закрыт? Если же удалили как раз до закрытия - так и будем. А что делать? А кому легко? Но это маловероятная ситуация. Внештатная. И решать ее надо внештатно. ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:57 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Вопрос не КАК НАДО, а ГДЕ НАДО? Например: выделяются интервалы для кодировки изделий, телефонных номеров, IP адресов ... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 13:59 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy Непрерывная же нумерация потребует хранения неиспользованных номеров. Например, пользователь начал создавать документ, номер сгенерировался. Пользователь передумал, нажал ESC, номер освободился и перешел в таблицу неиспользованных номеров. Естественно, при создании документа сначала рассматривается таблица неиспользованных номеров. Если там что-нибудь есть - номер берется оттуда. Можно и не хранить, если позволяют ресурсы сервера и условия задачи. Я однажды так сделал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:04 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Александр ГoлдунМожно и не хранить, если позволяют ресурсы сервера и условия задачи. Я однажды так сделал: Ух, ты! Забавно. Надо подумать... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:07 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
Чтобы бы предложил улучшить - сделать проверку на "меньше или равно". Своеобразная защита от дурака и дурацких входящих параметров... 0 например, или отрицательное число... Но очень забавно... Но работает только на целых... Строковым номер не может быть... Или может? Надо подумать... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:11 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzyЧтобы бы предложил улучшить... Не, нафиг улучшения. Алгоритм правильный и в улучшениях не нуждается. Спасибо, Александр, на редкость красивый алгоритм. Испытал истинное наслаждение. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:36 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Эх, снова поторопился... Улучшить таки можно. Александр, а как вы узнаете значения StartID и step для первого вызова? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:39 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Э-эх... А похоже алгоритм то совсем неправильный. Так, например, если в диапазоне 1..100 будет свободен номер 98, то алгоритм его не найдет. Но идея красивая... Только, после хорошего раздумья... вряд ли стоит так делать. select count(*) - достаточно тяжелая штука. даже select count(id) и то не самая легкая операция... Но огромное спасибо за идею. Даже в голове не умещалось, что к СУБД можно применять матаппарат. Эту идею стоит подумать еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:48 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy пишет: > Эх, снова поторопился... > Улучшить таки можно. Улучшить можно все, что угодно. Ну, может кроме элементарных частиц :) > Александр, а как вы узнаете значения StartID и step для первого вызова? Задаются в программе константно. StartID либо 1, либо номер начала диапазона (например если в репликации удаленные базы имеют разные диапазоны ID). Step подбирается эмпирическим путем таким образом, чтобы уменьшить число шагов. Если нет супер больших последовательностей дырок, то разумно поставить первый шаг равный примерно половине искомого диапазона. Можно поэкспериментировать. Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 14:57 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy пишет: > Э-эх... А похоже алгоритм то совсем неправильный. > Так, например, если в диапазоне 1..100 будет свободен номер 98, то > алгоритм его не найдет. Но идея красивая... Это почему еще? Только что проверил - прекрасно находит при любых параметрах 1<=StartID<=98 и Step>0 > Только, после хорошего раздумья... вряд ли стоит так делать. > select count(*) - достаточно тяжелая штука. > даже select count(id) и то не самая легкая операция... А чем отличается select count(*) от select count(id), если id NOT NULL? По логике, да и по сути это одно и то же. По крайней мере в Sybase ASA время выполнения не отличается. А на таблице с 70 тысячами записей выполняется за доли секунды при параметрах (1,100000). По моему более чем приемлемая скорость, особенно для такой вещи, как генерация ID для создаваемой человеком записи. Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:12 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Александр Гoлдун Это почему еще? Только что проверил - прекрасно находит при любых параметрах 1<StartID<=98 и Step>0 Подумаю еще. Но смущает то, что алгоритм ищет только в первой половине FindFreeID(StartId,step/2) А на вторую половину вызова нет FindFreeID(StartId + step/2, step/2) Но я еще подумаю. Хорошо бы, если бы я ошибался. Александр Гoлдун > Только, после хорошего раздумья... вряд ли стоит так делать. > select count(*) - достаточно тяжелая штука. > даже select count(id) и то не самая легкая операция... А чем отличается select count(*) от select count(id), если id NOT NULL? А об этом было сказано? :) Александр Гoлдун По логике, да и по сути это одно и то же. По крайней мере в Sybase ASA время выполнения не отличается. А на таблице с 70 тысячами записей выполняется за доли секунды при параметрах (1,100000). По моему более чем приемлемая скорость, особенно для такой вещи, как генерация ID для создаваемой человеком записи. Дело скорее не в скорости, а в объеме прочитанных данных. count должен прочитать все страницы таблицы. Либо держать таблицу в кэше, чтобы работать быстро. Что в общем то совершенно некузяво для общего случая. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:22 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
>> Александр, а как вы узнаете значения StartID и step для первого вызова? > > Задаются в программе константно. StartID либо 1, либо номер начала > диапазона (например если в репликации удаленные базы имеют разные > диапазоны ID). Step подбирается эмпирическим путем таким образом, чтобы > уменьшить число шагов. Если нет супер больших последовательностей дырок, > то разумно поставить первый шаг равный примерно половине искомого > диапазона. Можно поэкспериментировать. А если точнее, то взять максимально возможный, при котором оптимизатор все еще сочтет выгодным использовать индекс вместо сканирования. Т.е. селективность при первом вызове должна быть в районе 20% (зависит от сервера и еще некоторых условий) Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:22 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Неправильно. Страницы индекса, конечно... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:22 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzyА на вторую половину вызова нет FindFreeID(StartId + step/2, step/2) И снова я неправ. Что такое FindFreeProdId? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:25 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy пишет: > А на вторую половину вызова нет FindFreeID(StartId + step/2, step/2) > > > И снова я неправ. > Что такое FindFreeProdId? Забыл переименовать. FindFreeId, естественно. А на вторую половину для вызова НЕЛЬЗЯ уполовинивать диапазон, иначе оно может не доползти до дырки, если ее не нашлось в первой половине. Posted via ActualForum NNTP Server 1.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:34 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Александр Гoлдун mazzy пишет: > А на вторую половину вызова нет FindFreeID(StartId + step/2, step/2) > > > И снова я неправ. > Что такое FindFreeProdId? Забыл переименовать. FindFreeId, естественно. А на вторую половину для вызова НЕЛЬЗЯ уполовинивать диапазон, иначе оно может не доползти до дырки, если ее не нашлось в первой половине. Posted via ActualForum NNTP Server 1.2 а... тогда это не деление пополам :) т.е. step не должен в первый раз гарантировано покрывать весь диапазон? так например, для диапазона 1..100 с дыркой в 98 в первый раз надо вызывать, например, так FindFreeId(1,10)? угу... чтобы был выбран индекс, а не сканирование... угу... надо подумать... но count - почему-то по-прежнему не нравится... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 15:39 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
mazzy а... тогда это не деление пополам :) т.е. step не должен в первый раз гарантировано покрывать весь диапазон? Если в диапазоне есть дырки, то ищутся именно делением пополам. Если нет - то берется следующий диапазон. Соответственно step не обязан все покрывать. mazzy так например, для диапазона 1..100 с дыркой в 98 в первый раз надо вызывать, например, так FindFreeId(1,10)? угу... чтобы был выбран индекс, а не сканирование... Можно и так, но именно при таких количествах индекс не актуален и нормальный оптимизатор может вполне отвергнуть его в пользу скана. Тогда выгоднее взять шаг побольше - будет меньше глубина рекурсии. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 19:17 |
|
Сквозная нумерация в многопользовательском режиме.
|
|||
---|---|---|---|
#18+
Александр ГoлдунМожно и так, но именно при таких количествах индекс не актуален и нормальный оптимизатор может вполне отвергнуть его в пользу скана. Тогда выгоднее взять шаг побольше - будет меньше глубина рекурсии. Да, понял. Диапазон выбран сугубо для примера, чтобы цифирек много не писать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2005, 21:23 |
|
|
start [/forum/topic.php?all=1&fid=33&tid=1549607]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 257ms |
0 / 0 |