powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбор идентификатора записи для комфортной репликации
27 сообщений из 27, показаны все 2 страниц
Выбор идентификатора записи для комфортной репликации
    #39135298
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел спросить совета, раз взялся за переделку структуры базы с нуля: какого типа поле использовать для идентификации "уникальности" записи при репликации?

Пока на ум приходят два варианта: хэш и GUID. Какие минусы и плюсы? Может есть еще?

=================
Док.

Win7 Ultim x64, Deb 7.6 i386 (Deb 8.2 i386): FB 2.5.5.26952, диалект 3, SS, Lazarus 1.5; FPC 2.7.1, UIB
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135300
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, GUID, однозначно.
Правда, буйная фантазия рождает еще один вариант источника генерации уникального ключа для гео-удаленных друг от друга серверов: gps координаты + точное время со спутника с PPS сигналом. Это уже для сильно специфических задач, где ключ служит не только уникальности, но и точному указанию источника репликации в режимах мастер-мастер.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135311
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,

Если идентификаторы в отдельной таблице хранить и если у каждого сервера есть уникальный Id, то можно ServerId + RecordId.
Например, если количество серверов меньше $FF и уникальных записей в системе меньше $FFFFFF, то уникальный Id в Int поместится.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135403
_Док_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А с практической точки зрения есть преимущества использования интегера супротив гуида?
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135406
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Док_, размер вдвое меньше. :)
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135409
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor, поправочка: long long int (__int64) вдвое и (long int) вчетверо.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135416
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Док_А с практической точки зрения есть преимущества использования интегера супротив гуида?

делали распределенку на составных ключах ID_NODE*10 000 000 000 + gen_id(table_id)

1. очень удобно видеть откуда пришло. и группировать по источникам.
2. делали репликацию по диапазонам с перекрытием (insert if exists) было дешевле закачать лишний день, чем геморроится с логами изменений.
3. оно человекочитаемо, это много раз спасало душевное здоровье на этапе запуска
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135484
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Док_А с практической точки зрения есть преимущества использования интегера супротив гуида?

последовательные integer лучше сжимаются. Размер индекса много меньше. Скорость вставки меньше деградирует. Вот если бы GUID был последовательный тогда преимуществ было бы меньше. Это кстати обсуждалось не так давно
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39135937
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСкорость вставки меньше деградирует.
Или больше, если параллельные коннекты встают в очередь за эксклюзивным локом на одну и ту
же страницу индекса.

Бросьте, у Дока не те нагрузки чтобы такие мелочи роляли. С гуидом спокойнее: конфликты по
ключам хоть и имеют (теоретически) отличную от нуля вероятность, неспособны в один
неприятный момент стать массовым явлением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136089
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На гуиде и остановлюсь. Спасибо всем за участие!
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136379
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм .. я тут в результате рукоблудия в стиле Паши некоторых экспериментов интересные вещи для себя открыл :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE DOMAIN DMN_UUID AS
CHAR(16) CHARACTER SET OCTETS
COLLATE OCTETS;

/***********************************/
CREATE TABLE TBL_TEST (
    ID             INTEGER NOT NULL,
    STR            DMN_STRING_10 /* DMN_STRING_10 = VARCHAR(10) */,
    UUID_STR       DMN_UUID NOT NULL /* DMN_UUID = CHAR(16) */,
    HASH_UUID_STR  BIGINT NOT NULL
);
/***********************************/

CREATE OR ALTER TRIGGER TBL_TEST_BI1 FOR TBL_TEST
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
AS
begin
  IF (NEW.UUID_STR IS NULL) THEN
    NEW.UUID_STR = GEN_UUID();

  IF (NEW.HASH_UUID_STR IS NULL) THEN
    NEW.HASH_UUID_STR = HASH(UUID_TO_CHAR(GEN_UUID()));
end


Дак что там насчет размера индекса говорилось?
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто для информации: HASH() возвращает INTEGER, а не BIGINT.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136416
Dimitry SibiryakovЧисто для информации: HASH() возвращает INTEGER, а не BIGINT.
И давно ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
echo set sqlda_display on; select hash(uuid_to_char(gen_uuid())), cast(98765432101234567 as bigint) as bigint_sample, cast(654321 as int) as int_sample from rdb$database; | isql /3333:e30

INPUT message field count: 0

