1

テスト結果に基づいてデータを提供するために、4 つのテーブル間でデータを結合するクエリがあります。一意のデータの各行に対して 2 つの同一のレコードを返すという事実を除いて、クエリは正常に機能しています。結合内のテーブルの 1 つの主キー列 (a.id) の前に DISTINCT をスローすると、すべての重複が排除されます。ただし、DISTINCT はパフォーマンスに影響を与える傾向があることを読んだ (そして発見した) ため、可能であれば、よりパフォーマンスの高いソリューションを見つけたいと考えています。うまくいけば、簡単に修正できるJOINSでばかげたことをしているだけです。これは postgresql-9.0.x に関するものです。はい、9.1.x にアップグレードした場合、'group by a.id' を実行できる可能性が高いことは承知していますが、今のところ 9.0.x で立ち往生しています。

クエリは次のとおりです。

SELECT a.id,a.suiteid,a.testname
     ,date_trunc('second',a.last_update) AS last_update
     ,regexp_replace(p.relname,E'tests','','g')
     ,o.osname 
FROM smoketests AS a
   , pg_class AS p
   , smoke AS t
   , osversmap AS o 
WHERE a.osversion=o.osversion
  AND a.suiteid=t.id
  AND a.tableoid=p.oid
  AND ( a.current_status='FAILED' )
  AND ( a.arch='i386' )
  AND ( a.os='Darwin' )
  AND a.last_update>'2012-05-01 04:00:00'
  AND a.last_update<'2012-05-02 14:20:45' 
ORDER BY a.id ;

次の出力が生成されます。

    id    | suiteid |     testname     |     last_update     | regexp_replace |   osname   
----------+---------+------------------+---------------------+----------------+------------
 32549818 |  668232 | bug377064        | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x
 32549818 |  668232 | bug377064        | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x
 32549819 |  668232 | funcmem_resize   | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x
 32549819 |  668232 | funcmem_resize   | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x
 32549820 |  668232 | leitest          | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x
 32549820 |  668232 | leitest          | 2012-05-01 08:38:07 | smoke          | OSX-10.7.x

問題は id 列に見られます。ここでは、a.id がスモーク テーブルの一意の主キーであり、実際には重複がありませんが、各値が 2 つ返されます。「煙」テーブルは、smoketests テーブルと 1 対多の関係にありますが、なぜすべての重複を取得しているのか、いまだに混乱しています。

4

1 に答える 1

3

最初にすべきことは、暗黙的なクロス結合をやめるということです。これらは、この種の問題の追跡をより困難にします。クエリを次のように書き換えます。

SELECT a.id,a.suiteid,a.testname
     ,date_trunc('second',a.last_update) AS last_update
     ,regexp_replace(p.relname,E'tests','','g')
     ,o.osname 
FROM smoketests AS a
JOIN pg_class AS p ON a.tableoid=p.oid
JOIN smoke AS t ON a.suiteid=t.id
JOIN osversmap AS o ON a.osversion=o.osversion
WHERE
  AND ( a.current_status='FAILED' )
  AND ( a.arch='i386' )
  AND ( a.os='Darwin' )
  AND a.last_update>'2012-05-01 04:00:00'
  AND a.last_update<'2012-05-02 14:20:45' 
ORDER BY a.id ;

そこから、重複の原因を突き止める必要があります。煙が重複を引き起こしていますか? より多くのレコードを返してみてください。その場合は、結合を削除して IN サブクエリに置き換えてみてください。

于 2013-04-01T10:03:04.547 に答える