@tukreb

Насколько вредно джойнить таблицы где отсутствует информация?

Через Doctrine используется наследование таблиц через JOINED. Например: Item - (и множество его потомков)

В некоторых задачах, нужно обращаться именно к предку Item, а именно к его общим полям, и это приводит к этому
https://www.doctrine-project.org/projects/doctrine...
Цитата с сайта
There is a general performance consideration with Class Table Inheritance: If the target-entity of a many-to-one or one-to-one
association is a CTI entity, it is preferable for performance reasons that it be a leaf entity in the inheritance hierarchy, (ie. have no subclasses).
Otherwise Doctrine CANNOT create proxy instances of this entity and will ALWAYS load the entity eagerly.


То есть доктрина JOIN абсолютно всех детей таблицы Item, в итоге получается десятки JOIN и может сотни и более полей, из которых 99% будут null, т.к попросту не существуют в БД.

Так вот вопрос, насколько это вредит производительности и нужно ли изобретать велосипед, чтобы избежать это? Или это настолько ничтожно будет влиять, что стоит забить и ждать Doctine 3.0 ( https://github.com/doctrine/orm/issues/3509 )?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 2
@dmtrrr
Backend developer
А вы измерьте время с использованием doctrine и без, и получите ответ. То, что join не бесплатный это факт, насколько именно, зависит от конкретной задачи.
Ответ написан
Комментировать
@tukreb Автор вопроса
В общем, пришлось выкинуть пока наследование в доктрине, ну или альтернатива - писать везде через ручные SQL запросы, но тогда доктрину вообще можно выкинуть.
Потестил как получилось:
Количество вызываемых полей, через SELECT очень сильно влияет на скорость запроса, даже сильнее чем JOIN и не важно, что там 90% полей пустые.
Когда нужно вызвать допустим всего 5 полей определённой таблицы, доктрина вызывает 20 и более полей (сотнями может исчисляться), т.к автоматом JOIN всех детей, и увеличивая тем самым задержку с 30мс до 100мс (Docker под Windows) и это только при 3-5 наследоваемых таблицах, а планировалось десятки.
Если выбрать только 5 полей, но сделать JOIN на все таблицы, как делает Доктрина, то задержка будет всего 50мс, против эталонного 30мс.

П.С Возможно влияние JOIN будет заметно, при большем количестве таблиц, но при мини тесте поля сильнее повлияли.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы