COLLECT STATISTICS (最適化ルーチン形式) FROM source_table句のルールと指針 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
ft:locale
ja-JP
ft:lastEdition
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage
COLLECT STATISTICSリクエストにFROM句を指定した結果は、CREATE TABLE … AS … WITH DATA AND STATISTICSを指定した場合と同じですが、以下に挙げる例外があります。
  • ソース テーブルの統計をターゲット テーブルにコピーするには、ソース テーブルに対するSELECT権限が必要です。
  • COLLECT STATISTICS FROMはデータをコピーない。指定した列セットの統計のみをコピーします。
  • 統計をコピーするために使用するCOLLECT STATISTICSリクエストでUSING句を指定することはできません。

    Teradata Databaseは、直近のCOLLECT STATISTICSリクエストのUSINGオプションをソースからターゲットにコピーします。

  • ソース テーブルからターゲット テーブルにテーブル レベルのデモグラフィックをコピーする場合は、SUMMARYオプションを使用します。ソース テーブルとターゲット テーブルの列リストを指定しないで統計をコピーする場合は、Teradata Databaseによって暗黙的にSUMMARY統計がソースからターゲットにコピーされます。システムによって暗黙的にSUMMARY統計がコピーされた場合は、後でその統計を更新するときに、ネイティブでその統計を再収集するようにしてください。

    ソース テーブルからターゲット テーブルにSUMMARY統計をコピーする明確な理由がない限り、SUMMARY統計をコピーしないようにしてください。

  • 基本的なCREATE TABLEリクエストまたはCREATE TABLE … AS … WITH DATAリクエストの任意のを使用して同一のターゲット テーブルを作成した後に、COLLECT STATISTICSリクエストを使用できます。

    PARTITION統計をコピーした場合に、ソース テーブルとターゲット テーブルの間で内部パーティション番号の対応関係が食い違っていると、ターゲット テーブルにコピーした統計が、ターゲット テーブルのデータに正確に対応しなくなる可能性があります。SHOW TABLEリクエストから返されるテーブル定義とデータが両方のテーブルで同じ場合でも、そのような可能性があります。

    CREATE TABLE…AS…WITH DATA AND STATISTICSリクエストを使用してターゲット テーブルを作成するときに、ターゲット テーブルの内部パーティション番号がソース テーブルと異なる場合は、ソース テーブルからコピーするPARTITION統計は無効です。

    CREATE TABLE … AS … WITH DATA AND STATISTICSリクエストで作成したターゲット テーブルと統計のコピー元のソース テーブルを内部パーティション番号のレベルまで同一にすることはできません。2つのテーブルに対するSHOW TABLEリクエストの出力で定義を比較しただけでは、どちらのテーブルも同じように見える場合でも、両者が同一であるとは限りません。

  • COLLECT STATISTICSを使用して統計がコピーされた列に含まれるすべてのデータは、ソース テーブルとターゲット テーブルで同じになる必要があります。

    同じでない場合は、ターゲット テーブルの統計を再収集することを強くお勧めします。

  • 内部パーティション番号が異なる場合、COLLECT STATISTICS … FROM source_tableリクエストとCREATE TABLE … AS … WITH DATA AND STATISTICSリクエストの結果は同じになりません。どちらの方法でもTeradata Databaseによって同じ統計がコピーされますが、COLLECT STATISTICS … FROM source_tableの場合は、両方のテーブルでデータが同じでも、そのデータの統計が無効である可能性があります。

一般的なルールとして、ソース テーブルからPARTITION統計をコピーする場合は、常にターゲット テーブルでPARTITION統計を再収集するようにしてください。

