2017-06-15 10 views
0

データベースを検索して特定の問題に挿入された同じテーブル内の2つのレコードを検索しようとしています。これは、システムでいくつかの最適化が行われなければならない場所を教えてくれるでしょう。同じテーブルの2つのレコード間の結合を最適化する

私は、クエリの多くを試してみましたが、一つは最終的に私の右の結果を与えた:

SELECT woh.* 
FROM workorderhistory woh 
WHERE woh.operation = 'REQ_CONVER' AND woh.operationtime > (
    SELECT MAX(woh2.operationtime) FROM workorderhistory woh2 WHERE woh2.operation = 'CLOSE' 
) AND woh.workorderid = woh2.workorderid 
ORDER BY woh.workorderid DESC 
LIMIT 100 

しかしこの1つは16000 RECORDSに、1,5時間かかりました... だから、間違いがないためです私...

クエリの最大の問題は、私の基準を最新のclosedレコードと一致させることだけです。

データは、より多くを説明します。一例では Two data tables

、クエリは簡単です:

SELECT woh.* 
FROM workorderhistory woh 
INNER JOIN workorderhistory woh2 
ON woh.workorderid = woh2.workorderid 
WHERE woh.operation = 'REQ_CONVER' AND woh2.operation = 'CLOSE' AND woh.operationtime > woh2.operationtime 

は、しかし、私は最初の最後に閉じられたレコードを取得する必要があります。これは私が必要とする比較記録です。

私はINNERがサブクエリとJOINを使用してこれをやってみました:

SELECT woh.*, woh2.operationtime AS woh2operationtime, woh2.operationtime AS woh2operationtime 
FROM workorderhistory woh 
INNER JOIN (SELECT workorderid, operationtime FROM workorderhistory WHERE operation = 'CLOSE' ORDER BY historyid DESC LIMIT 1) woh2 
ON woh.workorderid = woh2.workorderid AND woh2.operationtime < woh.operationtime 
WHERE woh.operation = 'REQ_CONVER' 
ORDER BY woh.workorderid ASC 
LIMIT 100 

しかし、それが正しい結果を返しませんでした、それはまだ最初のCLOSEレコードを使用しました。

PostgresSQLのこの(imo super-simple)クエリを最適化する方法はありますか?

+0

各workorderidの最終的なCLOSEレコードのみが必要ですか?それともその後に来るレコード? – wildplasser

答えて

1

希望をお試しください。

SELECT woh.* 
FROM workorderhistory woh 
join (select max(operationtime) as operationtime , workorderid 
     from workorderhistory 
     where operation = 'CLOSE' group by workorderid 
    ) woh2 
on woh.workorderid = woh2.workorderid 
where woh.operationtime > woh2.operationtime 
    and operation = 'REQ_CONVER' 

workorderid列の索引は、パフォーマンスを向上させます。

+0

ありがとう、あなたのソリューションをありがとう、それは私が探しているものではありません。これは私がそのデータを最もよく説明しているわけではないからです。 私が必要としたのは、 'CLOSE'操作の後に存在するすべての' REQ_CONVER'操作を見つけることです。クエリを正しいパラメータに変更すると、非常に高速ですが、それではありがとうございます! – Abayob

+0

update query - 最後に 'CLOSE'の後に "REQ_CONVER"をすべて取得しました – farax

+0

ありがとう、私はいくつかの誤認がありましたが、これはサブクエリのGROUP BY句が間違っているためです。非常によくやったけれども、サブクエリを固定することにより、これが最速のクエリです:) サブクエリはoperationtime AS MAX(operationtime)を選択し 'でなければならない、workorderid' BY workorderhistory 操作= 'CLOSE' グループから をworkorderid。操作時間がなければ – Abayob

1

私は右のあなたの質問を理解し、この

Drop table if exists TMP_ workorderhistory; 
Create temp table TMP_ workorderhistory as 
SELECT 
    Workorderid 
    , operationtime 
From (
     SELECT 
      Workorderid 
     , operationtime 
     , row_number() over(partition by Workorderid order by historyid desc) AS RNO 
     FROM workorderhistory 
     WHERE operation = 'CLOSE' 
    ) A 
Where A.RNO = 1; 

SELECT woh.* 
FROM workorderhistory woh 
INNER JOIN TMP_ workorderhistory woh2 
ON woh.workorderid = woh2.workorderid 
WHERE woh.operation = 'REQ_CONVER' AND woh.operationtime > woh2.operationtime; 
+0

一時的なテーブル、私はそれを考え出すべきです。 ありがとう、770ms今すぐ:D – Abayob

関連する問題