powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и наследование
108 сообщений из 108, показаны все 5 страниц
JPA и наследование
    #39326485
Сурикат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица Users в БД с полями:

Код: plsql
1.
2.
3.
id
name
someBigData



Содержимое таблицы: id пользователя, его имя и какое-то поле с данными большого объёма. (Полей на самом деле большое, плюс связи с другими таблицами и т.п., но мысль ясна)

Задачи:
1. Получать по конкретному id информацию о пользователе - т.е. выборка по всем полям и связанным таблицам.
2. Получать из БД список пользователей (скажем, 200 записей) - просто id и имя. Не хочется каждый раз, тащить большие объёмы данных и кучу связанных полей для списка пользователей, где нужны только имя и id.
id
Соответственно, завожу 2 Entity:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
public class User {
    private Long id;
    private String name;
}

@Entity
public class UserData extends User {
    private String someBigData;
}



Но, не совсем понимаю, как их замапить на БД. Если как @Inheritance(strategy = InheritanceType.SINGLE_TABLE), то везде в примерах говорится, что User должен быть абстрактным и не создавать инстансов. @MappedSuperclass не отображается на таблицу вообще, как я понял.

Как настроить работу, что бы можно было иметь два не абстрактных класса, замапленных на одну таблицу, но отображающих полные и неполные данные. Или эта задача решается вообще как-то иначе?
...
Рейтинг: 0 / 0
JPA и наследование
    #39326496
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сурикат,

@DiscriminatorColumn + SINGLE_TABLE
...
Рейтинг: 0 / 0
JPA и наследование
    #39326502
Сурикат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Но, ведь это не разные сущности, по сути. Т.е. даже если вкорячить в таблицу DiscriminatorColumn, то... по какому критерию их разделять? И даже если и придумать критерий, то это получается, что на каждую предметную сущность, у нас будет в таблице по 2 записи? А смысл? Тогда уж, логичнее OneToOne зависимость и слить в отдельную таблицу всё кроме id и name.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326509
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сурикат,

А вы хотели чтобы одна и та же запись в разные моменты чтения выдавала бы разные классы сущности? Зачем?? Ведь User не каститься к UserData.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326511
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сурикат,
- блоб полей нет? Фотографий 3500x3500 пикселей? Тогда вообще не парься.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326520
Сурикат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Тут дело, скорее просто в отсутствии опыта работы с ORM и незнании особенностей. В JDBC, я понимаю, что могу вручную составить запрос, указав определённые поля и просто отсечь объёмные поля, которые не нужны в данный момент. Ну и, ручной маппинг в JDBC как раз решит вопрос с заполнением полей в разных классах. Но в JPA, кроме как сделать наследование на ум особо ничего не пришло. (ну, разве что, да - сделать отдельную таблицу со связью OneToOne и ленивую загрузку). В интернетах ответа не нашёл, затем и пошёл на форум :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39326533
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сурикат,
- блоб полей нет? Фотографий 3500x3500 пикселей? Тогда вообще не парься.
BLOB ленивым свойством решается. Нафига городить ассоциацию.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326541
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СурикатТут дело, скорее просто в отсутствии опыта работы с ORM и незнании особенностей.

Ну, а с проектированием БД всё в порядке? Нафига на одну таблицу два типа?

СурикатВ JDBC, я понимаю, что могу вручную составить запрос, указав определённые поля и просто отсечь объёмные поля, которые не нужны в данный момент.

Ширина выборки на производительность имеет совершенно никакого влияния. Вы занимаетесь привентивной оптимизацией.

СурикатНу и, ручной маппинг в JDBC как раз решит вопрос с заполнением полей в разных классах.

Вы не рассказали как вы собираетесь объект типа User хранить в переменной типа UserData. С точки зрения одной таблицы они идентичны. А в коде вы решили эту идентичность нарушить.

Сурикат Но в JPA, кроме как сделать наследование на ум особо ничего не пришло.

Что бы на ум что-то пришло надо определиться с тем какую именно проблемы мы пытаемся решить.
Если нужно ограничить выборку по ширине, то пожалуйста JPQL:
Код: sql
1.
select new User(id, name) from UserData
...
Рейтинг: 0 / 0
JPA и наследование
    #39326544
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123Сурикат,
- блоб полей нет? Фотографий 3500x3500 пикселей? Тогда вообще не парься.
BLOB ленивым свойством решается. Нафига городить ассоциацию.
+1. Был не уверен)
тогда вообще проблема высосана из пальца.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сурикат,

Нашел ещё другое решения. По-хорошему такую проблему нужно решать ленивостью. Ваш подход ленивость убивает на корню. Нужно явно загружать данные другим запросом, чтобы получить все детали. А для ленивости в JPA существует аннотация @Basic. Только учтите что ленивость простых свойств требует инструментации класса на уровне байт-кода. Не знаю как современные реализации JPA, но Hibernate ещё несколько лет назад не умел инструментировать сущности на лету. Нужно было в сборке прописывать.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326634
Сурикат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВы занимаетесь привентивной оптимизацией.


Да, похоже на то. :)

Blazkowicz По-хорошему такую проблему нужно решать ленивостью. Ваш подход ленивость убивает на корню.

Согласен. Ленивость тут походит гораздо лучше и, в общем, то даже проще.

Спасибо за дельные советы :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39326862
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczШирина выборки на производительность имеет совершенно никакого влияния. Вы занимаетесь привентивной оптимизацией.

Покрывающие индексы? Нет, не слышал.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркПокрывающие индексы? Нет, не слышал.
Лолшто?
...
Рейтинг: 0 / 0
JPA и наследование
    #39326890
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЛокшин МаркПокрывающие индексы? Нет, не слышал.
Лолшто?
то
...
Рейтинг: 0 / 0
JPA и наследование
    #39326897
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MS опять впереди всех)))
...
Рейтинг: 0 / 0
JPA и наследование
    #39326900
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123MS опять впереди всех)))
Такая оптимизация есть не только у MS. Например здесь .
...
Рейтинг: 0 / 0
JPA и наследование
    #39326904
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк то
...а если бы у рыбы была шерсть, то в ней водились бы блохи.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326940
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк,
это только подтверждает исключение из правил для остальных СУБД).
А по сабжу, эти мелочи что ты привёл...они не ведь не имеют к сабжу отношения.
Теория построения СУБД это одно, а суровая реальность построения Ынтирпрайз - другое.
IMHO
Удачи!
...
Рейтинг: 0 / 0
JPA и наследование
    #39326982
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Локшин Марк,
это только подтверждает исключение из правил для остальных СУБД).

Oracle, DB2 .
Petro123Теория построения СУБД это одно, а суровая реальность построения Ынтирпрайз - другое.

Медленно работает? Да мы еще 10 серверов возьмем.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326988
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123MS опять впереди всех)))
Да ладно тебе стебаться, индексное покрытие обеспечивает любая мало-мальски адекватная СУБД, вплоть до .

Однако, IMHO если человек выбрал ORM, то вопросы как оптимальнее что-то сделать с БД его точно не волнуют. :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39326995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевОднако, IMHO если человек выбрал ORM, то вопросы как оптимальнее что-то сделать с БД его точно не волнуют. :)
скажу больше.
Если человек выбрал Java, то вопросы Мелочные в СУБД решаются не на уровне программиста.
И это замечательно.
Есть бизнес и требования бизнеса. А есть НИИИ для создания СУБД.
...
Рейтинг: 0 / 0
JPA и наследование
    #39326996
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньеввыбрал ORM
ты прав - вопрос про JPA а не экзотику в БД.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327004
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркМедленно работает? Да мы еще 10 серверов возьмем.
ты не понял.
В Java сидят практики с большой зарплатой. А не теоретики.
Вот когда ты ссылку на практику из ветки Оракла покажешь. Тогда тут будут шевелиться и и ВОЗМОЖНО включать в свою практику.
Пока там в ветке IMHO ноль твоих ссылок.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327073
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вот когда ты ссылку на практику из ветки Оракла покажешь. Тогда тут будут шевелиться и и ВОЗМОЖНО включать в свою практику.
Пока там в ветке IMHO ноль твоих ссылок.
Заблуждайтесь дальше, ваше право.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327080
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевОднако, IMHO если человек выбрал ORM, то вопросы как оптимальнее что-то сделать с БД его точно не волнуют. :)
Если более-менее быть в курсе и понимать что и как работает, то можно и с ORM задумываться над оптимальностью.
но это же
Petro123мелочи что ты привёл...
...
Рейтинг: 0 / 0
JPA и наследование
    #39327089
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркPetro123Вот когда ты ссылку на практику из ветки Оракла покажешь. Тогда тут будут шевелиться и и ВОЗМОЖНО включать в свою практику.
Пока там в ветке IMHO ноль твоих ссылок.
Заблуждайтесь дальше, ваше право.