COLLECT STATISTICSリクエストを使用して、ソース テーブルから同一のターゲット テーブルに統計をコピーする場合には、以下のルールが適用されます。
  • ソース テーブルとターゲット テーブルの両方に列リストを指定する場合、指定したターゲット テーブル内の列の属性が、指定したソース テーブル内の列の属性と同一であるときにだけ、Teradata Databaseはソース テーブルの統計をターゲット テーブルにコピーします。そうでない場合、システムは統計をコピーせず、リクエスト側にエラーを返します。

    ソース テーブルとターゲット テーブルの列リストが同じである必要はない

  • ソース テーブルまたはターゲット テーブルのいずれかの列リストを指定しない場合、ターゲット テーブル内の各列の属性が、ソース テーブル内の当該列の属性と同じであるときにだけ、Teradata Databaseはソース テーブルからターゲット テーブルに統計をコピーします。それ以外の場合、Teradata Databaseは統計をコピーせず、リクエスト元にエラーを返します。

    例えば、ターゲット テーブルに含まれる4つのすべての列の属性と、ソース テーブルに含まれる4つの列の属性が同じにならなければなりません。

    このルールは、列のすべての属性(データ型、NULL/NOT NULLの定義、固有性、大文字小文字の区別、大文字の定義など、一致が必要なすべて)に適用されます。

  • ソース テーブルの列リストを指定していて、ターゲット テーブルの列リストを指定していない場合は、両方のテーブルに一致する列が含まれている必要があります。

    この場合、システムは指定したソース テーブルからターゲット テーブルの対応する列セットに統計をコピーします。

  • ターゲット テーブルの列リストを指定していて、ソース テーブルの列リストを指定していない場合は、両方のテーブルの列の属性が同じでなければなりません。

    この場合、Teradata Databaseは対応するソース列から、指定したターゲット テーブルの列に統計をコピーします。

  • 全般的な適格性ルールを検査した後で、Teradata Databaseはソース テーブルの単一列のすべての統計を取得します。
    単一列統計のコピーには、以下の追加ルールが適用されます。
    • ソース テーブルの列に対する適切な単一列統計が収集されている場合、その統計はターゲット テーブルの対応する列にコピーされます。
    • ソース テーブルの列に対する適切な単一列統計がまだ収集されていない場合、統計はコピーされません。
    • ソース テーブルとターゲット テーブルの両方に対する適切な単一列統計がすでに収集されている場合、Teradata Databaseはターゲット テーブルの統計を、ソース テーブルに対して収集してある統計で上書きします。
  • 全般的な適格性ルールを検査した後で、Teradata Databaseはターゲット テーブルにコピーするのに適格な複数列統計を判断するためのアルゴリズムを使用します。システムはソース テーブルに含まれるすべての複数列セットまたはインデックスに対して収集した統計を、ターゲット テーブルの対応する複数列セットまたは複数列インデックスセットにコピーします。
    複数列統計のコピーには、以下の追加ルールが適用されます。
    • ソース テーブルに対して適切な複数列統計または複数列インデックス統計が収集されていても、ターゲット テーブルに対して統計が収集されていない場合、Teradata Databaseはそれらの統計をソース テーブルからターゲット テーブルにコピーします。
    • 適切な複数列統計または複数列インデックス統計がターゲット テーブルとソース テーブルの両方に対して収集されている場合、Teradata Databaseは既存のターゲット テーブルの統計を、ソース テーブルに対して収集済みの統計で上書きします。
    • ターゲット テーブルに対する適切な複数列統計または複数列インデックス統計が収集されていても、ソース テーブルに対しては収集されていない場合、Teradata Databaseが既存のターゲット テーブルの統計を変更することはありません。
  • 単一列統計のサブセットのみのコピーには、以下の追加ルールが適用されます。

    指定したソース テーブルの列に対して統計が収集されていない場合、リクエストはアボートされ、リクエスト側にエラーが返されます。

  • 複数列統計のサブセットのみのコピーには、以下の追加ルールが適用されます。

    指定したソース テーブルの複数列セットに対して統計が収集されていない場合、リクエストはアボートされ、リクエスト側にエラーが返されます。

  • グローバル一時テーブルに対する統計のコピーには、以下の追加ルールが適用されます。
    • ソース テーブルとターゲット テーブルの両方がグローバル一時テーブルの場合、システムはターゲット テーブルに対する一時統計としてソース テーブルから一時統計をコピーします。
    • ソース テーブルがグローバル一時テーブルで、ターゲット テーブルが永久テーブルの場合、システムはターゲット テーブルに対する永久統計としてソース テーブルから一時統計をコピーします。
    • ターゲット テーブルがグローバル一時テーブルで、ソース テーブルが永久テーブルの場合、システムはターゲット テーブルに対する一時統計としてソース テーブルから統計をコピーします。
    • ターゲット テーブルが実グローバル一時テーブルの場合、システムはターゲット テーブルに対するゼロ統計としてソース テーブルの統計をコピーします。

      ゼロ統計という語は、構築された列セットまたはインデックスの統計に対する概要データ構造体の状態、またはヒストグラム(<Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142>を参照)を指しますが、列セットまたはインデックスで収集された統計はありません。この状態の一般的な例としては、新しいテーブルを作成する場合、このテーブルにまだデータ行が含まれていないときにこのテーブルの統計を収集するときの状態などがあります。

    • ターゲット テーブルが実体化されていないグローバル一時テーブルの場合、システムはそのテーブルを実体化してからターゲット テーブルに対する一時統計としてソース テーブルから一時統計をコピーします。