0

次の表があるとします。

Table Name: ITEM
Columns: ID, ITEM_NUM, ITEM_COLOR, ITEM_SPEC, ITEM_STATUS

また、ITEM テーブルは ITEM_STATUS 列で (LIST) パーティション化されています。
ITEM_STATUS に指定できる値は、Active、Inactive、Suspended
のみです 。ID は PK であるため、インデックスが存在します。

さて、このクエリを実行すると:

select * from ITEM where ITEM_COLOR="Green"

1.パーティションがITEM_COLOR
列にないため、Oracleはどのパーティションに移動するかをどのように決定しますか?
2. 上記のクエリは、パーティショニングの恩恵を受けませんか?
3. パーティションの恩恵を受けるには、SQL クエリの WHERE 句にパーティション化された列を含める必要がありますか。
4. パーティションの場合にインデックスを使用する方法は?

4

3 に答える 3

1

クエリに特定のパーティションからのデータのみが必要かどうかを判断する方法がない場合、Oracleはテーブルのすべてのパーティションを調べる必要があります。

パーティションの概念は簡単な答えでは十分に説明できません。ドキュメントを読んでよく理解することをお勧めします。

とにかく、これに入る前に、テーブルをパーティション化しないままにしない場合は、最初にパフォーマンスの問題があることを確認してください。

に移動

http://docs.oracle.com/cd/E11882_01/server.112/e25789/schemaob.htm#CFAGCECI または http://docs.oracle.com/cd/E11882_01/server.112/e25554/parpart.htm# i1007993 または http://docs.oracle.com/cd/E11882_01/server.112/e16638/data_acc.htm#i21879

于 2013-02-14T13:19:53.117 に答える
0

パーティション化されたテーブルを3つのテーブルと考えてください。ITEM_active、ITEM_inactive、ITEM_suspended。物理的には3つのテーブルがあります。論理的には、1つのテーブルがあります。

したがって、1つの色を要求するときは、3つのテーブルすべてをスキャンする必要があります。これは、緑色のアイテムがアクティブかどうか、または一時停止されている可能性があるためです。つまり、このクエリのパーティション化のメリットはありません。

質問3:いいえ。パーティションスキーマはクエリに対して透過的である必要があります。次のように指定します。クエリはパーティションから独立している必要があります(つまり、パーティション名を指定せずに、where句を使用してデータをフィルタリングします)。一時停止されたアイテムを要求するクエリは、パーティション化の恩恵を暗黙的に受けます。一時停止されたアイテムを含むパーティションのみをスキャンします。

質問4:インデックスはグローバル(すべてのパーティションにわたる単一のインデックスオブジェクト-保守が難しい)またはローカル(すべてのパーティションの物理インデックス)の場合があります。インデックス付きの列は、インデックスを使用した高速検索に役立ちます。パーティションインデックスには特別なことは何もありません。

于 2013-02-14T13:20:17.530 に答える
0

あなたの例では、パーティションのプルーニングを使用せず(これは、情報を取得する場所を知るために1つのパーティションのみを選択します)、すべてのパーティションに移動します。もちろん、ITEM_STATUSを使用しない場合、Oracleは1つのパーティションのみを使用することはできません。

クエリはパーティショニングの恩恵を受けません。

where句にパーティション化された列を配置する必要はありません。を使用できますFROM table partition (ACTIVE)

パーティションインデックスまたは通常のインデックスを使用できます。

于 2013-02-14T13:21:04.687 に答える