Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбор идентификатора записи для комфортной репликации / 25 сообщений из 27, страница 1 из 2
23.12.2015, 01:32
    #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
23.12.2015, 01:55
    #39135300
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Док, GUID, однозначно.
Правда, буйная фантазия рождает еще один вариант источника генерации уникального ключа для гео-удаленных друг от друга серверов: gps координаты + точное время со спутника с PPS сигналом. Это уже для сильно специфических задач, где ключ служит не только уникальности, но и точному указанию источника репликации в режимах мастер-мастер.
...
Рейтинг: 0 / 0
23.12.2015, 04:01
    #39135311
fb user
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Док,

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

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

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

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

Бросьте, у Дока не те нагрузки чтобы такие мелочи роляли. С гуидом спокойнее: конфликты по
ключам хоть и имеют (теоретически) отличную от нуля вероятность, неспособны в один
неприятный момент стать массовым явлением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.12.2015, 14:52
    #39136089
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
На гуиде и остановлюсь. Спасибо всем за участие!
...
Рейтинг: 0 / 0
23.12.2015, 18:00
    #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
23.12.2015, 18:07
    #39136387
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Чисто для информации: HASH() возвращает INTEGER, а не BIGINT.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.12.2015, 18:36
    #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
23.12.2015, 18:38
    #39136420
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Dimitry Sibiryakov,

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

Кстати, создал по индексу на каждое из сравниваемых полей. В селекте индекс на UUID не подхватывается...
...
Рейтинг: 0 / 0
23.12.2015, 18:48
    #39136436
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Ваня СусанинИ давно ?
Упс...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.12.2015, 18:52
    #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
23.12.2015, 19:06
    #39136467
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Ваня Сусанин,

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

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

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

UUID - 128 bit, bigint - 64.

Вылезет один единственный раз в жизни.
...
Рейтинг: 0 / 0
24.12.2015, 10:27
    #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
24.12.2015, 11:32
    #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
24.12.2015, 11:36
    #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
24.12.2015, 11:40
    #39136899
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор идентификатора записи для комфортной репликации
Hello, Pastor!
You wrote on 24 декабря 2015 г. 11:39:29:

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

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

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

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

уппс

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


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