eclipselink jpaは、COUNT(*)の代わりにCOUNT(id)を使用してカウントクエリを生成します

redguy

Eclipselink、Spring Data、Postgresqlを使用しています。私のプロジェクトでは、SpringDataリポジトリによって提供されるページ結果を使用すると、次のようなクエリがあることに気付きました。

SELECT COUNT(id) 
FROM table 
WHERE [part generated according to specification]

ここで、「id」は「table」の主キーです。Explainを掘り下げると、非常に大きなテーブルの場合、COUNT(id)はCOUNT(よりも約10倍遅いことに気付きました(count(id)は「id」列でnull以外の値を探しますが、count()は単に一致する行数を返します基準)、count(*)もインデックスを利用できますが、count(id)は利用できません。

SpringDataの基本リポジトリクラスをトレースしましたが、このクエリの生成はJPA実装のみが担当しているようです。

  1. より高速なCOUNT(*)の代わりにcount(id)を使用する理由は何ですか?
  2. この動作を変更できますか(とにかく、既存のコンポーネントを拡張することもできます)?

助けていただければ幸いです

-[編集]-

机がある:

\d ord_order
                                       Table "public.ord_order"
         Column          |           Type            |                       Modificators
-------------------------+--------------------------+----------------------------------------------------------
 id                      | integer                  | NOT NULL DEFAULT nextval('ord_order_id_seq'::regclass)
 test_order              | boolean                  | DEFAULT false
...
Indexes:
    "pk_order" PRIMARY KEY, btree (id)
    "idx_test_order" btree (test_order)



# explain SELECT COUNT(*) FROM ord_order WHERE (test_order = false);
                                QUERY PLAN
--------------------------------------------------------------------------
 Aggregate  (cost=89898.79..89898.80 rows=1 width=0)
   ->  Index Only Scan using idx_test_order on ord_order  (cost=0.43..85375.37 rows=1809366 width=0)
         Index Cond: (test_order = false)
         Filter: (NOT test_order)
(4 wiersze)



# explain SELECT COUNT(id) FROM ord_order WHERE (test_order = false);
                                QUERY PLAN
--------------------------------------------------------------------------
 Aggregate  (cost=712924.52..712924.53 rows=1 width=4)
   ->  Seq Scan on ord_order  (cost=0.00..708401.10 rows=1809366 width=4)
         Filter: (NOT test_order)
(3 wiersze)

現在、違いは〜90k対〜713kであり、インデックススキャンとフルスキャンの違いです。

redguy

私は、カスタムのSpring DataRepository基本クラスの実装とその実装を使用したファクトリを提供することができました。結果として、生成されたカウントクエリは次の形式になります。

SELECT COUNT(1) FROM table

COUNT(*)と同じプランです。これは優れたソリューションのようであり、アプリケーションで定義されているすべてのリポジトリに対してグローバルに機能します。

COUNT(*)を生成する方法がわかりませんでした。COUNT関数はパラメーターとしていくつかの式を予期し、静的な値を指定できるため、COUNT(1)ははるかに簡単でした-1

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Eclipselink JPA onetomany relationship

分類Dev

EclipseLinkの使用

分類Dev

EclipseLinkの@Cache

分類Dev

OracleのSpringData JPA + EclipseLink

分類Dev

OracleのSpringData JPA + EclipseLink

分類Dev

JPAのHibernateまたはEclipseLink?

分類Dev

EclipseLink - 条件クエリ (JPA) を使用したサブクエリ

分類Dev

EclipseLinkを使用してJPAの主キーに文字を追加する

分類Dev

@Version の JPA/EclipseLink 処理

分類Dev

Eclipselink:バッチ読み取りは多くのクエリを作成します

分類Dev

Eclipselink JPAを使用して(IDではなく)コードで2つのオブジェクトをリンクする

分類Dev

EclipseでのEclipseLink(MOXy)の使用

分類Dev

EJB + EclipseLinkまたはSpring + Hibernate

分類Dev

Authentication error with JPA 2.0 and EclipseLink 2.0

分類Dev

BatchFetchType.INヒントを使用しても、JPA / Eclipselinkが冗長データベースクエリを実行するのはなぜですか?

分類Dev

JPQL:EclipseLinkとHibernateの違い

分類Dev

EclipseLink2.7.0の構築方法

分類Dev

LuceneとEclipseLinkの統合

分類Dev

EntityManager JPA EclipseLinkを使用してエンティティを更新する

分類Dev

EclipseLink、JPA、Mysqlは自動コミットをオフにします

分類Dev

EclipseLinkを使用したHibernate検索

分類Dev

MongoDBjava.lang.ClassCastExceptionを使用したEclipselink

分類Dev

EclipseLinkは、OraclePlattformの終了ステートメントを生成しません

分類Dev

eclipselink jql を使用して日付から年、マウント、日を抽出する

分類Dev

weblogicでeclipselinkの代わりにhibernateを使用するにはどうすればよいですか?

分類Dev

jpa / EclipseLinkがテーブルを作成した後にSQLスクリプトを実行しますか?

分類Dev

Eclipselink / JPAでエンティティタイプを変更しますか?

分類Dev

Linking two object by code (not ID) using Eclipselink JPA

分類Dev

EclipseLink JPA-persistence.xmlの場所

Related 関連記事

  1. 1

    Eclipselink JPA onetomany relationship

  2. 2

    EclipseLinkの使用

  3. 3

    EclipseLinkの@Cache

  4. 4

    OracleのSpringData JPA + EclipseLink

  5. 5

    OracleのSpringData JPA + EclipseLink

  6. 6

    JPAのHibernateまたはEclipseLink?

  7. 7

    EclipseLink - 条件クエリ (JPA) を使用したサブクエリ

  8. 8

    EclipseLinkを使用してJPAの主キーに文字を追加する

  9. 9

    @Version の JPA/EclipseLink 処理

  10. 10

    Eclipselink:バッチ読み取りは多くのクエリを作成します

  11. 11

    Eclipselink JPAを使用して(IDではなく)コードで2つのオブジェクトをリンクする

  12. 12

    EclipseでのEclipseLink(MOXy)の使用

  13. 13

    EJB + EclipseLinkまたはSpring + Hibernate

  14. 14

    Authentication error with JPA 2.0 and EclipseLink 2.0

  15. 15

    BatchFetchType.INヒントを使用しても、JPA / Eclipselinkが冗長データベースクエリを実行するのはなぜですか?

  16. 16

    JPQL:EclipseLinkとHibernateの違い

  17. 17

    EclipseLink2.7.0の構築方法

  18. 18

    LuceneとEclipseLinkの統合

  19. 19

    EntityManager JPA EclipseLinkを使用してエンティティを更新する

  20. 20

    EclipseLink、JPA、Mysqlは自動コミットをオフにします

  21. 21

    EclipseLinkを使用したHibernate検索

  22. 22

    MongoDBjava.lang.ClassCastExceptionを使用したEclipselink

  23. 23

    EclipseLinkは、OraclePlattformの終了ステートメントを生成しません

  24. 24

    eclipselink jql を使用して日付から年、マウント、日を抽出する

  25. 25

    weblogicでeclipselinkの代わりにhibernateを使用するにはどうすればよいですか?

  26. 26

    jpa / EclipseLinkがテーブルを作成した後にSQLスクリプトを実行しますか?

  27. 27

    Eclipselink / JPAでエンティティタイプを変更しますか?

  28. 28

    Linking two object by code (not ID) using Eclipselink JPA

  29. 29

    EclipseLink JPA-persistence.xmlの場所

ホットタグ

アーカイブ