OUTPUT message field count: 3
01: sqltype:  580 INT64  scale: 0 subtype: 0 len: 8
  :  name: HASH  alias: HASH
  : table:   owner:
02: sqltype:  580 INT64  scale: 0 subtype: 0 len: 8
  :  name: CAST  alias: BIGINT_SAMPLE
  : table:   owner:
03: sqltype: 496 LONG scale: 0 subtype: 0 len: 4
  :  name: CAST  alias: INT_SAMPLE
  : table:   owner:

                 HASH         BIGINT_SAMPLE   INT_SAMPLE
===================== ===================== ============
   888952713027358642     98765432101234567       654321
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136420
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

из последней доки FB 2.5HASH ()
Функция возвращает хэш-значение входной строки. Эта функция
полностью поддерживает текстовые BLOB любой длины и с любым набором
символов. Тип возвращаемого значения BIGINT .
Доступна для DSQL, PSQL.
Синтаксис:
HASH(< строка >)

Кстати, создал по индексу на каждое из сравниваемых полей. В селекте индекс на UUID не подхватывается...
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136436
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня СусанинИ давно ?
Упс...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136445
Докиндекс на UUID не подхватывается...Не надо "ля-ля"! :-)
Код: 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.
create domain dmn_uuid as
char(16) character set octets
collate octets;
commit;

create table tbl_test (
    id             integer not null,
    str            varchar(10),
    uuid_str       dmn_uuid not null /* dmn_uuid = char(16) */,
    hash_uuid_str  bigint not null
);

set term ^;
create or alter trigger tbl_test_bi1 for tbl_test
active before insert or update position 1
as
begin
  if (new.uuid_str is null) then
    new.uuid_str = gen_uuid();

  if (new.hash_uuid_str is null) then
    new.hash_uuid_str = hash(uuid_to_char(gen_uuid()));
end
^
set term ;^
commit;

insert into tbl_test(id) select 1 from rdb$types;
commit;

create index tbl_test_uuid_str on tbl_test(uuid_str);
commit;

set planonly;
select * from tbl_test  where uuid_str = ?; 
set planonly;

show version;

Output:

Код: plaintext
1.
2.
3.
4.
5.
6.
 PLAN (TBL_TEST INDEX (TBL_TEST_UUID_STR)) 
ISQL Version: WI-V2.5.5.26952 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.5.26952 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.5.26952 Firebird 2.5/tcp (csprog)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.5.26952 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 11.2
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136467
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня Сусанин,

Паш, ты прав. mea culpa

я кастовал поле к строке функцией UUID_TO_CHAR
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136698
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокДак что там насчет размера индекса говорилось?

Нельзя впихнуть невпихуемое. Хэш не уникален.

UUID - 128 bit, bigint - 64.

Вылезет один единственный раз в жизни.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136796
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

предвосхитил мой вопрос по поводу коллизий :)

Извиняюсь за ламерство, но как в запросе найти запись по гуиду? Если кастовать к чару, то не подхватывается индекс. Даже в параметриз(ир)ованном запросе ИБЕ ругается
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136881
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, либо ты где-то перемудрил, либо я чего-то не понимаю.

Код: 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.
25.
26.
27.
28.
29.
30.
31.
CREATE DOMAIN UUID AS CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS;
COMMIT WORK;

CREATE TABLE UUID_TEST
(
    UU_ID UUID NOT NULL,
    STR   VARCHAR(10) NOT NULL,
  CONSTRAINT UUID_TEST__PK PRIMARY KEY (UU_ID)
);
COMMIT WORK;


SET TERM ^;
CREATE OR ALTER TRIGGER UUID_TEST__TR_BI
  FOR UUID_TEST
  ACTIVE
  BEFORE INSERT OR UPDATE
  POSITION 0
AS
BEGIN
  IF (NEW.UU_ID IS NULL) THEN NEW.UU_ID = GEN_UUID();
END^
SET TERM ;^
COMMIT WORK;


INSERT INTO UUID_TEST (STR) VALUES ('One');
INSERT INTO UUID_TEST (STR) VALUES ('Two');
INSERT INTO UUID_TEST (STR) VALUES ('Three');
INSERT INTO UUID_TEST (STR) VALUES ('Four');
COMMIT WORK;


Результат:

Код: plain
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.
Query
------------------------------------------------
SELECT UUID_TO_CHAR(UU_ID), STR
  FROM UUID_TEST
  WHERE UU_ID = CHAR_TO_UUID('E7735FA5-33DA-47B3-BAD6-3CEF829C0748');

