powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производительность и количество FK в таблице
43 сообщений из 43, показаны все 2 страниц
Производительность и количество FK в таблице
    #40132904
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, надо было спросить в "Проектировании БД", но здесь больше шансов на ответ компетентных людей :)

Есть несколько таблиц-справочников
Код: sql
1.
2.
3.
TBL_PEOPLE (пациенты и работники ЛПУ)
TBL_REASON_VISIT (причина визита в ЛПУ)
TBL_JOB_POSITION (должности работников) ---> является detail для --->TBL_JOB_TITLE (список специальностей персонала) 


и др.

и одна общая (аггрегирующая сведения) с данными визитов пациентов в определенные ЛПУ к определенным врачам по определенным причинам и т.д.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE TBL_VISITMAIN (
    ID                    INTEGER NOT NULL,
    FK_PEOPLE             INTEGER NOT NULL,
    FK_OFFICE_CLINIC      INTEGER NOT NULL,
    FK_JOB_POSITION       INTEGER NOT NULL,
    FK_REASON_VISIT       INTEGER NOT NULL,
    DATEVISIT             DMN_DATETIME NOT NULL,
    <skiped>
);



Планирую добавить в нее еще пару десятков внешних ключей на подобные таблицы. Чтобы получить минимально полезные сведения приходится городить такую конструкцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  VM.DATEVISIT,
  JT.NAME ||' '||PM.LAST_NAME AS DOCTOR,
  'пациент '|| PV.LAST_NAME AS PATIENT
FROM TBL_PEOPLE PV
   INNER JOIN TBL_VISITMAIN VM ON (PV.ID = VM.FK_PEOPLE)
   INNER JOIN TBL_REASON_VISIT RV ON (VM.FK_REASON_VISIT = RV.ID)
   INNER JOIN TBL_JOB_POSITION JP ON (VM.FK_JOB_POSITION = JP.ID)
   INNER JOIN TBL_PEOPLE PM ON (JP.FK_PEOPLE = PM.ID)
   INNER JOIN TBL_JOB_TITLE JT ON (JP.FK_JOB_TITLE = JT.ID)
WHERE (PV.ID = :prmID)



Причем, справочники могут быть с блобами.

1. Насколько оправдан такой подход?
2. Есть ли какие-нибудь подводные камни, про которые надо знать?
3. Если мой подход неоптимален, то какую конструкцию можно использовать взамен?
=================
Док.
Win10 Ultim x64/Deb 10 amd64/Darwin Cocoa(Monterey):
FB 3.0.7.33374, Lazarus 2.3.0(trunk); FPC 3.3.1(trunk)
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132960
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

выскажу чисто своё мнение.

1. Вовсе не обязательно поля-ссылки на другие таблицы оформлять как FK. Для начала можно оформить как простое поле, например REASON_VISIT_ID. Далее, если выяснится, что по нему требуется поиск, то можно добавить индекс. FK - это сущность опциональная. Если назвать поле REASON_VISIT_ID, то глядя на его название сразу понятно, куда оно ссылается и лишних FK-индексов городить не требуется. В MySQL лет десять не было никаких FK и все прекрасно жили.

2. Вместо того, чтобы городить ненужные FK-индексы в таблице транзакций, гораздо больше пользы реализовать составные индексы, например (ПАЦИЕНТ_ID, DATEVISIT), (ВРАЧ_ID, DATEVISIT), чтобы получить максимально высокую скорость формирования отчётов.

