0

例として、次の3つのテーブルを想定します。

PHYSICAL_ITEM

ID
SELLER_ID
NAME
COST
DIMENSIONS
WEIGHT

DIGITAL_ITEM

ID
SELLER_ID
NAME
COST
DOWNLOAD_PATH

売り手

ID
NAME

アイテムIDは、両方のアイテムテーブルで一意であることが保証されています。タイプラベルを使用して、特定の販売者のすべてのアイテムIDを順番に選択したいと思います。私は思いついた:

クエリA

SELECT PI.ID AS ID, 'PHYSICAL' AS TYPE
    FROM PHYSICAL_ITEM PI
        JOIN SELLER S ON PI.SELLER_ID = S.ID
    WHERE S.NAME = 'name'
UNION
SELECT DI.ID AS ID, 'DIGITAL' AS TYPE
    FROM DIGITAL_ITEM DI
        JOIN SELLER S ON DI.SELLER_ID = S.ID
    WHERE S.NAME = 'name'
    ORDER BY ID

クエリB

SELECT ITEM.ID, ITEM.TYPE
    FROM (SELECT ID, SELLER_ID, 'PHYSICAL' AS TYPE
              FROM PHYSICAL_ITEM
          UNION
          SELECT ID, SELLER_ID, 'DIGITAL' AS TYPE
              FROM DIGITAL_ITEM) AS ITEM
        JOIN SELLER ON ITEM.SELLER_ID = SELLER.ID
    WHERE SELLER.NAME = 'name'
    ORDER BY ITEM.ID

クエリAが最も効率的であるように見えますが、不必要に重複しているようにも見えます(2つのテーブルが同じテーブルに結合し、2つのwhere句が同じテーブル列にあります)。クエリBは、ある意味ではきれいに見えますが(重複はありません)、サブクエリがあるため、効率が大幅に低下します。いわば、両方の世界を最大限に活用する方法はありますか?

4

1 に答える 1

0

unionどちらの場合も、をに置き換えunion allます。 Union重複を不必要に削除します。

オプティマイザは結合を行うときに多くの情報を持っているため、クエリAの方が効率的であると思います(ただし、Oracleは結合後もインデックスを使用するのに非常に優れていると思います)。さらに、最初のクエリは、結合前のデータ量を減らします。

しかし、これは単なる意見です。実際のテストは、2つのクエリの時間を計り(キャッシュフィルの遅延を回避するために複数回)、どちらが優れているかを確認することです。

于 2013-01-11T15:41:41.070 に答える