Жесть ты упоротый. Ещё раз для тех кто в танке.
Выбирать 2 поля без индекса и 10 полей без индекса - разница в производительности околонулевая.
Выбирать 2 поля с "покрывающим индексом" или 10 полей с "покрывающим индексом" - разница в производительности околонулевая.
Отсюда вывод - производительность от ширины выборки не зависит.
А есть там индекс или нет, это совершенно другой вопрос к теме отношения не имеющий.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327100
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЕсли более-менее быть в курсе и понимать что и как работает
извини, но уметь оличать мелочи от важностей - это уже уровень программиста а не кодировщика.
BlazkowiczОтсюда вывод - производительность от ширины выборки не зависит.
А есть там индекс или нет, это совершенно другой вопрос к теме отношения не имеющий.
+1
...
Рейтинг: 0 / 0
JPA и наследование
    #39327142
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЖесть ты упоротый. Ещё раз для тех кто в танке.
Выбирать 2 поля без индекса и 10 полей без индекса - разница в производительности околонулевая.
Выбирать 2 поля с "покрывающим индексом" или 10 полей с "покрывающим индексом" - разница в производительности околонулевая.
Отсюда вывод - производительность от ширины выборки не зависит.
А есть там индекс или нет, это совершенно другой вопрос к теме отношения не имеющий.

Таблицы без индексов на продакшене row-based СУБД бывают очень редко. Разве что у крутых java-ынтерпрайз программистов... Наличие индекса определяет возможные оптимизации, которыми пользуется СУБД. Возможность применения обсуждаемой оптимизации зависит от итогового ResultSet'а. Поэтому вывод абсолютно неверный, т.к. производительность существенным образом зависит от того, попадает ли дополнительное поле в индекс или нет, и поэтому совет твой про производительность крайне плохой и вредный.

PS. А ты - хамло.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327159
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркТаблицы без индексов на продакшене row-based СУБД бывают очень редко.

Как это опровергает моё утверждение?

Локшин МаркРазве что у крутых java-ынтерпрайз программистов...

ЧСВ зашкаливает?

Локшин МаркНаличие индекса определяет возможные оптимизации, которыми пользуется СУБД.

И?

Локшин МаркВозможность применения обсуждаемой оптимизации зависит от итогового ResultSet'а.
Какой конкретно оптимизации? У автора темы она одна у тебя другая.

Локшин МаркПоэтому вывод абсолютно неверный, т.к. производительность существенным образом зависит от того, попадает ли дополнительное поле в индекс или нет
ППЦ у тебя логика. То есть это не индексы нужны чтобы оптимизировать запросы которые поступают БД, а программист, который использует БД должен учитывать те индксы которые нахерачил DBA чтобы не дай бог не получить не оптимальную выборку?

Локшин Марк, и поэтому совет твой про производительность крайне плохой и вредный.
Ты даже не вникаешь в то что здесь пишут. У меня совет был использовать ленивые свойства вместо того что изобретает ТС. А влияние ширины выборки на производительность это констатация факта, а не совет.

Локшин МаркPS. А ты - хамло.
Добро пожаловать в интернет.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327213
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВыбирать 2 поля с "покрывающим индексом" или 10 полей с "покрывающим индексом" - разница в производительности околонулевая.
Отсюда вывод - производительность от ширины выборки не зависит.


Разница есть в контексте плана Index Only Scan. Сама таблица не будет сканиться все данные в чистом виде из индекса будут браться.

Т.е читаться будет только файл с индексом который скорее всего в большинстве случаев будет меньше по размеру в байтах чем таблицы, и вероятность что индекс поместится в памяти больше чем таблица, ну как минимум большая часть индекса в процентном соотношении будет в кэше RAM

Но это сферический случай. Выборка идет только по самой таблицы ни каких join и никаких дополнительных полей не из индекса выбираться не будут.

все в контексте Postgres
...
Рейтинг: 0 / 0
JPA и наследование
    #39327259
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczППЦ у тебя логика. То есть это не индексы нужны чтобы оптимизировать запросы которые поступают БД, а программист, который использует БД должен учитывать те индксы которые нахерачил DBA чтобы не дай бог не получить не оптимальную выборку?

Не вдаваясь в подробности кто там должен создавать индексы, поясняю, что небрежным отношением к полям выборки (производительность от ширины выборки не зависит (с) ) ты лишаешь возможности СУБД применить оптимизацию, а DBA сделать индекс для оптимизации, если его почему-то нет.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327268
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНе вдаваясь в подробности кто там должен создавать индексы, поясняю, что небрежным отношением к полям выборки (производительность от ширины выборки не зависит (с) ) ты лишаешь возможности СУБД применить оптимизацию, а DBA сделать индекс для оптимизации, если его почему-то нет.
Ерунда. Система тестируется в условиях близких к боевым, DBA смотрит статистику и оптимизирует базу под запросы. Если критические запросы занимают слишком много времени никто не мешает в ORM их сузить. Только бывает это нужно исключительно после запуска боевого продакшна, если действительно узкое место выявлено на отдельно взятом запросе в реальных условиях. А закладывать подобные тонкие оптимизации на этапе написания кода это бред. Усложнять код только ради того чтобы в будущем рассчитывать на подобный тюнинг - бред в двойне.
Поэтому своё "лишает возможности" можете оставить при себе. Тонкий тюниг всегда требует изменений с обоих сторон - БД и Middle Tier. И никаких ограничений для него нет ни в JDBC ни в ORM.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327270
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно я бы загружал меньше колонок из бд, потому что тогда java-обьект будет меньше памяти занимать.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327290
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01,

Вопрос не в меньше колонок, вопрос в наследовании.

Условно говоря

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  User {
    int id;
    String name;
  }

  UserWithPassport  extends User  {
    String passportNumber;
    ....
  }

  UserWithSvidetelstvoORojdenii  extends User  {
    String svidetelstvoSeria;
    String svidetelstvoNumber;
    ....
  }

  ...



С точки зрения СУБД если тебе нужны только сущности типа User, то их можно получить только индексным покрытием.
Но с позиции философии ООП надо создавать объекты соответствующих класов, хоть и работать с ними как с классом User. А значит при считывании объектов надо: либо заморачиваться с ленивой подгрузкой полей (и разными запросами на то и другое), либо забыть про индексное покрытие.

Вот о чем, как мне кажется, идет философский диспут, который со стороны выгладит как: "Сам ты это слово". :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39327292
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01Все равно я бы загружал меньше колонок из бд, потому что тогда java-обьект будет меньше памяти занимать.
Вы к нам на машине времени прямиком из 90х? Планка DDR4 64Gb cо штатной частостой 3000 стоит 400 USD. Это примерно 1 день работы программиста на нормальной зарплате в штатах. На серверную мать можно впихнуть 512Gb!! Это пол Гига оперативы! А вы тут байтики в ваших несчастных объектах экономите, а потом думаете как же потом запустить ещё 5 запросов, чтобы недостающие поля загрузить.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327296
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевВот о чем, как мне кажется, идет философский диспут, который со стороны выгладит как: "Сам ты это слово". :)
Философский диспут тут только у тех кто мнит себя DBA а про ORM знает только то что "оно медленное". Грузите всегда все поля сущности. Всё. Когда нужны будут тонкие оптимизации - никто не мешает их применить в тех кейсах, где это действительно нужно.
Появился толстый BLOB, который нет смысла тоскать по сети - добавили ленивое свойство.
Решили читать колонки из индекса? Меняем загрузку на SELECT new User(id, name) и только там где это, действительно , требуется.
Вот и всё. Никаких выдуманных ограничений.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327701
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczФилософский диспут тут только у тех кто мнит себя DBA а про ORM знает только то что "оно медленное".
Ну да, ну да использую не один год разные ORM, и знаю только то, что "оно медленное". Опять мимо тазика.
BlazkowiczГрузите всегда все поля сущности. Всё. Когда нужны будут тонкие оптимизации - никто не мешает их применить в тех кейсах, где это действительно нужно.

Вот как раз сущность + поле "someBigData" - хороший случай для оптимизации. Конечно, когда у системы 3,5 пользователя и в таблице 100 записей можно грузить и все. Но если мы говорим о реальной высоко нагруженной системе, то это как раз хорошее место для оптимизации, притом такое место видно заранее (если конечно не знать, что "Ширина выборки на производительность имеет совершенно никакого влияния."). Ну и конечно, можно же все замазать гигагерцами процов и терабайтами оперативы.
А пассаж про "это нужно исключительно после запуска боевого продакшна" вообще шикарен. Такой продакшен может очень сильно огорчить заказчика. И если все вопросы оптимизации относить на этап поддержки в продакшене, то может оказаться, что дешевле все взять и переписать, чем пытаться оптимизировать.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327770
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк,
тут были такие методы озвучены:
- ничего не делать т.к. экономия на спичках в CRUD системе
- поставить тяжёлым полям ленивую загрузку по требованию
- вынести тяжёлые поля в отдельный класс с ленивой загрузкой
- ВашСпособ.
Вы считаете что ваш способ настолько важен что его первым в списке поставить?
...
Рейтинг: 0 / 0
JPA и наследование
    #39327820
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вы считаете что ваш способ настолько важен что его первым в списке поставить?
Да у меня был не столько способ, сколько констатация факта того, что игнорирование ширины выборки может в реальных кейсах весьма ощутимо ударить по производительности...
...
Рейтинг: 0 / 0
JPA и наследование
    #39327837
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНо если мы говорим о реальной высоко нагруженной системе
Бла-бла-бла. Каждый разработчик мнит что его проект будет высоко нагруженной системой. А по факту таких единицы.