2. Запрос к куче таблиц через INNER JOIN - это лохотрон.
Куда надёжнее строить запрос самостоятельно, начиная с таблицы с транзакциями и подключая через LEFT JOIN таблицы-справочники. Это всегда работает максимально быстро (в отличии от INNER JOIN).
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132964
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerнапример (ПАЦИЕНТ_ID, DATEVISIT), (ВРАЧ_ID, DATEVISIT), чтобы получить максимально высокую скорость формирования отчётов.
лабуда. такие индексы помогут только для отчетов по конкретному пациенту и конкретному врачу. Потому что составные индексы нормально используются только при поиске на равенство по первым сегментам.
Как только первый сегмент сравнивается НЕ на равенство, остальные сегменты идут лесом, поиск по ним невозможен, и такой индекс только затормозит работу из-за своей большей толщины, чем одиночный индекс по конкретному столбцу.
DmSerначиная с таблицы с транзакциями и подключая через LEFT JOIN таблицы-справочники. Это всегда работает максимально быстро (в отличии от INNER JOIN).
опять ерунда какая-то. При inner join оптимизатор сам хорошо выстраивает таблицы и индексы для выборки. При left join он ничего не может, объединяя таблицы по парам в жестко заданном порядке.
Кроме того, использовать left join там где нужен inner - это маразм.
Раньше таким страдали всякие ERP для "прибивания плана", независимо от содержимого таблиц. Но те, кто это писал, не думали, что в универсальной ERP распределение данных в таблицах может быть сильно разным. И если в одной конторе план получается нормальным, то в другой конторе для других данных на том же запросе с left join получается задница и тормоза.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132968
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvлабуда. такие индексы помогут только для отчетов по конкретному пациенту и конкретному врачу. Потому что составные индексы нормально используются только при поиске на равенство по первым сегментам.
Как только первый сегмент сравнивается НЕ на равенство, остальные сегменты идут лесом, поиск по ним невозможен, и такой индекс только затормозит работу из-за своей большей толщины, чем одиночный индекс по конкретному столбцу.

Вероятно, что это и требуется - найти по конкретному врачу (или группе врачей) либо по конкретному пациенту (или группе пациентов).

kdvопять ерунда какая-то. При inner join оптимизатор сам хорошо выстраивает таблицы и индексы для выборки. При left join он ничего не может, объединяя таблицы по парам в жестко заданном порядке.
Кроме того, использовать left join там где нужен inner - это маразм.

Намучался я в своё время с этими inner join. Постоянно у пользователей были проблемы с производительностью (в первую очередь из-за неактуальной статистики). В конце концов переделал все запросы на left join. Не помню ни одного случая, где бы left join (вместо inner join) не подошёл.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132996
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv

DmSerначиная с таблицы с транзакциями и подключая через LEFT JOIN таблицы-справочники. Это всегда работает максимально быстро (в отличии от INNER JOIN).

опять ерунда какая-то. При inner join оптимизатор сам хорошо выстраивает таблицы и индексы для выборки. При left join он ничего не может, объединяя таблицы по парам в жестко заданном порядке.
Кроме того, использовать left join там где нужен inner - это маразм.

Ну, во первых, именно тут именно inner - НЕ НУЖЕН. Тут как раз outer по смыслу подходит.
А во вторых, раз уж у нас такая ситуация когда мы пошли по ссылке, на которой не навешан FK, то и ссылка может привести к тыкву. И при inner у нас тогда и мастер-запись пропадет.
kdv

Раньше таким страдали всякие ERP для "прибивания плана", независимо от содержимого таблиц. Но те, кто это писал, не думали, что в универсальной ERP распределение данных в таблицах может быть сильно разным. И если в одной конторе план получается нормальным, то в другой конторе для других данных на том же запросе с left join получается задница и тормоза.

Несколько раз напоровшись на ситуацию когда сервер при росте базы пытается "сделать мне лучше" и меняет план на совсем херовый я этих inner боюсь как огня. И всегда когда к данным цепляю справочники, делаю это по outer.
Бывают конечно исключения, но они - исключения.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132997
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я всегда объявляю в базе FK, это неоднократно спасало от кривых данных или удаления записей с зависимостями.
Да, это не совсем бесплатно, но в половине случаев индекс нужен, а в остальных случаях - не так оно и мешает.
Зато самодокументированность и корректность данных.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40132998
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моей микровселенной:
У справочников всегда есть первичный ключ с именем ID.
Поля-ссылки начинаются с ID_ и далее идет имя таблицы или некоторые другие исторически сложившиеся называния.

Код: plsql
1.
2.
3.
ID
ID_POST
ID_SKLAD
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133020
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Возможно, надо было спросить в "Проектировании БД", но здесь больше шансов на ответ компетентных людей :)

Планирую добавить в нее еще пару десятков внешних ключей на подобные таблицы. Чтобы получить минимально полезные сведения приходится городить такую конструкцию
...
1. Насколько оправдан такой подход?
2. Есть ли какие-нибудь подводные камни, про которые надо знать?
3. Если мой подход неоптимален, то какую конструкцию можно использовать взамен?
=================
Док.
Win10 Ultim x64/Deb 10 amd64/Darwin Cocoa(Monterey):
FB 3.0.7.33374, Lazarus 2.3.0(trunk); FPC 3.3.1(trunk)