Plan
------------------------------------------------
PLAN (UUID_TEST INDEX (UUID_TEST__PK))

Query Time
------------------------------------------------
Prepare       : 31.00 ms
Execute       : 0.00 ms
Avg fetch time: 0.00 ms

Memory
------------------------------------------------
Current: 12 138 360
Max    : 13 923 248
Buffers: 2 048

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 11
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|UUID_TEST                      |         0 |         1 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136887
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докpastor,

предвосхитил мой вопрос по поводу коллизий :)

Извиняюсь за ламерство, но как в запросе найти запись по гуиду? Если кастовать к чару, то не подхватывается индекс. Даже в параметриз(ир)ованном запросе ИБЕ ругается
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.


поэтому я, как заевшая пластинка, продолжаю советовать bigint с диапазонами

UUID мы используем для связи с потусторонними источниками.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39136899
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Pastor!
You wrote on 24 декабря 2015 г. 11:39:29:

Pastor> продолжаю советовать bigint с диапазонами+500!

зы: у нас больше 30 серверов участвуют в репликации.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39137024
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastorпоэтому я, как заевшая пластинка, продолжаю советовать bigint с диапазонами
Подозреваю, что это для промышленной БД с бесплатно прилагающимся к ней админом. У меня же предполагаемый объем 10-30 тыс записей в год, причем у большинства юзверей база может "гулять" с флешки на десктоп и обратно.

DBConstructor ,
У тебя исходные условия не те. Попробуй сделать ПК обычным автоинкрементом и ищи запись по гуиду в кляузе WHERE. У меня все время план идет натуралом.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39137033
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокУ меня все время план идет натуралом.
Потому что надо использовать параметры, а не литералы. Или, если уж использовать литералы,
так шестнадцатиричные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39137039
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

уппс

Да, Дим, увидел разницу. DBConstructor кастует параметр, а я - поле.
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39137057
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док DBConstructor ,
У тебя исходные условия не те. Попробуй сделать ПК обычным автоинкрементом и ищи запись по гуиду в кляузе WHERE. У меня все время план идет натуралом.
Ну я хз...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE UUID_TEST
(
    REC_ID  INTEGER NOT NULL,
    UU_ID   UUID NOT NULL,
    STR     VARCHAR(10) NOT NULL,
  CONSTRAINT UUID_TEST__PK PRIMARY KEY (REC_ID),
  CONSTRAINT UUID_TEST__UQ UNIQUE (UU_ID)
);
COMMIT WORK;

INSERT INTO UUID_TEST (REC_ID, STR) VALUES (1, 'One');
INSERT INTO UUID_TEST (REC_ID, STR) VALUES (2, 'Two');
INSERT INTO UUID_TEST (REC_ID, STR) VALUES (3, 'Three');
INSERT INTO UUID_TEST (REC_ID, STR) VALUES (4, 'Four');
COMMIT WORK;

/* Остальное без изменений */


У меня работает.
Код: text
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.
Query
------------------------------------------------
SELECT UUID_TO_CHAR(UU_ID), STR
  FROM UUID_TEST
  WHERE UU_ID = CHAR_TO_UUID('7D6A783D-AB42-40BB-BE5D-BD5814061D72');

Plan
------------------------------------------------
PLAN (UUID_TEST INDEX (UUID_TEST__UQ))

Query Time
------------------------------------------------
Prepare       : 0.00 ms
Execute       : 0.00 ms
Avg fetch time: 0.00 ms

Memory
------------------------------------------------
Current: 12 154 792
Max    : 14 014 560
Buffers: 2 048

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 11
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|UUID_TEST                      |         0 |         1 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
...
Рейтинг: 0 / 0
Выбор идентификатора записи для комфортной репликации
    #39137082
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокДа, Дим, увидел разницу. DBConstructor кастует параметр, а я - поле.
Ну дык в твоем случае сервер ничего не знает об индексе UUID_TO_CHAR(UUID_STR) и, соответственно,
Код: plsql
1.
WHERE UUID_TO_CHAR(UUID_STR) = CAST(:UUID AS CHAR(36) CHARACTER SET ASCII)  /* NATURAL */


Ничего, со всеми бывает...
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбор идентификатора записи для комфортной репликации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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