Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Составной индекс с разнонаправленными составными частями - как сделать? / 7 сообщений из 7, страница 1 из 1
27.09.2019, 19:21
    #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
27.09.2019, 19:27
    #39868123
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составной индекс с разнонаправленными составными частями - как сделать?
shalamyansky,

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

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

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

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

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

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

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

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

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


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