всегда так делаю.
иногда еще в таблицу-связку пишу денормализованные данные, т.к. справочники могут поменяться

из камней - иногда приходится добавлять нолики, т.к. план может внезапно измениться
INNER JOIN TBL_PEOPLE PM ON (JP.FK_PEOPLE = PM.ID+0)
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133029
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за мнения. Т.е. пока резюме такое:
* Поменять inner на outer
* Добавление FK вместо составных ключей оправдано и оптимальнее всего

Все правильно?

Планируется этим запросом выборка данных для конкретного пациента, остальное (кто доктор, цель визита и проч) - меняющиеся детали. По ID визита планируется редактирование записи и отправка ее в отчёт
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133033
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПоменять inner на outer

я бы не стал этого делать без острой необходимости.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133054
bsv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,Добавление FK вместо составных ключей оправдано и оптимальнее всего
Не всегда. Я бы, например, очень подумал - добавлять или нет FK на маленький справочник, который не планируется расширять. Например, статус заявки: 1-Активная, 2-Отложена, 3-Удалена.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133055
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Есть несколько таблиц-справочников
Код: sql
1.
2.
TBL_PEOPLE (пациенты и работники ЛПУ)
TBL_REASON_VISIT (причина визита в ЛПУ)

Хоть бы до T_ префикс сократил бы что ли...

Док
Код: sql
1.
TBL_JOB_POSITION (должности работников) ---> является detail для --->TBL_JOB_TITLE (список специальностей персонала) 

Это должна быть "периодическая таблица" без требований уникальности к паре POSITION + NAME.

Док
и одна общая (аггрегирующая сведения) с данными визитов пациентов в определенные ЛПУ к определенным врачам по определенным причинам и т.д.

Надо объяснять для чего она вообще нужна, и если нужна, то может несколько?
Для хранимых агрегатов нет универсальных правил, увы. В топик призывается Дед.

Док
Код: sql
1.
2.
3.
4.
CREATE TABLE TBL_VISITMAIN (
    ID                    INTEGER NOT NULL,
    PEOPLE             INTEGER NOT NULL,
    FK_OFFICE_CLINIC      INTEGER NOT NULL,



2. Планирую добавить в нее еще пару десятков внешних ключей на подобные таблицы.
3. Чтобы получить минимально полезные сведения приходится городить такую конструкцию
4. Причем, справочники могут быть с блобами.

1. ID_ лучше, чем FK_. Хотя это дело вкуса, конечно (если проект на одного - то пофиг).
2. Таблица c десятками внешних ключей должна автоматически вызывать подозрение.
Есть исключения - например, таблица, которая напарсила (или ещё откуда-то извлекла) всякое
безобразие, которое "плоское" и плохо раскладывается в несколько таблиц (разве что в ширину).
3. Нормальная конструкция. Если, конечно, на каждый чих делать не все 30 джойнов, а только нужные.
4. Выкинь все INNER. Это, конечно, дело вкуса, но таки лучше просто JOIN.

Док

1. Насколько оправдан такой подход?
2. Есть ли какие-нибудь подводные камни, про которые надо знать?
3. Если мой подход неоптимален, то какую конструкцию можно использовать взамен?
1. Вопрос неконкретен. См. выше про хранимые агрегаты.
2. Совпадающие поля в таблицах. Хотя ФБ вроде на них ругается с какой-то версии.
Мелочь, а неприятно. Впрочем, если соблюдать гигиену вегда использовать префиксы, то жить можно.
3. См. п.1. :) Для начала я бы не агрегировал всё подряд и добавил только те FK, которые
реально нужны. Авось и не понадобятся 30 ссылок. Во-вторых, сложность и громоздкость
резко увеличатся, если/когда у тебя вместо одной такой таблицы появится две - например,
TBL_AGG и TBL_AGG_DETAILS (потому что даты или несколько записей или просто потому что).
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133059
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
* Добавление FK вместо составных ключей оправдано и оптимальнее всего
Да. Про "маленькие" справочники правильно подсказывают, хотя целостность данных может быть важнее.

Док
Планируется этим запросом выборка данных для конкретного пациента, остальное (кто доктор, цель визита и проч) - меняющиеся детали.
Они у тебя как-то вшиты или формируются "построителем"/пользователем?
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133061
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor
иногда еще в таблицу-связку пишу денормализованные данные, т.к. справочники могут поменяться
Тут не понял. Можно подробнее?
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133063
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
pastor
иногда еще в таблицу-связку пишу денормализованные данные, т.к. справочники могут поменяться
Тут не понял. Можно подробнее?


