:jsonb?&演算子を使用すると、クエリが非常に遅くなります

デビッド

私は高速に動作する次のSQLクエリを持っています

select
   phone_number.id,
   phone_number.phone_number,
   phone_number.account_id,
   phone_number.used AS used,
   (
      now() AT TIME ZONE account.timezone
   )
   ::time AS local_time 
from
   phone_number 
   INNER JOIN
      account 
      ON account.id = phone_number.account_id 
where
   phone_number.used = false 
   AND phone_number.account_id IN 
   (
      SELECT
         phone_number.account_id 
      FROM
         phone_number 
      WHERE
         insert_timestamp < (now() - interval '10 hours')
   )
   AND 
   (
      now() AT TIME ZONE account.timezone
   )
   ::time BETWEEN 
   CASE
      WHEN
         EXTRACT(DOW 
FROM
   now() AT TIME ZONE account.timezone) IN 
   (
      6,
      0
   )
THEN
   '15:30'::time 
ELSE
   '17:30'::time 
   END
AND '22:10'::time 
order by
   random() limit 1

しかし、これを追加するとaccount.residence_details::jsonb ?& array['city', 'state', 'streetName']、完全なクエリが

select
   phone_number.id,
   phone_number.phone_number,
   phone_number.account_id,
   phone_number.used AS used,
   (
      now() AT TIME ZONE account.timezone
   )
   ::time AS local_time 
from
   phone_number 
   INNER JOIN
      account 
      ON account.id = phone_number.account_id 
where
   phone_number.used = false 
   AND phone_number.account_id IN 
   (
      SELECT
         phone_number.account_id 
      FROM
         phone_number 
      WHERE
         insert_timestamp < (now() - interval '10 hours')
   )
   AND 
   (
      now() AT TIME ZONE account.timezone
   )
   ::time BETWEEN 
   CASE
      WHEN
         EXTRACT(DOW 
FROM
   now() AT TIME ZONE account.timezone) IN 
   (
      6,
      0
   )
THEN
   '15:30'::time 
ELSE
   '17:30'::time 
   END
AND '22:10'::time 
   AND account.residence_details::jsonb ?& array['city', 'state', 'streetName'] 
order by
   random() limit 1

クエリの完了には約1分かかります

以下はEXPLAIN ANALYZEWITHOUTクエリ用ですaccount.residence_details::jsonb ?& array['city', 'state', 'streetName']

Limit  (cost=15795.97..15795.97 rows=1 width=45) (actual time=382.995..382.995 rows=0 loops=1)
  ->  Sort  (cost=15795.97..15796.18 rows=85 width=45) (actual time=382.993..382.993 rows=0 loops=1)
        Sort Key: (random())
        Sort Method: quicksort  Memory: 25kB
        ->  Nested Loop  (cost=8742.24..15795.54 rows=85 width=45) (actual time=382.640..382.640 rows=0 loops=1)
              Join Filter: (phone_number.account_id = account.id)
              ->  Hash Join  (cost=8741.96..15403.38 rows=850 width=37) (actual time=347.011..368.677 rows=2099 loops=1)
                    Hash Cond: (phone_number.account_id = phone_number_1.account_id)
                    ->  Seq Scan on phone_number  (cost=0.00..6649.74 rows=850 width=29) (actual time=14.499..33.591 rows=2453 loops=1)
                          Filter: (NOT used)
                          Rows Removed by Filter: 190152
                    ->  Hash  (cost=8629.44..8629.44 rows=9001 width=8) (actual time=332.368..332.369 rows=9581 loops=1)
                          Buckets: 16384  Batches: 1  Memory Usage: 503kB
                          ->  HashAggregate  (cost=8539.43..8629.44 rows=9001 width=8) (actual time=320.550..326.757 rows=9581 loops=1)
                                Group Key: phone_number_1.account_id
                                ->  Seq Scan on phone_number phone_number_1  (cost=0.00..8067.05 rows=188955 width=8) (actual time=0.010..169.126 rows=191615 loops=1)
                                      Filter: (insert_timestamp < (now() - '10:00:00'::interval))
                                      Rows Removed by Filter: 990
              ->  Index Scan using account_id_idx on account  (cost=0.29..0.45 rows=1 width=25) (actual time=0.006..0.006 rows=0 loops=2099)
                    Index Cond: (id = phone_number_1.account_id)
                    Filter: (((timezone(timezone, now()))::time without time zone <= '22:10:00'::time without time zone) AND ((timezone(timezone, now()))::time without time zone >= CASE WHEN (date_part('dow'::text, timezone(timezone, now())) = ANY ('{6,0}'::double precision[])) THEN '15:30:00'::time without time zone ELSE '17:30:00'::time without time zone END))
                    Rows Removed by Filter: 1
