スキーマ: (疑似コード)
私は BaseEntity と呼ばれる Bean を持っています...
@Entity
class BaseEntity {
@OneToMany @CascadeType.ALL
List [Property] properties;
//the use angled braces ommited for the stackoverflow editor to show up properly
}
プロパティは別の豆です...
@Entity
class Property {
@ManyToOne
Category category;
@OneToOne
Value value;
}
Value は、実際には、Inheritence.SingleTable と、NumericalValue や DateValue などのサブクラスを含む抽象クラスであり、(抽象 Value クラスでは) @ManyToOne BaseType タイプです。
目標:
特定の名前のカテゴリを持つプロパティを持つ BaseEntity オブジェクトを選択し、それらのいくつかを選択して、指定されたプロパティのいずれかを持つオブジェクトを取得し、存在しないフィールドで null を取得するクエリを作成しようとしています。
試み:
select entity.id as id, foo as foo, bar as bar
from BaseEntity entity, Value foo, Value bar
where foo in (select p.value from Property p where p in elements(entity.properties) and p.category.name = 'FOO')
or bar in (select p.value from Property p where p in elements(entity.properties) and p.category.name = 'BAR')
このクエリは実行されます。現在、データベースには一致する BaseEntity が 1 つあり、foo の正しい結果が何度も得られますが、これには含まれていますが、同じエンティティが何度も繰り返され、bar フィールドに多くの値が含まれています。
また、実行に 5 分ほどかかり、データベースを使用している他のすべての人を遅らせます。
アイデア:
もちろん、ある種の個別の使用を検討しましたが、実行にかかる極端な時間には対応していません。何が起こっているのかよくわかりません。
同僚の皆さんが、より良いクエリ アプローチを提案してくれることを期待していました。どうもありがとう!
私はコメントしたでしょうが、このコードはコメント ボックスには長すぎます...クエリを実行しました。これはハングするほど長くはありませんが、それ以上結合すると完了する代わりにハングします...このクエリはかかります実行まで MINUTES。
コードからクエリを実行し、休止状態のプロパティで show_sql をオンにしました。
select baseentity0_.entityId as col_0_0_, property2_.value_valueId as col_1_0_, property4_.value_valueId as col_2_0_, property6_.value_valueId as col_3_0_, property8_.value_valueId as col_4_0_, property10_.value_valueId as col_5_0_, value11_.valueId as valueId9_0_, value12_.valueId as valueId9_1_, value13_.valueId as valueId9_2_, value14_.valueId as valueId9_3_, value15_.valueId as valueId9_4_, value11_.type_typeId as type6_9_0_, value11_.numericalValue as numerica3_9_0_, value11_.textValue as textValue9_0_, value11_.dateValue as dateValue9_0_, value11_.value_entityId as value7_9_0_, value11_.DTYPE as DTYPE9_0_, value12_.type_typeId as type6_9_1_, value12_.numericalValue as numerica3_9_1_, value12_.textValue as textValue9_1_, value12_.dateValue as dateValue9_1_, value12_.value_entityId as value7_9_1_, value12_.DTYPE as DTYPE9_1_, value13_.type_typeId as type6_9_2_, value13_.numericalValue as numerica3_9_2_, value13_.textValue as textValue9_2_, value13_.dateValue as dateValue9_2_, value13_.value_entityId as value7_9_2_, value13_.DTYPE as DTYPE9_2_, value14_.type_typeId as type6_9_3_, value14_.numericalValue as numerica3_9_3_, value14_.textValue as textValue9_3_, value14_.dateValue as dateValue9_3_, value14_.value_entityId as value7_9_3_, value14_.DTYPE as DTYPE9_3_, value15_.type_typeId as type6_9_4_, value15_.numericalValue as numerica3_9_4_, value15_.textValue as textValue9_4_, value15_.dateValue as dateValue9_4_, value15_.value_entityId as value7_9_4_, value15_.DTYPE as DTYPE9_4_ from BaseEntity baseentity0_ inner join BaseEntity_Property properties1_ on baseentity0_.entityId=properties1_.BaseEntity_entityId inner join Property property2_ on properties1_.properties_propertyId=property2_.propertyId inner join Value value11_ on property2_.value_valueId=value11_.valueId inner join BaseEntity_Property properties3_ on baseentity0_.entityId=properties3_.BaseEntity_entityId inner join Property property4_ on properties3_.properties_propertyId=property4_.propertyId inner join Value value12_ on property4_.value_valueId=value12_.valueId inner join BaseEntity_Property properties5_ on baseentity0_.entityId=properties5_.BaseEntity_entityId inner join Property property6_ on properties5_.properties_propertyId=property6_.propertyId inner join Value value13_ on property6_.value_valueId=value13_.valueId inner join BaseEntity_Property properties7_ on baseentity0_.entityId=properties7_.BaseEntity_entityId inner join Property property8_ on properties7_.properties_propertyId=property8_.propertyId inner join Value value14_ on property8_.value_valueId=value14_.valueId inner join BaseEntity_Property properties9_ on baseentity0_.entityId=properties9_.BaseEntity_entityId inner join Property property10_ on properties9_.properties_propertyId=property10_.propertyId inner join Value value15_ on property10_.value_valueId=value15_.valueId, Category category16_, Category category17_, Category category18_, Category category19_, Category category20_ where property2_.category_categoryId=category16_.categoryId and property4_.category_categoryId=category17_.categoryId and property6_.category_categoryId=category18_.categoryId and property8_.category_categoryId=category19_.categoryId and property10_.category_categoryId=category20_.categoryId and category16_.name='Sample Name / Strain' and category17_.name='Item #' and category18_.name='THC_Result' and category19_.name='CBD_Result' and category20_.name='CBN_Result'
さて、フォローアップして、2 つの結合ステートメントで見事に機能したものが、5 つの結合ステートメントではとてつもなく遅くなることを言いたかったのです。
select
entity.id as entityId,
strain.value as name,
item.value as itemNum,
thc.value as THC,
cbd.value as CBD,
cbn.value as CBN
from BaseEntity as entity
join entity.properties as strain
join entity.properties as item
join entity.properties as thc
join entity.properties as cbd
join entity.properties as cbn
where strain.category.name = 'Sample Name / Strain'
and item.category.name = 'Item #'
and thc.category.name = 'THC_Result'
and cbd.category.name = 'CBD_Result'
and cbn.category.name = 'CBN_Result'
私の愚かなスキーマでより速くなるより良い方法についての提案はありますか?