3

サブクエリを実行し、その結果を内部結合してクエリを生成したいと思います。内部結合クエリをテストしたので、これを実行したいと思います。MySql では、ストレート IN サブクエリと比較してはるかにパフォーマンスが高いようです。

以下は、私が再現しようとしているタイプの sql の非常に基本的な例です。

テーブル

アイテム

  • アイテム ID
  • 名前

項目関係

  • アイテム ID
  • 関係 ID

作成したいSqlの例

名前が「bob」の ITEM の RELATION の数を教えてください:

select ir.itemId, count(ir.relationId)
  from ItemRelations ir
    inner join (select itemId from Items where name = 'bob') sq
    on ir.itemId = sq.itemId
  group by ir.itemId

ベース Nhibernate QueryOver

var bobItems = QueryOver.Of<Item>(() => itemAlias)
  .Where(() => itemAlias.Name == "bob")
  .Select(Projections.Id());

var bobRelationCount = session.QueryOver<ItemRelation>(() => itemRelationAlias)
   .Inner.Join(/* Somehow join the detached criteria here on the itemId */)
   .SelectList(
      list =>
        list.SelectGroup(() => itemRelationAlias.ItemId)
          .WithAlias(() => itemRelationCountAlias.ItemId)
        .SelectCount(() => itemRelationAlias.ItemRelationId)
          .WithAlias(() => itemRelationCountAlias.Count))
   .TransformUsing(Transformers.AliasToBean<ItemRelationCount>())
   .List<ItemRelationCount>();

これを単一のクエリにリファクタリングできる可能性があることはわかっていますが、上記は単純な例にすぎません。分離された QueryOver を変更することはできません。これは、私のコードに渡され、システムの他の部分で使用されているためです。

切り離された基準で内部結合を実行できるかどうかは誰にもわかりませんか?

4

1 に答える 1

0

MySql 5.6.5 では、クエリ構造に関連するパフォーマンスの問題が解決されました。

ここを参照してください: http://bugs.mysql.com/bug.php?id=42259

NHibernate クエリの出力形式を変更する必要はもうありません。:)

于 2013-03-26T16:43:28.733 に答える