powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок следования полей в индексе
5 сообщений из 5, страница 1 из 1
Порядок следования полей в индексе
    #32183272
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица
mess_log
(
mess_id primary key,
object_id,
dmessage,
mess_type
)

Требуется показывать сообщения по объекту отсортированные по времени
select * from mess_log where object_id=:obj_id order by object_id desc, dmessage desc;

И требуется для определенных видов сообщений не добавлять в базу а обновлять. То есть
select max(mess_id), count(*) from mess_log where object_id=:obj_id, mess_type=:mess_type
into m_id,cnt;
if (cnt>0) then
update ..
else insert ..

Вопрос 1
Какой индекс лучше
create descending index ix on mess_log (obj_id, dmessage, mess_type);
create descending index ix on mess_log (obj_id, mess_type, dmessage);
Будет ли при втором способе сортировка или пойдем по индексу.
Вопрос 2
При поиске как указать что бы count перебирал не все записи а останавливался на первой попавшейся.
Вопрос 3
Как использовать rdb$db_key то есть уже найдена запись и обновлять ее надо бы не по первичному ключу, а по найденому значению rdb$db_key
(примерчик бы)
...
Рейтинг: 0 / 0
Порядок следования полей в индексе
    #32183315
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой лучше индекс использовать можно узнать самому используя статистику запроса.
Есть IbExpert. Там доступна вся статистика.

Что касается второго индекса, то можно использовать только поле mess_type :

Код: plaintext
1.
2.
create descending index ix1 on mess_log (obj_id, dmessage); 
create descending index ix2 on mess_log (mess_type); 
...
Рейтинг: 0 / 0
Порядок следования полей в индексе
    #32183322
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb$db_key


Код: plaintext
1.
2.
3.
4.
select RDB$DB_KEY, ... from TAB into :db_key do;

update TAB set ... where RDB$DB_KEY = :db_key; 

...
Рейтинг: 0 / 0
Порядок следования полей в индексе
    #32184930
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какого типа должен быть db_key
Попытки сделать его INTEGER приводят к неудаче
...
Рейтинг: 0 / 0
Порядок следования полей в индексе
    #32184942
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое rdb$db_key?
A: Это "номер записи". Для таблиц он имеет длину 8 байт (для view - 8 байт умножить на количество таблиц в запросе, если запрос содержит явный или неявный join), которые представлены в виде строки, содержащей двоичные значения. Поэтому в ряде инструментов запрос

select rdb$db_key, t.* from table t

будет возвращать "мусор" в первом столбце.

rdb$db_key можно использовать в качестве уникального идентификатора записи, так же как и ее поле первичного ключа. Однако rdb$db_key по ходу работы может меняться. Физически он представляет собой номер таблицы, номер страницы и смещение на запись (причем не на конкретную версию, а вообще на пакет версий этой записи, если они есть).

По использованию rdb$db_key можно почитать следующие документы:

Удаление или поиск дубликатов записей в таблице
http://www.ibase.ru/devinfo/deldupes.htm

Update данными из других таблиц
http://www.ibase.ru/devinfo/updsame.htm

немного о db_key (eng)
http://www.ibase.ru/mail/dbkey1.txt и http://www.ibase.ru/mail/dbkey2.txt

"Practical use of rdb$db_key" на английском:
http://www.cvalde.com/document/practical_use_of_the_rdb.htm

The mistery of rdb$db_key, на английском, в 4-х частях
http://www.cvalde.com/document/mysteriousDbKey.htm
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок следования полей в индексе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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