Локшин Марк то это как раз хорошее место для оптимизации
Привентивной оптимизации.

Локшин МаркНу и конечно, можно же все замазать гигагерцами процов и терабайтами оперативы.
Которые стоят на порядки дешевле чем работа квалифицированого специалиста. Но не всем дано понять.

Локшин МаркА пассаж про "это нужно исключительно после запуска боевого продакшна" вообще шикарен.
Потому что реальную картину нагрузок вы даже на тестах не получите.

Локшин МаркТакой продакшен может очень сильно огорчить заказчика.
Понятно. Аутсорс к тому же. Бывает.

Локшин МаркИ если все вопросы оптимизации относить на этап поддержки в продакшене, то может оказаться, что дешевле все взять и переписать, чем пытаться оптимизировать.
Ооо, молодой, горячий, руссский программист. Такого видно за версту. Взять и переписать. Других решений не знает.
...
Рейтинг: 0 / 0
JPA и наследование
    #39327838
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркДа у меня был не столько способ, сколько констатация факта того, что игнорирование ширины выборки может в реальных кейсах весьма ощутимо ударить по производительности...
Ну, то есть про упоротость я не ошибся.
Во-первых. Ширина выборки таки на производительность не влияет. Вы до сих пор не удосужились это никак опровергнуть кроме как закатыванием глаз и ахами по поводу мегагерц.
Во-вторых. Если вы вдруг решили оптимизировать выборку путём сужения и индексации, то выше я привел как это делается путём простейшей замены способа выборки. Вам же снова по делу нечего возразить, так как по-вашему можно только "всё переписать".
...
Рейтинг: 0 / 0
JPA и наследование
    #39328249
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Blazkowicz]Локшин МаркВо-первых. Ширина выборки таки на производительность не влияет
А почему не влияет-то? По сети трафика гонять меньше, жавских объектов создавать меньше, ну и собственно памяти нужно меньше, CPU тоже.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328257
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловА почему не влияет-то? По сети трафика гонять меньше, жавских объектов создавать меньше, ну и собственно памяти нужно меньше, CPU тоже.
Влияет если текст в поле из >1000 букв или картинка в пару мегов.
Тогда уже все решения разобрали.
Вы про какой случай?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328279
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловА почему не влияет-то? По сети трафика гонять меньше, жавских объектов создавать меньше, ну и собственно памяти нужно меньше, CPU тоже.

Имеется ввиду что при выборке записей, в общем случае, неважно два поля выбирать или 12. Производительность запроса при этом практически одинаково, план исполнения от этого не поменяется(ну за исключением случая когда всю запись можно вынять из индекса). Вопрос трафика и тд перпендикулярен всему этому.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328280
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловА почему не влияет-то?
Нет, но если буквоедствовать, то да влияет. Но вот только разница между передачей 20 полей с 2 полей на несколько порядков меньше чем затраты RDBMS на поиск записей и передачи этих данных по сети, в принципе.

Андрей ПанфиловПо сети трафика гонять меньше

На сколько меньше?

Андрей Панфиловжавских объектов создавать меньше

Речь о "ширине" выборки. Количество объектов это количество записей в БД. Это уже длина выборки.

Андрей Панфиловну и собственно памяти нужно меньше, CPU тоже.
По поводу памяти, сильно зависит от того что у вас там за типы. По поводу CPU - смешно. Тормоза в работе с БД они реже всего из CPU приходят.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328318
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczАндрей ПанфиловПо сети трафика гонять меньше

На сколько меньше?


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

BlazkowiczАндрей Панфиловжавских объектов создавать меньше

Речь о "ширине" выборки. Количество объектов это количество записей в БД. Это уже длина выборки.

Андрей Панфиловну и собственно памяти нужно меньше, CPU тоже.
По поводу памяти, сильно зависит от того что у вас там за типы. По поводу CPU - смешно. Тормоза в работе с БД они реже всего из CPU приходят.

Речь о ширине и идет. Пришел пакет L7 - его JDBC-драйвер должен разобрать и превратить байты в строки, числа и пр., а только потом ORM превратит это все в бины. Соответственно тратим время на то чтобы получить жавские объекты, потом будем заставлять GC их вычищать.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328330
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловвот есть транспортный уровень, под ним канальный и физический,

Блеснем познаниемс в OSI?

Андрей Панфиловвы выбираете за раз некоторое внушительное количество записей, которое не влезает в пакет транспортного уровня. Есть разница в одном пакете вы данные получите или в десяти?
Вы не получите выборку одним пакетом почти наверняка. Это раз.
И вы ушли от моего вопроса про величину разницы. Это два.

Андрей Панфиловпотом будем заставлять GC их вычищать.
Ну, давайте про GC ещё поговорим. Например о том что производительность большинства (если не всех) сборщиков в Hotspot зависит от количества живых объектов, а не от количествуа "вычищаемых". Поэтому гадить большим количеством быстроумирающих объектов не страшно.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328332
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,
интересно вы копаете).
А вы верите что на прикладном уровне маппинга монописуальна ваша ширина и размер пакетов в нижних уровнях?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328362
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловЕсть разница в одном пакете вы данные получите или в десяти?

есть гарантия что запрос будет выбирать данные точно влезающие либо в 1 либо в 10 TCP пакетов ?
т.е это наиболее распространенный сценарий сетевого соединения?
насколько часто вам приходится подгонять SQL запросы под длину сетевого пакета ?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328466
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczБлеснем познаниемс в OSI?
Тут блистать не чем, данных больше - пропускную способность нужно иметь выше, ограничение на размер пакетов и TCP ACK убивают производительность, или это не очевидно?

BlazkowiczВы не получите выборку одним пакетом почти наверняка. Это раз.
т.е. между 1 и 10 разница есть, а между 5 и 10 уже нет?

BlazkowiczИ вы ушли от моего вопроса про величину разницы. Это два.
Ну по правде говоря, вопрос "почему" на абсурдное, на мой взгляд, утверждение задал я, при этом я свое мнение обосновал. Вопрос "на сколько меньше трафика по сети гонять" тоже сам по себе абсурден, ибо и так очевидно, что в переделе зависимость линейная, а не в переделе зависит от. Что касается изначального постулата, о том что производительность не зависит от ширины выборки, то на запросах вида:

Код: plsql
1.
SELECT '100 chars' AS A1, ... '100 chars' AS AN FROM DUAL CONNECT BY LEVEL < 1000000;



разница в скорости выборки между 2 и 20 колонками - 10%, а между 50 и 100 - уже 100%, по CPU тоже разница видна невооруженным взглядом: http://screencast.com/t/h6kM7yDx

