powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Составной индекс с разнонаправленными составными частями - как сделать?
7 сообщений из 7, страница 1 из 1
Составной индекс с разнонаправленными составными частями - как сделать?
    #39868119
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE T (
    ID  INTEGER NOT NULL,
    DT  DATE NOT NULL
);

ALTER TABLE T ADD CONSTRAINT "pk_T" PRIMARY KEY (ID, DT);



Запросы будут в основном такого вида:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
    ID,
    DT
  from
    T
  where
    ( ID = :ID )
  order by
    DT desc

PLAN SORT (T INDEX (pk_T))



Если сравнить с планом запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
    ID,
    DT
  from
    T
  where
    ( ID = :ID )
  order by
    DT

PLAN (T ORDER pk_T)



видно, и понятно почему, что отличие состоит в дополнительном SORT. Этой дополнительной безиндексной сортировки можно было бы избежать, если бы можно было постоить индекс (или первичный ключ) вида

Код: sql
1.
ALTER TABLE T ADD CONSTRAINT "pk_T" PRIMARY KEY (ID, DT desc);



Но как это сделать? Синтаксис SQL Firebird 3.0 такого не позволяет.

Сразу пара оговорок:

1. Да, я понимаю, что можно сделать PRIMARY KEY (ID, DT) desc, и в данном случае на данном запросе это поможет. Но в реальности у таблицы есть и другие поля, которые надо добавить в индекс, и есть другие запросы, которым нужен именно прямой порядок сортировки по ID. Ну, например

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
    ID,
    DT
  from
    T
  order by
    ID,
    DT desc

PLAN SORT (T NATURAL)



2. Да, я читал про сравнение SORT и ORDER, знаю, что SORT может оказаться и эффективнее, но в данном случае SORT выглядит просто лишней.

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

за такие первичные ключи надо руки отрывать. Составной ПК — зло.

shalamyanskyСоставной индекс с разнонаправленными составными частями - как сделать?

нет. Ищи другие решения
...
Рейтинг: 0 / 0
Составной индекс с разнонаправленными составными частями - как сделать?
    #39868139
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем именно зло, можно подробнее? Пожалуйста.

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

тем что он не удобен, вызывает геморрой на ровном месте. ПК должен быть искусственным и не привязан к полям, которые потенциально могут быть изменены. Есть конечно исключения, но редкие.
Хочешь дополнительные ограничения, ну так есть ограничение уникальности, или уникальные индексы.
...
Рейтинг: 0 / 0
Составной индекс с разнонаправленными составными частями - как сделать?
    #39868148
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Геморрой у кого, у прикладного программиста c SQL, или у разработчика сервера? Для себя лично не вижу геморроя.

Я не понимаю, если у меня есть естественная уникальная связка ID+DT, зачем мне вводить искуственное поле artID=gen_id() только для того, чтобы строить на нем первичный ключ? И надо еще добавлять генератор, триггер etc. И будет и первичный ключ, и отдельный индекс по ID+DT, зачем? Если речь об удобстве, то это неудобно.

Если речь об эффективности, то это другое дело, тут я совсем не понимаю. Вот и спрашиваю.
...
Рейтинг: 0 / 0
Составной индекс с разнонаправленными составными частями - как сделать?
    #39868149
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и делать update по данным полям, ни по отдельности, ни в связке, мне не нужно. Это именно что первичный идентификатор, раз введенный, далее неизменен. Возможно, в этом было бы зло.
...
Рейтинг: 0 / 0
Составной индекс с разнонаправленными составными частями - как сделать?
    #39868247
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

id если уникальный вообще, так DT к нему совсем не надо.
А значит, должен быть ПК по id, и еще можно построить desc индекс по DT.
И будет счастье для where id = :... order by DT desc.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Составной индекс с разнонаправленными составными частями - как сделать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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