Была в прайсе корова рыжая одна. Например, "Каток"
а потом стало "Физкультурно-оздоровительное катание для иных категорий граждан"

В статистике - одно и то же, а в ОФД уже ушло как ушло.

С диагнозами наверняка также. Или хуже. Был кровавый понос, а стало 10 разных категорий по МКБ.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133087
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor> В статистике - одно и то же, а в ОФД уже ушло как ушло.

Всё равно не понял. Если справочник периодический,
то проблемы нет. Если не периодический, то непонятно
как твой подход помогает её решить. Ты же не все поля
в таблицу копируешь?

> С диагнозами наверняка также. Или хуже.
> Был кровавый понос, а стало 10 разных категорий по МКБ.

ХЗ, я бы делал новую запись,
опционально - со ссылкой на
старую, хоть 10 в цепочку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133099
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
pastor> В статистике - одно и то же, а в ОФД уже ушло как ушло.

Всё равно не понял. Если справочник периодический,
то проблемы нет. Если не периодический, то непонятно
как твой подход помогает её решить. Ты же не все поля
в таблицу копируешь?

> С диагнозами наверняка также. Или хуже.
> Был кровавый понос, а стало 10 разных категорий по МКБ.

ХЗ, я бы делал новую запись,
опционально - со ссылкой на
старую, хоть 10 в цепочку.


может быть полное описание расчета проката или парковки например. или стринлист параметров на момент оформления. да что угодно.

пробовали делать истории, получение актуальной на момент времени и пр. - гемор.
компромисс между простотой пользования и возможностями разбора.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133105
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pastor
Был кровавый понос, а стало 10 разных категорий по МКБ.


Хранение строковых данных в основной таблице раздует её слишком, тормозить будет.

Замените редактирование справочника созданием дубликата со скрытием старого. У новых записей основной таблицы будет новый вариант, у старых останется старый.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133123
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory
pastor
Был кровавый понос, а стало 10 разных категорий по МКБ.


Хранение строковых данных в основной таблице раздует её слишком, тормозить будет.

Замените редактирование справочника созданием дубликата со скрытием старого. У новых записей основной таблицы будет новый вариант, у старых останется старый.


а мне не жалко.
я даже логи запросов /ответов http храню. шоп було.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133130
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor> может быть полное описание расчета проката или парковки например.
pastor> или стринлист параметров на момент оформления. да что угодно.

Ээээ и сколько (по времени и объемам) это всё безобразие хранится?

> пробовали делать истории, получение актуальной на момент времени и пр. - гемор.

Это да, нужно вьюхи/ХП плодить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133133
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокТ.е. пока резюме такое:
* Поменять inner на outer
* Добавление FK вместо составных ключей оправдано и оптимальнее всего

Все правильно?

У тебя в запросе условие по полю из справочника. Безмозглое применение п.1 может
привести пушного зверька.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133149
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
pastor> может быть полное описание расчета проката или парковки например.
pastor> или стринлист параметров на момент оформления. да что угодно.

Ээээ и сколько (по времени и объемам) это всё безобразие хранится?

> пробовали делать истории, получение актуальной на момент времени и пр. - гемор.

Это да, нужно вьюхи/ХП плодить.


5 лет минимум.
обычно - лет 10, до 50 гб, но там и фотки и все такое.

логи http - год,
логи действий пользователей, телеметрия - до ближайшего обновления БД
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133197
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Выкинь все INNER. Это, конечно, дело вкуса, но таки лучше просто JOIN.

Чтобы потом новички и склеротики в гугл лазили успокоить совесть/убедиться, что это одно и то же?
Такие сокращения - упыризм чистой воды.
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133208
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Гаджимурадов Рустам
Выкинь все INNER. Это, конечно, дело вкуса, но таки лучше просто JOIN.
Чтобы потом новички и склеротики в гугл лазили успокоить совесть/убедиться, что это одно и то же?
Такие сокращения - упыризм чистой воды.
так ты поди и OUTER после LEFT пишешь?
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133217
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
так ты поди и OUTER после LEFT пишешь?
всегда пишу кляузу "as" при указании алиаса для поля.
И? Я еще "не" или уже "тово"?

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

