0
select * from ( select * from y where x="t") where z rlike "(.*)query1"
union
select * from ( select * from y where x="t") where z rlike "(.*)query2"

上記のように、括弧には通常複数行の結果を返す同じクエリが含まれています。括弧内の select ステートメントに対して 1 回だけクエリを実行し、結果を何度も使用して最適化する方法はありますか?

PS: 順序付けられた方法で結果を取得したいので、最初のユニオン クエリの結果が一番上にある必要があります。

4

1 に答える 1

3

ここで 3 つのこと:

  • まず、UNION使えるなら避けるUNION ALL。Plainunionは重複の削除を伴うため、より多くの時間がかかります。
  • クエリを因数分解できる場合は、それを実行します。ここでは、1 つの基準を除いて正確なクエリの結合があり、使用できますOR
  • select * from (select * ...冗長性であり、回避できます。

これにより、次のことが得られます。

SELECT *
  FROM y
 WHERE x = 't'
   AND ( z RLIKE '(.*)query1'
        OR
         z RLIKE '(.*)query2'
       )

melpomene のコメントで述べたように (ありがとう!)、正規表現レベルで因数分解することもできます。
WHERE z RLIKE '(.*)query1|(.*)query2'

重複がyあり、それらが不要な場合はUNION、それらを破棄したため、導入できますが、DISTINCT必要がなければ回避できます。

注文が必要な場合は、DBMS に頼らないでください。使用ORDER BY:

ORDER BY CASE WHEN z RLIKE '(.*)query1' THEN 1
              WHEN z RLIKE '(.*)query2' THEN 2
              ELSE 3 -- given the WHERE clause, should never happen
         END
于 2012-11-26T08:42:27.433 に答える