0

時間がかかりすぎるpostgresqlデータベースのクエリがあり、高速化するためにインデックスを追加したいのですが、どのフィールドをインデックスに含める必要があるのか​​ わかりません。それらは外部キーです。

私は休止状態を使用しており、HQL クエリは次のとおりです。

SELECT i FROM Item i 
LEFT JOIN i.model.kind AS k 
LEFT JOIN i.model.kind.subkind AS s
WHERE i.file is null " +
AND i.identifier is not null
AND i.identifier != ''
AND i.place is not null 
AND i.place.id = :placeId
AND ( upper(i.serial) LIKE upper(:keyword)
    OR upper(i.code)  LIKE upper(:keyword)
    OR upper(i.law.law)  LIKE upper(:keyword) 
    OR upper(i.model.model)  LIKE upper(:keyword) 
    OR upper(k.kind)  LIKE upper(:keyword) 
    OR upper(s.subkind)  LIKE upper(:keyword) 
    OR upper(i.model.factory.factory) LIKE upper(:keyword) 
)
ORDER BY i.code, i.id

データベースのスキーマは、以下に示すようなモデルから自動的に生成されます。

インデックスにはどのフィールドを含める必要がありますか?

ありがとう。

public class Item {
    @Id
    private Long id;

    private String identifier;
    private String code;
    private String serial;

    @ManyToOne
    private File file;

    @ManyToOne
    private Law law;

    @ManyToOne
    private Place place;

    @ManyToOne
    private Model model;
}

public class File {
    @Id
    private Long id;
    private String file;
}

public class Law {
    @Id
    private Long id;
    private String law;
}

public class Place {
    @Id
    private Long id;
    private String place;
}   

public class Model {
    @Id
    private Long id;

    private String model;

    @ManyToOne
    private Factory factory;

    @ManyToOne
    private Kind kind;
}

public class Factory {
    @Id
    private Long id;

    private String factory;
}   

public class Kind {
    @Id
    private Long id;

    private String kind;

    @ManyToOne
    private Subkind subkind;
}

public class Subkind {
    @Id
    private Long id;

    private String subkind;
}
4

1 に答える 1

1

ネストされた全文検索でパフォーマンスの問題が発生している場合は、Hibernate Search に飛び込むことをお勧めします。

Hibernate 検索 (Lucene を使用) により、ネストされたオブジェクトのプロパティに対しても、高速で効率的なフルテキスト検索が可能になります。

現在のクエリを見ると、両側にテキストプレースホルダーを配置すると、Postgresql はインデックスを使用しない場合があります (%keyword% はキーワード% と同じ実行プランを使用しません)。

于 2012-07-11T11:43:10.867 に答える