все ПК ведут на расширяемые в процессе внесения данных справочники. Если в поле ограниченное количество значений, я просто перечисляю их возможные значения в комменте к полю, куда смотрю, когда на клиенте список выбора формирую

Касаемо названий ID...FK - дело привычки.

Касаемо количества ФК... Как я понял, если не тащить их всех в запрос, то некритично. Собссно, табличка просто "собирает" в одну кучу ссылки на разнородные сведения.

Dimitry Sibiryakov,

Дим, ты же знаешь - я тупой гуманитарий. И полунамеков не понимаю. Расшифруй, плз
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133239
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Касаемо количества ФК... Как я понял, если не тащить их всех в запрос, то некритично. Собссно, табличка просто "собирает" в одну кучу ссылки на разнородные сведения.
не парься.
не надо пытаться "оптимизировать" сильно ЗАРАНЕЕ.
FK - средство для гарантированного обеспечения целостности данных.
зачем же от него отказываться?
когда-то, когда деревья были большими, а оптимизатор IB/FB был достаточно тупой, он при виде пары PK-FK впадал в экстаз и тут же пихал соответствующие индексы в PLAN.
и пофигу ему было, что план таким образом не всегда получался эффективным.
но много воды утекло с тех пор...
оптимизатор уже не тот.
нет в нём юношеского огня и задора...
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133240
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокДим, ты же знаешь - я тупой гуманитарий. И полунамеков не понимаю. Расшифруй, плз

Так уточни какое именно слово тебе непонятно чтобы я знал какую часть
http://www.ibase.ru/dataaccesspaths/ тебе цитировать. Левым джоином ты отсечёшь
возможность использования индекса для фильтрации и получишь гигантский natural
scan со всеми вытекающими тормозами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133246
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, слушай сюда.

У любой штуки есть и про и контра. Нет абсолютного зла и абсолютного добра. И эти про и контра надо иметь в виду применительно к своей конкретной задаче и принимать осмысленное решение. Так вот, касательно FK на короткие справочники, вопрос про иннеры с аутерами поднимем чуть позже, пока считаем, что живём с иннерами.

С точки зрения целостности FK - это триггер, видящий за счёт использования индекса больше, чем твой триггер, работающий в контексте уровня изоляции твоей транзакции. Поэтому он и не даст тебе сослаться на удалённую в справочнике запись или запись, ID которой был изменён, независимо от того, когда это произошло - до старта твоей транзакции или после и закоммичено оно или нет. Аналогично такой же триггер на справочнике не даст удалить позицию или изменить её ID если есть даже незакоммиченные ссылки в содержательных таблицах. Отсюда следует, что если удаления или изменения ID в справочнике не предусмотрены бизнес-логикой, то в этом и только в этом случае FK не особо и нужен, его вполне можно заменить твоими триггерами на содержательной таблице.

Что при этом про. На содержательной таблице из 100500 записей нет херового индекса с 5 значениями. Вред от него двоякий. Не, даже троякий. Во-первых, по мере роста таблицы его херовость в смысле затрат на перестройку при вставках-удалениях-модифицированиях (последнее - например, изменение статуса записи, стадии существования от необслуженной совсем через инстанции рассмотрения к завершению обслуживания). Но это так, тормозишки, на твоих объёмах ты их скорей всего и не заметишь. Настоящие тормоза ты заметишь на ресторе, при построении этого индекса целиком, это во-вторых. В-третьих, если в селективном запросе на эту ссылку наложено условие, оптимизатор может этот индекс и подцепить, независимо от иннер или аутер. Просто при иннере он его может подцепить и при наложении условия на поле в справочнике и построить перебор от справочника. Вот это в-третьих имеет свои про и контра. Если распределение значений в этом поле более-менее равномерное, ты получишь серьёзные тормоза. Если же, как в случае статуса, через годик работы в таблице из 100500 записей 100000 закрытых и 500 в работе, то запрос, отбирающий эти 500 на этот индекс не нарадуется, что есть про. А вот наоборот - заплачешь горючими слезами. Контра в том, что надо об этом помнить и гасить в этом случае ноликами.