Planning time: 2.025 ms
Execution time: 383.794 ms

以下はEXPLAIN ANALYZEaccount.residence_details::jsonb ?& array['city', 'state', 'streetName']

Limit  (cost=15916.82..15916.83 rows=1 width=45) (actual time=258768.686..258768.696 rows=1 loops=1)
  ->  Sort  (cost=15916.82..15916.83 rows=1 width=45) (actual time=258768.684..258768.685 rows=1 loops=1)
        Sort Key: (random())
        Sort Method: top-N heapsort  Memory: 25kB
        ->  Nested Loop Semi Join  (cost=0.29..15916.81 rows=1 width=45) (actual time=495.076..258755.141 rows=1715 loops=1)
              Join Filter: (account.id = phone_number_1.account_id)
              Rows Removed by Join Filter: 167271743
              ->  Nested Loop  (cost=0.29..7634.96 rows=1 width=54) (actual time=65.620..229.670 rows=1737 loops=1)
                    ->  Seq Scan on phone_number  (cost=0.00..6649.74 rows=850 width=29) (actual time=59.234..98.326 rows=3772 loops=1)
                          Filter: (NOT used)
                          Rows Removed by Filter: 190333
                    ->  Index Scan using account_id_idx on account  (cost=0.29..1.16 rows=1 width=25) (actual time=0.029..0.029 rows=0 loops=3772)
                          Index Cond: (id = phone_number.account_id)
                          Filter: ((residence_details ?& '{city,state,streetName}'::text[]) AND ((timezone(timezone, now()))::time without time zone <= '22:10:00'::time without time zone) AND ((timezone(timezone, now()))::time without time zone >= CASE WHEN (date_part('dow'::text, timezone(timezone, now())) = ANY ('{6,0}'::double precision[])) THEN '15:30:00'::time without time zone ELSE '17:30:00'::time without time zone END))
                          Rows Removed by Filter: 1
              ->  Seq Scan on phone_number phone_number_1  (cost=0.00..8067.05 rows=188955 width=8) (actual time=0.004..87.357 rows=96300 loops=1737)
                    Filter: (insert_timestamp < (now() - '10:00:00'::interval))
                    Rows Removed by Filter: 21
Planning time: 1.712 ms
Execution time: 258768.781 ms

追加した後、なぜそんなに遅くなるのか理解できません account.residence_details::jsonb ?& array['city', 'state', 'streetName']

ローレンツアルベ

追加の条件により、PostgreSQLは最初の結合の結果カウントを過小評価するため、2番目の結合にネストされたループが誤って選択され、そこですべての時間が費やされます。

たぶん、式のインデックスは、より良い見積もりを得るのに役立つでしょう:

CREATE INDEX ON account USING gin (residence_details::jsonb);
ANALYZE account;  -- to calculate statistics for the indexed expression

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Eloquent whereNotInを使用すると、クエリが非常に遅くなります

分類Dev

余分なmatch句を使用すると、neo4jクエリが非常に遅くなります

分類Dev

format date関数を使用すると、SQLクエリの実行が非常に遅くなります

分類Dev

Google Cloudに画像をリクエストすると、ページが非常に遅くなります

分類Dev

SQL SERVERクエリを少し変更すると、実行時間が非常に遅くなります

分類Dev

Electronを使用している間、MongoDb接続の初期化とクエリは非常に遅くなります

分類Dev

MYSQLクエリはPHPを使用すると非常に遅くなりますが、phpMyAdminとコマンドラインでは高速です

分類Dev

非常に奇妙な-複合インデックスを追加すると、クエリが非常に遅くなります(MongoDB)

分類Dev

count(*)と内部結合を使用するとクエリが遅くなります

分類Dev

参加すると、Postgresサブクエリの実行速度が非常に遅くなります

分類Dev

追加の列が追加されると、CROSSAPPLYクエリが非常に遅くなります

分類Dev

2つの非常に高速で単純なクエリは、マージすると非常に遅くなります

分類Dev

ui-gridを使用すると、Md-tabが非常に遅くなります

分類Dev

$ sortを使用すると、MongoDBでクエリが遅くなります

