web-dev-qa-db-ja.com

トランザクション内に配置されたテーブルの切り捨てがASEエラー226で失敗するのはなぜですか?

なぜ切り捨てとドロップの両方を使用するのですか? 」という題名の質問の回答の抜粋を見つけました:

「TRUNCATEはログに記録され、ロールバックできます。..これらの誤りについて反省します。この反論はSQL Serverの観点から書いていますが、ここで言うことはすべて、Sybaseにも同様に適用できるはずです。」回答済み 11月8日21:39に11

コメントを追加しようとしましたが、元の投稿は保護されているため、この新しい質問を回避策として使用します。

上記はMicrosoft SQL Serverに当てはまる可能性がありますが、Sybaseには当てはまりません-以下のASEエラー226を参照してください

    1> BEGIN TRAN
    2>    TRUNCATE TABLE xyz
    3> go
    Msg 226, Level 16, State 1:
    Server 'ASE16', Line 2:
    TRUNCATE TABLE command not allowed within multi-statement transaction.
    1> ROLLBACK
    2> go

さらに-ドロップ前に切り捨てても違いはないという考えにほぼ同意します...

  1. TRUNCATE TABLE自体-一部のsyslogアクティビティが含まれます(驚くほど)
  2. DROP TABLE自体(切り捨てを行わずに)
    • 「空の」BEGIN/END Xactsペア内のテーブルページの割り当てを解除する
    • sysobject、sysindexesシステムテーブルとそのインデックスの更新、および内部で生成されたDMLの更新には、BEGIN/END Xactsペア内のロギングが含まれます。

DROP TABLE自体はわずかですが、テーブルページの割り当て解除はログに記録されないので、それ自体で切り捨てると、驚くほど少量のログが発生するようです。

SYSLOG監査証跡:単独で切り捨てます(以下に示すように、TXシーケンスは表示されている最新の5つのトランザクションに基づいています)

    Log Record Type                          Op      TX seq
    ---------------------------------------- -- -----------
    ======>Checkpoint Record                 17           5
    Begin Xact                               0            5
       Delete Extent Log Record              77           5
       Direct Update/In Place Update         9            5
       Update Record for DOL Table           65           5
    End Xact                                 30           5
    ======>Checkpoint Record                 17           4

SYSLOG監査証跡:単独でテーブルをドロップします(以下に示すように、TXシーケンスは表示されている最新の5つのトランザクションに基づいています)

    Log Record Type                          Op      TX seq

    ---------------------------------------- -- -----------
    ======>Checkpoint Record                 17           5
    Begin Xact                               0            5
       Delete Extent Log Record              77           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       Deallocate Data Page                  21           5
       B-Tree Non-Leaf Delete                72           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       Deallocate Data Page                  21           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       B-Tree Non-Leaf Delete                72           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       Update Record for DOL Table           65           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
       B-Tree Non-Leaf Delete                72           5
       Delete Log Record for DOL Table       66           5
    End Xact                                 30           5
    Begin Xact                               0            4
    End Xact                                 30           4
    ======>Checkpoint Record                 17           3 
4
Raymond

以前に質問で述べたように、Sybase ASEのtruncate tableの処理方法を他の特別な属性と異なるように検索しているときに、 " 切り捨てと削除の両方を使用する理由 "というタイトルの古い投稿を見つけました。 -と呼ばれるminimally logged Sybase Transact-SQL(T-SQL)操作(例select into)。

回答の1つに、Microsoft SQL Serverの機能(truncate tableがトランザクション内で処理され、これがログに記録され、ロールバックに適したものとなる)が、Sybase ASEにも同様に当てはまるという抽出に気づきました。

2つの点を明確にするために、古い質問を参照して新しい質問を作成しました。

ポイント1

  • Microsoft SQL Serverとは異なり、Sybase ASEのトランザクション内にtruncate tableを置くことはできません
    • これを行うと、ASEエラー226が発生します(質問の本文のエラーテキストを参照してください)
  • 理由:truncate tableは、データ行の削除に関するログレコードを生成せず、データとインデックス(存在する場合)ページが単に割り当て解除され、ページは未使用としてマークされます
  • これとは対照的に、drop tableは、小さなトランザクションログイベントでtruncate tableと同等の処理を行うシステムカタログ(sysobjectssysindexesなど)を更新します(空のBEGIN Xact/END Xactブラケットとしてのログレコード監査)。

  • 重要:truncateテーブルは2つの点で一意です

    • (A)dboption "select into/bulkcopy/pllsort"を最初に有効にしなくても、データベースで使用できます(他のminimally loggedT-SQLコマンドとは異なります)
    • (B)それは、他のdump transactionminimally loggedコマンドとは異なり、データベースに対する後続のT-SQLコマンドを妨げません-この制限の回避策は、フルまたはcumulative DBを取ることですダンプしてリセット)

ポイント2

  • 元の質問/回答は、ダンプする前に最初にテーブルを切り捨てると、パフォーマンス、経過時間などが向上するかどうかを示しています。コンセンサスはNOと思われます。
  • 少なくともSybase ASEでは、最初にtruncate tableに大きな効率向上はありませんが、トランザクションログアクティビティを詳しく調べると、truncate tableの実行時にログ関連の小さなオーバーヘッドが明らかになっているようです(これはありません)。質問の本文のsyslogs監査証跡に示されているように、drop tableを処理せずにtruncate tableを続行します)。
2
Raymond