За иннеры-аутеры. При современном развитии печатного дела на Западе вероятность использования оптимизатором в таких простых случаях херового индекса имхо невелика. На полуторке - да, в полный рост. Должен отметить, что в моей практике, тоиссь, на примерно миллионе сконструированных запросов, раз 5 был случай, когда оптимизатор действительно сложный запрос на иннерах выворачивал даже не через жопу, а через три, причём слоновьих, так что у меня просто глаза на лоб лезли, и при этом результат получался в разы лучше чем у меня при всём моём глубокомудрии в составлении явных планов Но обычно всё-таки наоборот. Напоминаю - речь о полуторке. При запросе-ёлке, тоиссь, соединениях со справочниками одной ведущей таблицы, в общем, похрен, что иннер, что аутер. В случае чего иннер направить легко можно ноликами. А вот если этот запрос впоследствии берётся как основа или компонент действительно сложного с аутерами в смысловой части, то наступить на грабли просто нефиг делать.

За композиты. Это мощное оружие, которое может быть как созидательным, так и разрушительным. Если все его сегменты по отдельности херовые, то к нему относится всё, что относится к херовому односегментному индексу. И построение долгоиграющее, и обслуживание нагрузочное, и оптимизатор не особо склонен его подхватывать и результат использования сильно зависит от распределения значений в сегментах, плюс условия на ведущие сегменты должны быть на равенство. Короче, смысл в нём фактически может быть для одного конкретного запроса. И не дай бог его оптимизатор подхватит для другого. Поэтому их обычно усиливают высокоселективным, а то и уникальным сегментом. Если этот сегмент ведущий, то всё чики-пуки, но тогда выгода от него проценты - меньше и быстрее загружаются страницы чем при использовании раздельных индексов на те же сегменты в нужном порядке. А если его прилепляют на жопу для обмана оптимизатора, то опять упираемся в экстремальную выгоду за счёт распределения значений в первом сегменте для запросов, отбирающих антипик распределения и дикие тормоза для остальных, тоиссь memento +0, а то оптимизатор будет его тыкать куда ни пОпадя.

За периодические справочники. Это когда в нём не опечатку надо исправить, что должно подействовать на результаты всех запросов. Поскольку формированием содержательных записей обычно занимается гомо боле-мене сапиенс, тоиссь, смотрит на содержимое справочника и тыкает в нужную строчку, имхо проще всего вопрос решается включением в структуру записи справочника диапазоном дат действия и инсёртом новой записи в справочник. Попадание даты документа при формировании в диапазон несложно и проконтролировать. А поскольку по сути несколько записей в справочнике на самом деле есть одна сущность, скажем, организация название меняет, вопрос статистики и прочих агрегатов решается дополнительной таблицей 1:n для группирования в запросах. Но это уже всё имхо.

Так вот, Док, уложи сии измышления в личную христа матию и применяй к своим конкретным обстоятельствам, что тебе полезно в каком случае, а что вредно. Тоиссь, не лепи по канонам и чьим-то мнениям, а думай вперёд,

Ма-ма, ма-ма, что мы будем делать... ыыы...
Ма-ма, ма-ма, как мы будем жить... кууу...
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133249
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаВо-первых, по мере роста таблицы его херовость в смысле затрат на перестройку
при вставках-удалениях-модифицированиях (последнее - например, изменение статуса
записи, стадии существования от необслуженной совсем через инстанции
рассмотрения к завершению обслуживания).

Насколько мне изменяет мой склероз, как минимум в тройке индекс не трогается
вообще если в записи индексированное поле не изменялось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133253
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Насколько мне изменяет мой склероз, как минимум в тройке индекс не трогается
вообще если в записи индексированное поле не изменялось.


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

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

спасибо. Читал, как увлекательный роман на языке, в котором некоторые слова знакомы

Вобщем, вынес для себя пока одно: оставлю, как есть, потом буду посмотреть.

Про упомянутые выше DS Левым джоином ты отсечёшь возможность использования индекса для фильтрации и получишь гигантский natural scan со всеми вытекающими тормозами. траблы я уже в курсе, ибо на нынешней базе после 40000 записей появились ощутимые тормоза. Что и сподвигло меня искать другие варианты построения базы.

При нынешней структуре (из стартового топика 22432072 ) птичка показывает такой план

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
PLAN JOIN (JP NATURAL, JT INDEX (PK_TBL_JOB_TITLE), PM INDEX (PK_TBL_PEOPLE), VM INDEX (FK_TBL_VISITMAIN_2), RV INDEX (PK_TBL_REASON_VISIT), PV INDEX (PK_TBL_PEOPLE))

