2017-07-14 9 views
0
次の2行を追加した後にクエリがタイムアウト以下

またはそれの任意の単一のもののPostgres 9.4 SQLクエリのタイムアウト

AND final IS NOT NULL 
ORDER BY tmodified ASC 

クエリが出てもっとして10分を実行している....と時間続けます。

上記の2行を削除すると、1ミリ秒以内に結果が返されます。

上記の2行を以下のクエリでどのように動作させるにはどうすればよいですか?

表のtable_h 36万件のレコードを持っており、このテーブル

column final is numeric(10,5) 
column tmodified is bigint, Timestamp 

に私はここで

のPostgres 9.4を使用して完全なクエリでいます。

SELECT DISTINCT t.cid, h.a, am.b, u2.c, u.d, h.e, ie.f, im.g FROM table_am as am 
    INNER JOIN table_t as t on (t.id = am.id AND t.type = am.type) 
    INNER JOIN table_h AS h on h.iid = t.id 
    INNER JOIN table_u AS u ON u.id = h.uid 
    INNER JOIN table_u AS u2 ON u2.id = h.lu 
    INNER JOIN table_im AS im ON im.asid = am.sid 
    INNER JOIN table_ie AS ie ON ie.uid = u.uid 
    INNER JOIN table_g AS g ON g.id = h.oldid 
WHERE h.final >= 0 
    AND h.final IS NOT NULL 
    AND h.tmodified >= 1499903419 
    AND ie.p = im.p 
    AND h.sr IN ('x', 'y', 'z') 
    AND h.id = (SELECT id FROM table_h WHERE oldid = h.oldid AND final >= 0 
       AND final IS NOT NULL -- Issue is here and 
       ORDER BY tmodified ASC -- Issue is here 
       LIMIT 1) 
    AND h.id NOT IN (SELECT id FROM table_m WHERE tmodified > 1499903419) 
+0

3600万回3600万を何ですか?非常に大きな数字です。その相関サブクエリを取り除く必要があります。 –

+0

どのようなアイデア、どのように改善するのですか? – Developer

+0

クエリを書き直す必要があります。私の推測では、相関サブクエリを削除するだけで、クエリが完了できるようになります。 –

答えて

1

参加し、このようなもので相関サブクエリを交換してみてください:我々はまた、この使用して行番号または別の解析関数を表明している可能性が

SELECT ... 
FROM table_am as am 
... 
INNER JOIN table_g AS g ON g.id = h.oldid 
INNER JOIN 
(
    SELECT id, oldid, MIN(tmodified) AS min_mod 
    FROM table_h 
    WHERE final >= 0 AND final IS NOT NULL 
    GROUP BY id, oldid 
) t 
    ON h.id  = t.id AND 
     h.oldid = t.oldid AND 
     h.tmodified = t.min_mo 

注意、うまくいけば、これはあなたに場所を提供します始めること。

+0

tmodfiedはタイムスタンプです。最後に変更されたレコードが返されると思いますか? – Developer

+0

@Developerそれをキャッチするためにありがとう。 –

1

まあ、私はあなたの問題の半分を解決することができます。条件:

AND h.final IS NOT NULL 

は必要ありません。条件:

h.final >= 0 

がこれを考慮しています。

残りのクエリがこんなに早く返した場合、それまでにサブクエリまたはCTE、その後、順序を使用:すべてのテーブルには、問題を修正します伴う掃除

with cte as (
     select . . ., t.modified 
    ) 
select cte.* 
from cte 
order by modified; 
関連する問題