BlazkowiczНу, давайте про GC ещё поговорим. Например о том что производительность большинства (если не всех) сборщиков в Hotspot зависит от количества живых объектов, а не от количествуа "вычищаемых". Поэтому гадить большим количеством быстроумирающих объектов не страшно.А чего вы решили что они быстро умирают-то? В PostgreSQL, к примеру, по-умолчанию данные оседают в резалтсете ( https://jdbc.postgresql.org/documentation/head/query.html#fetchsize-example)
...
Рейтинг: 0 / 0
JPA и наследование
    #39328492
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловТут блистать не чем, данных больше - пропускную способность нужно иметь выше, ограничение на размер пакетов и TCP ACK убивают производительность, или это не очевидно?
Не очевидно. Кроме данных в пакетах ездит куча служебной информации. Выборки далеко не всегда имеют единственную строку как результат.

Андрей Панфиловт.е. между 1 и 10 разница есть, а между 5 и 10 уже нет?

Не понял связи. Мой посыл в том что затраты на поиск и чтение не сопоставимы с разницей в передаче по сети 5 и 50 колонок.

Андрей ПанфиловНу по правде говоря, вопрос "почему" на абсурдное, на мой взгляд, утверждение задал я, при этом я свое мнение обосновал.

Обоснования не обнаружено. Вы указываете на то что разница должна быть. Таки - да, она есть. Но вы игнорируете тот факт что на фоне всех остальных накладных расходов на выполнения запроса ею можно принебречь.

Андрей Панфиловразница в скорости выборки между 2 и 20 колонками - 10%, а между 50 и 100 - уже 100%, по CPU тоже разница видна невооруженным взглядом: http://screencast.com/t/h6kM7yDx
Ну, таблицы на 50+ колонок живут в легаси БД, где таки да, есть смысл сужать выборки. А в пределах до 50 я таких значений в разнице не наблюдал в своих тестах в SQL Server. Но дело давно было.

Андрей ПанфиловВ PostgreSQL, к примеру, по-умолчанию данные оседают в резалтсете
Мы всё ещё говорим об ORM. Вычитали RS в объекты и закрыли. Открытым в серверных решениях его держать нет смысла.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328500
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
Код: plsql
1.
SELECT '100 chars' AS A1, ... '100 chars' AS AN FROM DUAL CONNECT BY LEVEL < 1000000;


разница в скорости выборки между 2 и 20 колонками - 10%, а между 50 и 100 - уже 100%, по CPU тоже разница
Про ОРМ и пагинацию забыли.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328512
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВыборки далеко не всегда имеют единственную строку как результат.
Не понял утверждения. База шлет клиенту не по одной строчке, а как клиент захочет ( https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize(int)) в оракле значение по-умолчанию - 10. Если знать что резалтсет заведомо узкий, то строки можно упаковывать плотнее. В оракле разница между 1 и 10 на запросе "select '100 chars' from dual connect by level < 1000000" - порядок, что как бы ожидаемо. Причем разница получается исключительно засчет сети.

BlazkowiczАндрей Панфиловт.е. между 1 и 10 разница есть, а между 5 и 10 уже нет?

Не понял связи. Мой посыл в том что затраты на поиск и чтение не сопоставимы с разницей в передаче по сети 5 и 50 колонок.
У вас не предыдущей странице был вопрос: "Вы к нам на машине времени прямиком из 90х?". К вам вопрос: а вы из какого года прибыли? из 2000? Сейчас скорость IO у СУБД перекрывает скорость сетевых интерфейсов. Про поколоночное хранение в СУБД слышали что-нибудь? А про InMemory database?

BlazkowiczОбоснования не обнаружено. Вы указываете на то что разница должна быть. Таки - да, она есть. Но вы игнорируете тот факт что на фоне всех остальных накладных расходов на выполнения запроса ею можно принебречь.

Андрей Панфиловразница в скорости выборки между 2 и 20 колонками - 10%, а между 50 и 100 - уже 100%, по CPU тоже разница видна невооруженным взглядом: http://screencast.com/t/h6kM7yDx
Ну, таблицы на 50+ колонок живут в легаси БД, где таки да, есть смысл сужать выборки. А в пределах до 50 я таких значений в разнице не наблюдал в своих тестах в SQL Server. Но дело давно было.Так есть разница или нет? Может просто MSSQL не так хорошо работает как хотелось бы?

BlazkowiczМы всё ещё говорим об ORM. Вычитали RS в объекты и закрыли. Открытым в серверных решениях его держать нет смысла.И какой вывод я из этого должен сделать? Резалтсет читается некоторое время, можете с ходу сказать сколько запусков GC эти объекты переживут?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328542
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СурикатЕсть таблица Users в БД с полями:

Код: plsql
1.
2.
3.
id
name
someBigData



Содержимое таблицы: id пользователя, его имя и какое-то поле с данными большого объёма. (Полей на самом деле большое, плюс связи с другими таблицами и т.п., но мысль ясна)

Задачи:
1. Получать по конкретному id информацию о пользователе - т.е. выборка по всем полям и связанным таблицам.
2. Получать из БД список пользователей (скажем, 200 записей) - просто id и имя. Не хочется каждый раз, тащить большие объёмы данных и кучу связанных полей для списка пользователей, где нужны только имя и id.
id
Соответственно, завожу 2 Entity:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
public class User {
    private Long id;
    private String name;
}

@Entity
public class UserData extends User {
    private String someBigData;
}



Но, не совсем понимаю, как их замапить на БД. Если как @Inheritance(strategy = InheritanceType.SINGLE_TABLE), то везде в примерах говорится, что User должен быть абстрактным и не создавать инстансов. @MappedSuperclass не отображается на таблицу вообще, как я понял.

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


добрый день .
Вроде как тема орма поднималась .

советы тут уже были :

Ваша объектная модель пусть будет как вы ее описали со всеми зависимостями итд ...

чтобы эффективно писать на ОРМе и получать перфоманс именно от решения через ОРМ

для каждого своего запроса пишите dto и вытаскивайте их по вашей модели

Это дает вам полную свободу вы не завязаны на модель ентитей

Это избавит вас от проблем dirty Checking , лайзилоудинга итд ... от всех минусов Подхода работы с базой через орм.


может конечно возникнуть вопрос в чем тогда перфоманс от использования орма в таком подходе ?

Если нужно вводить новый слой dto и писать кучу типового кода итд ...

ответ - делайте так :) и не думайте , за вас уже подумали - такой подход это единственное оптимальное благо )

Как говорят ОРМ не для того чтобы извлекать данные из базы - орм для того чтобы их туда вставлять :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39328672
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловНе понял утверждения. База шлет клиенту не по одной строчке, а как клиент захочет
Ну, так это и не я предложил результаты запроса в один TCP пакет поместить.

Андрей ПанфиловУ вас не предыдущей странице был вопрос: "Вы к нам на машине времени прямиком из 90х?".
10 лет назад игровые high load сервера писали под кучи в 4Gb. Сейчас 64Gb для рабочей станции не проблема. Поэтому когда мне говорят о том что надо бы на полях экономить, я слегка охреневаю.

Андрей ПанфиловК вам вопрос: а вы из какого года прибыли? из 2000? Сейчас скорость IO у СУБД перекрывает скорость сетевых интерфейсов. Про поколоночное хранение в СУБД слышали что-нибудь? А про InMemory database?
Офигеть. Вы опять включили умника с кучей терминов, которые к вопросу отношения не имееют. Интерфейс с удаленной базой всегда был проблемой, даже в нулевых. Поэтому базу старались не отделять особо от middle tier. Но это становиться проблемой в нагруженом кластере, так как RDBMS одна и распределяется очень хреново, поэтому с ней нужен гигабитный интерфейс и желательно не один. Но, вашу ж мать, сейчас 10 гигабитный Ethernet не проблема. А вы собираетсь результаты запроса в пакеты укладывать.

А про "колоночное хранение" и прочую чушь, не надо тут. Мы всё ещё обсуждаем ORM, который пока что подразумевает классический RDBMS с нормализацией.

Андрей ПанфиловИ какой вывод я из этого должен сделать? Резалтсет читается некоторое время, можете с ходу сказать сколько запусков GC эти объекты переживут?
У меня ни одного не переживают. Почему у вас это барахло живет так долго, я не скажу.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328673
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1, хитро).
Т.е. в маппинге можно не заужать, а заузить кол-во колонок при передаче на клиента.
Я предлагал сразу третий вариант - пагинация на страницы.
Эффект тот же.
А вывод пока простой - сабж не стоит и 5 копеек для обсуждения.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328677
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1ответ - делайте так :) и не думайте , за вас уже подумали - такой подход это единственное оптимальное благо )

Хениально. Если бы все так делали, у нас бы сейчас не было, ни ORM, ни Dependency Injection. Ведь инженеры подумали и сочинили отличную J 2 EE спецификацию.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328795
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

от вас какие-то цифры можно будет дождаться или нет? я свои уже привел, при кручении правильных ручек только в жаве, разница между получением 2 и 20 колонок из базы - 4 раза, а ваши 10G - это всего лишь скорость линка, чтобы она в перфоманс материализовалась нужно еще ручки крутить.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328803
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловBlazkowicz,

от вас какие-то цифры можно будет дождаться или нет? я свои уже привел, при кручении правильных ручек только в жаве, разница между получением 2 и 20 колонок из базы - 4 раза, а ваши 10G - это всего лишь скорость линка, чтобы она в перфоманс материализовалась нужно еще ручки крутить.

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

Не сегодня.

Андрей Панфиловя свои уже привел, при кручении правильных ручек только в жаве, разница между получением 2 и 20 колонок из базы - 4 раза
Угу. Выкинули IO. Померяли не понятно что. Вышел синтетический тест, оторванный от реальности.

Андрей Панфилова ваши 10G - это всего лишь скорость линка, чтобы она в перфоманс материализовалась нужно еще ручки крутить.
Ох, уж эти детские мечты про "перформанс", который нужен гораздо меньше чем качественный, открытый к изменениям код и заложеная в архитектуру масштабируемость. 10 GB хватит для нормального взаимодействия любой RBDMS и middle tier реализованного без откровенных косяков. Можно ничего особо и не крутить. А когда нужно больше, то чаще встаёт вопрос про то подходит ли для этой задачи RDBMS в принципе.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328817
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловот вас какие-то цифры можно будет дождаться или нет?
легко.
- берём PL Developer для оракле
- пишем там 2 запроса
Код: java
1.
2.
select * from t; //79 полей
select id, sdate from t;