------ Информация о производительности ------
Время подготовки запроса = 31ms
Время выполнения запроса = 63ms
Среднее время на получение одной записи = 5,73 ms
Current memory = 36 636 864
Max memory = 36 804 304
Memory buffers = 2 048
Reads from disk to cache = 5
Writes from cache to disk = 0
Чтений из кэша = 157



Т.е. неиндексированные чтения все равно есть.

Поэтому возник еще вопрос. А если такую структуру
Код: plaintext
T1 (FK)--> master T2(FK) --> master T3

переделать на
Код: plaintext
1.
T1 (FK)--> master T2(FK)
T1 (FK)--> master T3

без изменения структуры T2, будет разница?
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133289
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, Дед в топик засаммонился (за что ему спасибо),
сказку на ночь спел, а про хранимые агрегаты не рассказал.

Незачёт!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133290
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Код: sql
1.
Время выполнения запроса = 63ms

и что ты хочешь тут оптимизировать?!
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133292
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет предела совершенству!

P.S. Может это на пустой БД...

P.S.S. Хотя миллионов записей
там всё равно никогда не набежит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133294
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПри нынешней структуре (из стартового топика птичка показывает такой план

Или статистика индексов не пересчитана или запрос не тот или что-то сильно
окривело. Первичной таблицей того запроса должна быть PV с индексом по PV.ID,
ибо по нему идёт фильтрация во where.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133307
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

еще раз: закрыл-открыл IBE
запрос-план-статистика
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  VM.DATEVISIT,
  JT.NAME ||' '||PM.LAST_NAME AS DOCTOR,
  'пациент '|| PV.LAST_NAME AS PATIENT
FROM TBL_PEOPLE PV
   INNER JOIN TBL_VISITMAIN VM ON (PV.ID = VM.FK_PEOPLE)
   INNER JOIN TBL_REASON_VISIT RV ON (VM.FK_REASON_VISIT = RV.ID)
   INNER JOIN TBL_JOB_POSITION JP ON (VM.FK_JOB_POSITION = JP.ID)
   INNER JOIN TBL_PEOPLE PM ON (JP.FK_PEOPLE = PM.ID)
   INNER JOIN TBL_JOB_TITLE JT ON (JP.FK_JOB_TITLE = JT.ID)
WHERE (PV.ID = :prmID)



Код: sql
1.
2.
3.
План
--------------------------------------------------------------------------------
PLAN JOIN (JP NATURAL, JT INDEX (PK_TBL_JOB_TITLE), PM INDEX (PK_TBL_PEOPLE), VM INDEX (FK_TBL_VISITMAIN_2), RV INDEX (PK_TBL_REASON_VISIT), PV INDEX (PK_TBL_PEOPLE))



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
------ Информация о производительности ------
Время подготовки запроса = 31ms
Время выполнения запроса = 31ms
Среднее время на получение одной записи = 2,82 ms
Current memory = 36 636 864
Max memory = 36 804 304
Memory buffers = 2 048
Reads from disk to cache = 5
Writes from cache to disk = 0
Чтений из кэша = 157

картинки







Мимопроходящий
и что ты хочешь тут оптимизировать?!

я просто спросил :)

Вобщем, спасибо всем за мысли и участие. Примерно, как быть, я понял
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133308
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
YuRock
пропущено...
Чтобы потом новички и склеротики в гугл лазили успокоить совесть/убедиться, что это одно и то же?
Такие сокращения - упыризм чистой воды.
так ты поди и OUTER после LEFT пишешь?

OUTER - бесполезное слово. LEFT INNER писать нельзя. Потому - нет, не пишу, т.к. это как раз очевидно.

Ivan_Pisarevsky
всегда пишу кляузу "as" при указании алиаса для поля

Я тоже. Кажется, где-то без этого было нельзя, точно не помню.
Плюс, это явный конец выражения - объявление названия. Без AS получается абракадабра типа NAME SOMENAME
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133311
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockLEFT INNER писать нельзя.

В оракуле - можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133542
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DS> YuRock > LEFT INNER писать нельзя.
>
> В оракуле - можно.

Серьёзно что ли?

P.S. Лень проверять.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133547
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Производительность и количество FK в таблице
    #40133549
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это что за надпись на заборе?
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производительность и количество FK в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (16): Анонимы (13), Yandex Bot, Bing Bot, Google Bot 3 мин.
x
x
Закрыть


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