分類Dev

コンマ演算子を使用するとコードが遅くなりますか?

分類Dev

結果の各行に対してCOUNT(id)を実行しようとすると、クエリが非常に遅くなります

分類Dev

SQL(Snowflake)結合で「または」を使用すると、クエリが非常に遅くなるのはなぜですか?

分類Dev

多くの制約を追加すると、PuLPが非常に遅くなります

分類Dev

ハードコードされた整数値と比較して、整数変数を使用する場合、Linq toSQLクエリは非常に遅くなります

分類Dev

クエリが非常に遅くなる原因の解釈に問題があります

分類Dev

INの代わりにINNERJOINを使用しても、MySQLクエリは非常に遅くなります

分類Dev

Wordpressのカスタムメタクエリ検索は、OR関係にあると非常に遅くなります

分類Dev

argsを使用して別のODEでODEを使用すると、コードが非常に遅くなります

分類Dev

IE Webdriverを使用すると、破片の塗りつぶし機能が非常に遅くなります

分類Dev

SessionStateProvidorをRedisに切り替えると、Webアプリが非常に遅くなります

分類Dev

別のWHEREパラメータを追加した後、PHPMysqlクエリが非常に遅くなります

分類Dev

プリフェッチ関連の前に「のみ」を追加すると、クエリが遅くなります

分類Dev

IN演算子を使用してjsonb配列をクエリする方法

分類Dev

組み合わせ属性を使用すると、VisualStudioでNUnitが非常に遅くなります

Related 関連記事

  1. 1

    Eloquent whereNotInを使用すると、クエリが非常に遅くなります

  2. 2

    余分なmatch句を使用すると、neo4jクエリが非常に遅くなります

  3. 3

    format date関数を使用すると、SQLクエリの実行が非常に遅くなります

  4. 4

    Google Cloudに画像をリクエストすると、ページが非常に遅くなります

  5. 5

    SQL SERVERクエリを少し変更すると、実行時間が非常に遅くなります

  6. 6

    Electronを使用している間、MongoDb接続の初期化とクエリは非常に遅くなります

  7. 7

    MYSQLクエリはPHPを使用すると非常に遅くなりますが、phpMyAdminとコマンドラインでは高速です

  8. 8

    非常に奇妙な-複合インデックスを追加すると、クエリが非常に遅くなります(MongoDB)

  9. 9

    count(*)と内部結合を使用するとクエリが遅くなります

  10. 10

    参加すると、Postgresサブクエリの実行速度が非常に遅くなります

  11. 11

    追加の列が追加されると、CROSSAPPLYクエリが非常に遅くなります

  12. 12

    2つの非常に高速で単純なクエリは、マージすると非常に遅くなります

  13. 13

    ui-gridを使用すると、Md-tabが非常に遅くなります

  14. 14

    $ sortを使用すると、MongoDBでクエリが遅くなります

  15. 15

    コンマ演算子を使用するとコードが遅くなりますか?

  16. 16

    結果の各行に対してCOUNT(id)を実行しようとすると、クエリが非常に遅くなります

  17. 17

    SQL(Snowflake)結合で「または」を使用すると、クエリが非常に遅くなるのはなぜですか?

  18. 18

    多くの制約を追加すると、PuLPが非常に遅くなります

  19. 19

    ハードコードされた整数値と比較して、整数変数を使用する場合、Linq toSQLクエリは非常に遅くなります

  20. 20

    クエリが非常に遅くなる原因の解釈に問題があります

  21. 21

    INの代わりにINNERJOINを使用しても、MySQLクエリは非常に遅くなります

  22. 22

    Wordpressのカスタムメタクエリ検索は、OR関係にあると非常に遅くなります

  23. 23

    argsを使用して別のODEでODEを使用すると、コードが非常に遅くなります

  24. 24

    IE Webdriverを使用すると、破片の塗りつぶし機能が非常に遅くなります

  25. 25

    SessionStateProvidorをRedisに切り替えると、Webアプリが非常に遅くなります

  26. 26

    別のWHEREパラメータを追加した後、PHPMysqlクエリが非常に遅くなります

  27. 27

    プリフェッチ関連の前に「のみ」を追加すると、クエリが遅くなります

  28. 28

    IN演算子を使用してjsonb配列をクエリする方法

  29. 29

    組み合わせ属性を使用すると、VisualStudioでNUnitが非常に遅くなります

ホットタグ

アーカイブ