- первый 0,3 сек
- первый 0,07 сек
Дальше то что?
----
Это напоминает вопросы новичков в ветке Оракла: "Стоит ли таблицу в БД делить на две, если полей много?".
Но тут же не новички собрались)).
А вы с умным видом доказываете что то на физическом уровне, про хранение "листьев данных в СУБД".
Ответили бы уже на первый поста автору, да и Фсё))
...
Рейтинг: 0 / 0
JPA и наследование
    #39328819
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- первый 0,3 сек
- первый второй 0,07 сек
...
Рейтинг: 0 / 0
JPA и наследование
    #39328823
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,
ну, а если говорить о прикладном уровне и Качестве проектирования, то - вы не тем инструментом меряете ОРМ.
Т.е. погрешности вашего инструмента измерения покрывают сам результат.
Т.к. ОРМ для прикладников. А я в своих проектах ни разу не испытывал тормозов из-за КОЛИЧЕСТВА полей.
Это тут вам и втолковывают практики.
Удачи!
...
Рейтинг: 0 / 0
JPA и наследование
    #39328833
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУгу. Выкинули IO. Померяли не понятно что. Вышел синтетический тест, оторванный от реальности.
Вам никто не мешает описать "правильную" методику, только при этом не забывайте, что мы как бы в 2016 году живем, и воткнуть 512Gb памяти в СУБД особых проблем не составляет (хотя вру, сейчас писюки под 12Tb идут).

BlazkowiczОх, уж эти детские мечты про "перформанс", который нужен гораздо меньше чем качественный, открытый к изменениям код и заложеная в архитектуру масштабируемость.

Интересно, чем это заворачивание "мусора" в @Embeddable/Embedded начало влиять на качество кода и открытость к изменениям?

Blazkowicz10 GB хватит для нормального взаимодействия любой RBDMS и middle tier реализованного без откровенных косяков. Можно ничего особо и не крутить. А когда нужно больше, то чаще встаёт вопрос про то подходит ли для этой задачи RDBMS в принципе.
Возьмите для начала любой сетевой калькулятор, например https://www.switch.ch/network/tools/tcp_throughput/, и посмотрите какой throughput выдает TCP на 10G линке.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328842
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловИнтересно, чем это заворачивание "мусора" в @Embeddable/Embedded начало влиять на качество кода и открытость к изменениям?
Вы о чем вообще???
...
Рейтинг: 0 / 0
JPA и наследование
    #39328853
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1ответ - делайте так :) и не думайте , за вас уже подумали - такой подход это единственное оптимальное благо )

Хениально. Если бы все так делали, у нас бы сейчас не было, ни ORM, ни Dependency Injection. Ведь инженеры подумали и сочинили отличную J 2 EE спецификацию.

=) просто инженеры все еще думают надо EE ) а пока они думают мы используем спринг , и они (инженеры) так же его используют :)
...
Рейтинг: 0 / 0
JPA и наследование
    #39328877
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВы о чем вообще???вам лучше знать, про "качественный, открытый к изменениям код и заложеная в архитектуру масштабируемость" писал же не я, соответственно и возник вопрос каким образом сужение projection влияет на качество кода.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328897
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

утверждения "для ваших 200 записей вы видимого профита не получите" и "ширина выборки на производительность имеет совершенно никакого влияния" несут совершенно разную смысловую нагрузку, при этом второе не только неочевидно, да еще и нелогично, и, соответственно, требует хоть какого-то стройного подтверждения, а не чего-то в духе: "в жаву мы воткнем 512Gb памяти чтобы не париться из-за объемов, а в базу не будем - пусть страдает от I/O"
...
Рейтинг: 0 / 0
JPA и наследование
    #39328914
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловPetro123,

утверждения "для ваших 200 записей вы видимого профита не получите" и "ширина выборки на производительность имеет совершенно никакого влияния" несут совершенно разную смысловую нагрузку, при этом второе не только неочевидно, да еще и нелогично, и, соответственно, требует хоть какого-то стройного подтверждения, а не чего-то в духе: "в жаву мы воткнем 512Gb памяти чтобы не париться из-за объемов, а в базу не будем - пусть страдает от I/O"

нарвали фраз из контекста

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

довольно похоже не правда ли по смыслу

"в жаву мы воткнем 512Gb памяти чтобы не париться из-за объемов"
Недавно насчитал за 150-200тыр можно собрать 132Gb RAM, машинку (цена в пределах топового макбука)

"в базу не будем - пусть страдает от I/O" - об этом уже говорилось что чтение построчное (Postgres) разницы нет для DB читать одну колонку или все сразу
...
Рейтинг: 0 / 0
JPA и наследование
    #39328924
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingоб этом уже говорилось что чтение построчное (Postgres) разницы нет для DB читать одну колонку или все сразувы бы почитали про инструмент с которым вы работаете прежде чем утверждать что разницы нет: https://www.postgresql.org/docs/9.5/static/storage-toast.html
...
Рейтинг: 0 / 0
JPA и наследование
    #39328927
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловllemingоб этом уже говорилось что чтение построчное (Postgres) разницы нет для DB читать одну колонку или все сразувы бы почитали про инструмент с которым вы работаете прежде чем утверждать что разницы нет: https://www.postgresql.org/docs/9.5/static/storage-toast.html

читаю регулярно.
сразу второе предложение
Therefore, it is not possible to store very large field values directly.

тут уже где то говорилось что если large fields то делать их lazy.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328934
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingсразу второе предложение
Therefore, it is not possible to store very large field values directly.

тут уже где то говорилось что если large fields то делать их lazy.Давайте с первого предложения, а не со второго. Что там происходит если строка таблицы в блок не влезает?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328936
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostgreSQL uses a fixed page size (commonly 8 kB), and does not allow tuples to span multiple pages

дальше что?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328963
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingPostgreSQL uses a fixed page size (commonly 8 kB), and does not allow tuples to span multiple pages

дальше что?В вашем инструменте принципиально нельзя создать "широкую" таблицу (больше 8K) или-таки можно, но при этом будет использоваться TOAST вне зависимости от того есть в таблице "large fields" или нет?
...
Рейтинг: 0 / 0
JPA и наследование
    #39328990
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловllemingPostgreSQL uses a fixed page size (commonly 8 kB), and does not allow tuples to span multiple pages

дальше что?В вашем инструменте принципиально нельзя создать "широкую" таблицу (больше 8K) или-таки можно, но при этом будет использоваться TOAST вне зависимости от того есть в таблице "large fields" или нет?

можно создать таблицу где tuple должен поместиться в 8Kb, если есть large fields и tuple больше 8Kb то его выкинет в toast table. Если нет large fields то создать таблицу где tuple превысит 8Kb думаю не получится (а оно зачем в таблице иметь больше сотни колонок)

Anyway.
Стало интересно вот проверил и привожу циферки.

размер toast таблиц составляет 0.03% (не 3% а именно 0.03%) по отношению БД.
Таблиц где toast_read превышает количество head_read нет. Есть всего лишь одна таблица где общее количество toast_read достаточно велико в абсолютной величине (Правда если сравнить с head read тойже таблицы то уже не так и много). Да и то там полей то, тот самый large object, id т.е. уменьшить количество полей из выборки уже некуда.
...
Рейтинг: 0 / 0
JPA и наследование
    #39328991
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
head_read читать как heap_read
...
Рейтинг: 0 / 0
JPA и наследование
    #39329016
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingможно создать таблицу где tuple должен поместиться в 8Kb, если есть large fields и tuple больше 8Kb то его выкинет в toast table. Если нет large fields то создать таблицу где tuple превысит 8Kb думаю не получится (а оно зачем в таблице иметь больше сотни колонок)Ну вот у меня создает без проблем, 250 же не много совсем? (в DB2, к примеру так не получится - она заставит создавать таблицу в табличном пространстве с увеличенным размером блока, в Oracle можно или в другом табличном пространстве создавать или получить row chaining):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
postgres=# create table t (
postgres(#  a1 varchar(250),
postgres(#  a2 varchar(250),
postgres(#  a3 varchar(250),
postgres(#  a4 varchar(250),
postgres(#  a5 varchar(250),
postgres(#  a6 varchar(250),
postgres(#  a7 varchar(250),
postgres(#  a8 varchar(250),
postgres(#  a9 varchar(250),
postgres(#  a10 varchar(250),
postgres(#  a11 varchar(250),
postgres(#  a12 varchar(250),
postgres(#  a13 varchar(250),
postgres(#  a14 varchar(250),
postgres(#  a15 varchar(250),
postgres(#  a16 varchar(250),
postgres(#  a17 varchar(250),
postgres(#  a18 varchar(250),
postgres(#  a19 varchar(250),
postgres(#  a20 varchar(250),
postgres(#  a21 varchar(250),
postgres(#  a22 varchar(250),
postgres(#  a23 varchar(250),
postgres(#  a24 varchar(250),
postgres(#  a25 varchar(250),
postgres(#  a26 varchar(250),
postgres(#  a27 varchar(250),
postgres(#  a28 varchar(250),
postgres(#  a29 varchar(250),
postgres(#  a30 varchar(250),
postgres(#  a31 varchar(250),
postgres(#  a32 varchar(250),
postgres(#  a33 varchar(250),
postgres(#  a34 varchar(250),
postgres(#  a35 varchar(250),
postgres(#  a36 varchar(250),
postgres(#  a37 varchar(250),
postgres(#  a38 varchar(250),
postgres(#  a39 varchar(250),
postgres(#  a40 varchar(250)
postgres(# );
CREATE TABLE
postgres=# \dt t
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t    | table | postgres
(1 row)

postgres=# 



При этом про "сотню колонок" вы слегка лукавите, мы же не 90-х живем, и однобайтовые кодировки, слава богу, умерли, поэтому на utf8 блок в 8K превращается всего 4K символов (+/- служебная информация), а с utf16 вообще все печально получается.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329023
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов250 же не много совсем?
все поля текст по 250 - не жизненно.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329067
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловBlazkowiczВы о чем вообще???вам лучше знать, про "качественный, открытый к изменениям код и заложеная в архитектуру масштабируемость" писал же не я, соответственно и возник вопрос каким образом сужение projection влияет на качество кода.
Продолжайте нести ахинею. Смотрите не расплескайте по дороге. Удачи.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329073
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123все поля текст по 250 - не жизненно.При должном старании не проблема, однако посыл был несколько в другом, а именно в том, что при определенных условиях _в базе_ производительность-таки зависит от projection.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329078
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПродолжайте нести ахинею. Смотрите не расплескайте по дороге. Удачи.Не нужно так расстраиваться, просто покажите цифры как "ширина выборки не влияет на производительность", и делу конец. Какой смысл теоретизировать и высасывать умозаключения из пальца, если можно просто взять и измерить?
...
Рейтинг: 0 / 0
JPA и наследование
    #39329086
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловPetro123все поля текст по 250 - не жизненно.При должном старании не проблема, однако посыл был несколько в другом, а именно в том, что при определенных условиях _в базе_ производительность-таки зависит от projection.

на величину не сильно отличающуюся от нуля
...
Рейтинг: 0 / 0
JPA и наследование
    #39329088
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловНе нужно так расстраиваться, просто покажите цифры как "ширина выборки не влияет на производительность", и делу конец. Какой смысл теоретизировать и высасывать умозаключения из пальца, если можно просто взять и измерить?
Да, кто же расстраивается. Я просто больше не вижу смысла именно Вам что-то объяснять. У Вас в каждом сообщении факты вперемешку с чушью. Тратить время на выуживания ценной информации из потока вашего бреда надоело. Приплели какой-то @Embedded к архитектуре. С такой кашей в голове бесполезно соревноваться.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329090
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingна величину не сильно отличающуюся от нулятолько не в абстрактном PostgreSQL, а в вашей базе, на вашей схеме, на ваших данных.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329101
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДа, кто же расстраивается. Я просто больше не вижу смысла именно Вам что-то объяснять. У Вас в каждом сообщении факты вперемешку с чушью. Тратить время на выуживания ценной информации из потока вашего бреда надоело. Приплели какой-то @Embedded к архитектуре. С такой кашей в голове бесполезно соревноваться.Что значит какой-то? Это часть JPA-спецификации, чтобы не fetch=FetchType.LAZY у каждого поля ставить и таскаться с этим мусором, а выделить группу полей в отдельную сущность. Это вы "прилепили" "качественный, открытый к изменениям код и заложеная в архитектуру масштабируемость" к количеству колонок в projection, и каким образом это прилепилось выяснить так и не удалось.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329108
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловllemingна величину не сильно отличающуюся от нулятолько не в абстрактном PostgreSQL, а в вашей базе, на вашей схеме, на ваших данных.

А зачем мне оптимизировать абстрактную БД которая только у вас в голове и доступ к ней только у вас.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329115
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingА зачем мне оптимизировать абстрактную БД которая только у вас в голове и доступ к ней только у вас.Это ваши слова?

llemingоб этом уже говорилось что чтение построчное (Postgres) разницы нет для DB читать одну колонку или все сразу
...
Рейтинг: 0 / 0
JPA и наследование
    #39329121
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. А что там не так?
...
Рейтинг: 0 / 0
JPA и наследование
    #39329131
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

будет разница в производительность между чтением всех колонок из таблицы и только тех, что не попали в TOAST (мы вроде как выяснили что в TOAST попадают не только совсем уж здоровые колонки, а вообще все что в 8K блок не поместилось)?
...
Рейтинг: 0 / 0
JPA и наследование
    #39329153
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловlleming,
будет разница в производительность между чтением всех колонок из таблицы и только тех, что не попали в TOAST (мы вроде как выяснили что в TOAST попадают не только совсем уж здоровые колонки, а вообще все что в 8K блок не поместилось)?

это мы не выяснили, это вы так поняли. (вообще почитайте ссылку которую вы привели про toast таблицы)

так я вам привел пример реальные цифры.

в тоаст попадает только одня таблица их нескольких сотен.
паттерн ее использования говорит что не особо то даже из toast читается только наиболее длинные записи коих в процентном соотншении немного. уменьшать выборку колонок там уже некуда.

Т.е. разница возможно и есть, но никто ее не видел и измерить тоже не удается.



PS.
Оптимизация абстрактных БД (600р/ч)
...
Рейтинг: 0 / 0
JPA и наследование
    #39329184
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingТ.е. разница возможно и есть, но никто ее не видел и измерить тоже не удается. Почему не удается? Вот я беру оракл и специально делаю широкую таблицу, чтобы ее строки попадали в несколько блоков:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> create table t1 as 
select 
 lpad('x',4000,'x') a1, lpad('x',4000,'x') a2,
 lpad('x',4000,'x') a3, lpad('x',4000,'x') a4, 
 lpad('x',4000,'x') a5, lpad('x',4000,'x') a6 from dual
connect by level <= 1000;

Table created.



Чтение только первой колонки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> select a1 from t1;

1000 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  1000 |  3907K|   921   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |  1000 |  3907K|   921   (1)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
       3958  consistent gets
       6745  physical reads
          0  redo size
      26198  bytes sent via SQL*Net to client
       1278  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       1000  rows processed

SQL> 



чтение всех колонок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SQL> select * from t1;

1000 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  1000 |    22M|   921   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |  1000 |    22M|   921   (1)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       6727  consistent gets
       9960  physical reads
          0  redo size
   24113229  bytes sent via SQL*Net to client
       1278  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       1000  rows processed



чтение колонок из разных блоков:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SQL> select a1, a6 from t1;

1000 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  1000 |  7814K|   921   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |  1000 |  7814K|   921   (1)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       6727  consistent gets
       9780  physical reads
          0  redo size
      34280  bytes sent via SQL*Net to client
       1278  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       1000  rows processed



Разница есть, и я бы не сказал что она несущественная.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329196
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловРазница есть, и я бы не сказал что она несущественная.Смотрим в плане колонки стоимости: проц и время - одинаковы во всех вариантах.
За килобайты использованной памяти IBM-у уже никто не платит, на трафиковых тарифах канал к СУБД, обычно, не используют.
Ы?
...
Рейтинг: 0 / 0
JPA и наследование
    #39329220
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСмотрим в плане колонки стоимости: проц и время - одинаковы во всех вариантах.Наверное потому что plan hash value одинаковый, да? а вот разница в IO (physical reads и consistent gets) налицо.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329234
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот мерил на реале (Postgres)

и получилось (без сети)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
explain (analyze, timing)
select * from table_with_large_object limit 100;

explain (analyze, timing)
select 
  not_large_object1, 
  not_large_object2, 
  not_large_object3
from table_with_large_object limit 100;




Не вижу никакой разницы. Отсюда вывод что время выполнения запроса даже при наличинии toast table увеличивается на величину сравнимую с погрешностью доступа к диску, т.е на неизмеряемую величину.

Ваш абстрактный случай абсолютно неинтересный. Всего 1000 записей это ни очем, там всегда seq scan будет.
Если там 10млн строк то естесно будут сильно медленней.
НО тут возникает вопрос кому нахрен на клиенте 10млн строк нужно сразу да еще и с large objects (Мы же про хибернейт помним)?

А если это индекс скан то при извлечении строки
1 после поиска по индексу, чтение самой таблицы и только затем toast tаble
2 не факт что это строка попадет в toast (на реальных данных вот уменя с вероятность менее 50% попадает в toast )
3 а про то что и как в кэш попадет и как здесь повезет вообще может сильно резульат поменять (по дешевую память уже было)
...
Рейтинг: 0 / 0
JPA и наследование
    #39329245
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилова вот разница в IO (physical reads и consistent gets) налицо.До тех пор, пока ни то, ни другое не упёрлись в возможности хранилища - это пофигу.
Особенно с учётом того, что данных миллисекундной точности фактического времени выполнения запроса вы не приводите, общей загрузки базы - тоже не видно, а без этих данных невозможно понять - требуется оптимизация или опять будем яйца (Фаберже) полировать.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329320
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingя вот мерил на реале (Postgres)

и получилось (без сети)
Код: plsql
1.
explain (analyze, timing)


Вы уверены, что ваш прибор показывает правильные данные? на 8.4 analyze показывает полную фигню:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
тут попытка сгенерировать таблицу на 5Gb, она оказалась неудачной, потому что 5Gb не получилось

postgres=# create table t1 as select lpad('x',100,'x') as a1, lpad('x', 1024*1024, 'x') as a2 from generate_series(1,5*1024);
SELECT
postgres=# select sum(length(a2)) from t1;
    sum     
------------
 5368709120
(1 row)

postgres=# select sum(length(a2))/1024/1024/1024 from t1;
 ?column? 
----------
        5
(1 row)
-bash-4.1$ du -sh /var/lib/pgsql/data/
105M	/var/lib/pgsql/data/

здесь уже удачная попытка:

postgres=# create table t1 as select lpad('x',100,'x') as a1, 
                 (SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)) :: integer) 
                   FROM generate_series(1,1024*1024)), '')
                 ) as a2 from generate_series(1,5*1024);

-bash-4.1$ du -sh /var/lib/pgsql/data/
5.4G	/var/lib/pgsql/data/


А дальше analyze показывает чудеса:

postgres=# explain analyze select a1 from t1;
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=101) (actual time=0.004..0.851 rows=5120 loops=1)
 Total runtime: 1.200 ms
(2 rows)

postgres=# explain analyze select a2 from t1;
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.007..1.212 rows=5120 loops=1)
 Total runtime: 1.550 ms
(2 rows)

т.е. 5Gb якобы вычитывается за 1.5ms - памяти на виртуалке всего-то 1Gb, так что безумный вариант 
с кешированием и так отпадает, а вот уже более-менее реальные данные:

postgres=# explain analyze select sum(length(a2)) from t1;
                                                 QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=158.00..158.01 rows=1 width=18) (actual time=35787.137..35787.138 rows=1 loops=1)
   ->  Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.004..24.888 rows=5120 loops=1)
 Total runtime: 35790.589 ms
(3 rows)

...
Рейтинг: 0 / 0
JPA и наследование
    #39329336
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут наверное следует упомянуть что Postgres прежде чем в toast записывать сжимает данные и проверяет еще раз а стоит ли toast Записывать или просто tuple записать в page


т.е. строки типа 'xxxxxxxxxxxxxxxxxxxxxxxxxx........' очень хорошо сжимаются у меня файл 1.08Гб ужался до 1.2Мб
...
Рейтинг: 0 / 0
JPA и наследование
    #39329456
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

ну а с 5Gb "хороших" данных как быть? Ну ладно, установил 9.5 чтобы быть на одной волне:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
postgres=# explain (analyze,timing) select a1 from t1;
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=101) (actual time=0.008..1.311 rows=5120 loops=1)
 Planning time: 0.048 ms
 Execution time: 1.669 ms
(3 rows)

postgres=# explain (analyze,timing) select a2 from t1;
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.006..1.465 rows=5120 loops=1)
 Planning time: 0.064 ms
 Execution time: 1.794 ms
(3 rows)



и стало понятно почему вы не видите разницы: вы получаете какие-то два числа - "Planning time" и "Execution time", и на основе этих двух чисел делаете вывод. Проблема первая: что такое "Planning time" и "Execution time" никто не знает - из документации следует только то, что "Planning time" и "Execution time" - это нечто, что выводит команда explain, и здесь я готов согласиться, что projection не влияет на "Execution time", выводимый командой explain - эксперимент провели, явнойожидаемой корреляции не заметно (как экспериментатор я ожидал что цифры будут соответствовать количеству читаемых блоков, а они не соответствуют). Проблема вторая: "Execution time", выводимый командой explain, никакого отношения к производительности не имеет. Поясню. В Oracle execution time (что это такое в документации отражено: http://docs.oracle.com/cd/A97630_01/server.920/a96533/sqltrace.htm) для селектов почти всегда 0, потому что для селектов фаза execute подразумевает открытие курсора и получение текущего SCN, а вся работа происходит в фазе fetch (Retrieves rows returned by a query) и в PostgreSQL аналогично - ну не может он 5Gb данных вычитать за 1.5ms.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329458
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczАндрей ПанфиловК вам вопрос: а вы из какого года прибыли? из 2000? Сейчас скорость IO у СУБД перекрывает скорость сетевых интерфейсов. Про поколоночное хранение в СУБД слышали что-нибудь? А про InMemory database?
Офигеть. Вы опять включили умника с кучей терминов, которые к вопросу отношения не имееют. Интерфейс с удаленной базой всегда был проблемой, даже в нулевых. Поэтому базу старались не отделять особо от middle tier. Но это становиться проблемой в нагруженом кластере, так как RDBMS одна и распределяется очень хреново, поэтому с ней нужен гигабитный интерфейс и желательно не один. Но, вашу ж мать, сейчас 10 гигабитный Ethernet не проблема. А вы собираетсь результаты запроса в пакеты укладывать.

А про "колоночное хранение" и прочую чушь, не надо тут. Мы всё ещё обсуждаем ORM, который пока что подразумевает классический RDBMS с нормализацией.
Может вам к вендору сходить и рассказать какие там у него лохи сидят: Exadata Smart Scan Projection Limitation ?
...
Рейтинг: 0 / 0
JPA и наследование
    #39329597
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилови стало понятно почему вы не видите разницы: вы получаете какие-то два числа - "Planning time" и "Execution time", и на основе этих двух чисел делаете вывод. Проблема первая: что такое "Planning time" и "Execution time" никто не знает - из документации следует только то, что "Planning time" и "Execution time" - это нечто, что выводит команда explain, и здесь я готов согласиться, что projection не влияет на "Execution time", выводимый командой explain - эксперимент провели, явнойожидаемой корреляции не заметно (как экспериментатор я ожидал что цифры будут соответствовать количеству читаемых блоков, а они не соответствуют). Проблема вторая: "Execution time", выводимый командой explain, никакого отношения к производительности не имеет. Поясню. В Oracle execution time (что это такое в документации отражено: http://docs.oracle.com/cd/A97630_01/server.920/a96533/sqltrace.htm) для селектов почти всегда 0, потому что для селектов фаза execute подразумевает открытие курсора и получение текущего SCN, а вся работа происходит в фазе fetch (Retrieves rows returned by a query) и в PostgreSQL аналогично - ну не может он 5Gb данных вычитать за 1.5ms.

это в качестве нормы для сложного запроса прогнать expain (analyze, timing).

Если хотите узнать сколько будет читаться при этом блоков то
Код: plsql
1.
explain (analyze, buffers, timing) select a1 from t1;


И можно будет увидеть
" Buffers: shared hit=53" а это значит что 53 * 8 = 424Kb
Код: plsql
1.
select pg_size_pretty(pg_relation_size('t1'))


результат 424Kb


Цифры соотвествуют если у вас тысяча записей всего и т.к. никаких toast нет таблиц поскольку, данные сжимаются легко и непринужденно, такая таблица с 1000 записей у меня 424Kb весит и если у вас для postgres стоит по дефолту, вся умещается в кэше, о чем говорит shared hits.

По сути тут вы даже не меряете IO поскольку его и нет. Вся таблица в кэше это раз, большие данные сжаты здорово это два. Здесь измерено как быстро работает RAM и как быстро процессор может распраковать данные. Даже с IO, для для первого чтения это всего 54 страницы по 8Kb
милисекунды даже для HDD

"Planning time" - принято считать что парсинг запроса, валидация, построение AST.
"execution time" - как я понял это время от начала транзакции до ее завершения.

Пример к реальной жизни имеет малое отношение.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329605
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingПример к реальной жизни имеет малое отношение.
+1
и к теме про JPA тоже
...
Рейтинг: 0 / 0
JPA и наследование
    #39329620
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingэто в качестве нормы для сложного запроса прогнать expain (analyze, timing).

Если хотите узнать сколько будет читаться при этом блоков то
Код: plsql
1.
explain (analyze, buffers, timing) select a1 from t1;


И можно будет увидеть
" Buffers: shared hit=53" а это значит что 53 * 8 = 424Kb
Код: plsql
1.
select pg_size_pretty(pg_relation_size('t1'))


результат 424Kb


Цифры соотвествуют если у вас тысяча записей всего и т.к. никаких toast нет таблиц поскольку, данные сжимаются легко и непринужденно, такая таблица с 1000 записей у меня 424Kb весит и если у вас для postgres стоит по дефолту, вся умещается в кэше, о чем говорит shared hits.

Нет, данные не "пожаты" и не в кеше, потому что в итоге все (5Gb) забито рандомом, а на виртуалке всего 1Gb памяти - врет прибор:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
postgres=# explain (analyze, buffers, timing) select a1 from t1;
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=101) (actual time=1.244..8.651 rows=5120 loops=1)
   Buffers: shared hit=3 read=91
 Planning time: 2.092 ms
 Execution time: 9.198 ms
(4 rows)

postgres=# explain (analyze, buffers, timing) select sum(length(a1)) from t1;
                                                 QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=170.80..170.81 rows=1 width=101) (actual time=2.639..2.639 rows=1 loops=1)
   Buffers: shared hit=94
   ->  Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=101) (actual time=0.010..0.577 rows=5120 loops=1)
         Buffers: shared hit=94
 Planning time: 0.033 ms
 Execution time: 4.097 ms
(6 rows)



ок, вот здесь верим, а вот здесь уже не верим:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
postgres=# explain (analyze, buffers, timing) select a2 from t1;
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.008..0.677 rows=5120 loops=1)
   Buffers: shared hit=94
 Planning time: 0.026 ms
 Execution time: 0.947 ms
(4 rows)

postgres=# explain (analyze, buffers, timing) select sum(length(a2)) from t1;
                                                 QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=170.80..170.81 rows=1 width=18) (actual time=61799.367..61799.368 rows=1 loops=1)
   Buffers: shared hit=17925 read=680754
   ->  Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.007..60.218 rows=5120 loops=1)
         Buffers: shared hit=5 read=89
 Planning time: 0.031 ms
 Execution time: 61802.292 ms
(6 rows)



т.е. explain ограничивается чтением только заголовков, а не читает блоки полностью, точно такой же эффект при использовании octet_length:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
postgres=# explain (analyze, buffers, timing) select sum(octet_length(a2)) from t1;
                                                QUERY PLAN                                                 
-----------------------------------------------------------------------------------------------------------
 Aggregate  (cost=170.80..170.81 rows=1 width=18) (actual time=1.833..1.833 rows=1 loops=1)
   Buffers: shared hit=94
   ->  Seq Scan on t1  (cost=0.00..145.20 rows=5120 width=18) (actual time=0.008..0.724 rows=5120 loops=1)
         Buffers: shared hit=94
 Planning time: 0.035 ms
 Execution time: 1.863 ms
(6 rows)



нужно заставлять explain читать данные, чтобы они хоть как-то были похожи на правду:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
postgres=# explain (analyze, buffers, timing) select get_byte(a2::bytea,10000) from t1;
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..183.60 rows=5120 width=18) (actual time=13.539..51600.203 rows=5120 loops=1)
   Buffers: shared hit=17924 read=680755
 Planning time: 1.035 ms
 Execution time: 51613.460 ms
(4 rows)

postgres=# explain (analyze, buffers, timing) select get_byte(a2::bytea,10000),get_byte(a2::bytea,20000) from t1;
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..222.00 rows=5120 width=18) (actual time=12.059..65106.151 rows=5120 loops=1)
   Buffers: shared hit=716505 read=680759
 Planning time: 2.158 ms
 Execution time: 65122.336 ms
(4 rows)
...
Рейтинг: 0 / 0
JPA и наследование
    #39329657
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет не врет.
основная таблица всего 770кб.
поле a2 хранится в toast table в 5Gb

Код: plsql
1.
2.
select a1 from t1;
select sum(length(a1)) from t1;


Зачем здесь читать таблицу toast если эти данные не нужны? Достаточно прочитать 770Kb из кэша.

Код: plsql
1.
explain (analyze, buffers, timing) select sum(octet_length(a2)) from t1;


здесь быстро из за того что получить результат совсем необязательно читать данные, ведь у них нет получателя, а сколько байт в этом поле и так указано в метаданных. Вполне разумная оптимизация. В реале также и сделает postgres. Если и в реале и explain получаем одинаковый, всегда верный (наибыстрейшим способом) результат то как бэ в чем претензии?

Код: plsql
1.
explain (analyze, buffers, timing) select get_byte(a2::bytea,10000) from t1;


Здесь явно нужно преобразовать данные. А для этого нужно их достать с диска.


Код: plsql
1.
explain (analyze, buffers, timing) select a2 from t1;


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

Андрей Панфиловнужно заставлять explain читать данные, чтобы они хоть как-то были похожи на правду:


нет.
нужно читать что выводит explain и понимать почему так это произошло.


результаты хорошие предсказуемые.
все в порядке.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329849
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingвсе в порядке.что именно в порядке-то? вот смотрите что получается:
вы утверждаете, что в PostgreSQL производительность не зависит от projection (с оговоркой о широких колонках)

я утверждаю, что кроме широких колонок существуют еще широкие таблицы, и на таких таблицах эффект падения производительности вполне может иметь место быть (т.е. я беру референсную СУБД и наблюдаю там описываемый эффект и предлагаю вам воспроизвести)

вы берете прибор "explain", им что-то замеряете и получаете противоречивый (т.е. не соотносящийся с поведением референсной СУБД) результат

я показываю, что ваши измерения были проведены не верно

Наверное после этого следует провести измерения более правильным способом и убедиться в присутствии эффекта.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329908
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловllemingвсе в порядке.что именно в порядке-то? вот смотрите что получается:
вы утверждаете, что в PostgreSQL производительность не зависит от projection (с оговоркой о широких колонках)

я утверждаю, что кроме широких колонок существуют еще широкие таблицы, и на таких таблицах эффект падения производительности вполне может иметь место быть (т.е. я беру референсную СУБД и наблюдаю там описываемый эффект и предлагаю вам воспроизвести)

вы берете прибор "explain", им что-то замеряете и получаете противоречивый (т.е. не соотносящийся с поведением референсной СУБД) результат

я показываю, что ваши измерения были проведены не верно

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


В порядке значит когда результат предсказуемый. Тогда вполне понятно что можно ожидать.
А вот когда результат непонятный, непредсказуемый это плохо. Это значит что проблема есть и неизвестно какая.

1. Не зависит. С оговоркой в реальном мире и реальное падение производительности на реальных данных и даже в широких таблицах.
2. Существуют эффект падения незначительный, по сути соизмеримый с погрешностью измерения. Легко и просто нивелируемый словом Lazy при необходимости.
3. Я получил четкий, однозначный, предсказуемый результат. То что Вы не в состоянии осознать как пользоваться и интерпретировать результат expain, так читайте доки, у Postgres очень хорошая документация.
4. Не увидел где. Все верно в абсолюте. Я описал почему так происходит. Доки почему так проиходит можно найти на https://www.postgresql.org/docs/9.5/static/index.html
...
Рейтинг: 0 / 0
JPA и наследование
    #39329940
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы работаем с одной таблицей, то использование/неиспользование покрывающего индекса в запросе (что напрямую зависит от ширины выборки) дает рост производительности запроса в десятки раз минимум (на нормальных объемах данных). Если с несколькими - есть нюансы, но рост скорости на порядки также возможен. Здесь ширина выборки гораздо больше решает.
Однако некоторым здесь это кажется несущественным моментом на который нужно забить, и вспоминать только тогда, когда репорты с боевых установок начнут приходить.
...
Рейтинг: 0 / 0
JPA и наследование
    #39329964
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЕсли мы работаем с одной таблицей, то использование/неиспользование покрывающего индекса в запросе (что напрямую зависит от ширины выборки) дает рост производительности запроса в десятки раз минимум (на нормальных объемах данных). Если с несколькими - есть нюансы, но рост скорости на порядки также возможен. Здесь ширина выборки гораздо больше решает.
Однако некоторым здесь это кажется несущественным моментом на который нужно забить, и вспоминать только тогда, когда репорты с боевых установок начнут приходить.

возможно даже не только делать покрывающие индексы но и рефакторить БД, приложение
http://martinfowler.com/books/refactoringDatabases.html

Только эти индексы не мантра которую чем больше повторяешь тем быстрее БД работает.

Если навтыкать индексов в таблицу да еще foreing key в ней не один, то на инсертах и делетах БД начнет грустить и иногда печально посматривать в даль.
...
Рейтинг: 0 / 0
JPA и наследование
    #39330006
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк,
бла бла бла - одни слова
Локшин Марки вспоминать только тогда, когда репорты с боевых установок начнут приходить.
ты хоть раз ГУИ писал?
...
Рейтинг: 0 / 0
108 сообщений из 108, показаны все 5 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и наследование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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