web-dev-qa-db-ja.com

重大度20-FETCH後のローカルカーソルの致命的なエラー

今週、SQL2014 SP2 CU11サーバー上のデータベースが、FETCHコードステートメントで致命的なエラー(重大度20)をスローし始めました。これは、次のように減らすことができます。

DECLARE @dummy int
DECLARE CurName CURSOR LOCAL FOR
        SELECT TOP (1) t.id FROM dbo.t_table AS t;
OPEN CurName;

WHILE 1 = 1
BEGIN
    FETCH NEXT FROM CurName INTO @dummy;
    IF @@fetch_status <> 0 BREAK;
    PRINT @dummy
END;

DBCCCHECKTABLEおよびDBCCCHECKDBは問題を検出せず、サーバーの再始動は役に立ちませんでした(そして、同じデータベースの複数のバージョンで同時に発生したため、これがデータベース構造の問題である可能性はほとんどありませんでした)。

SQL2014 SP2とCU6のみを備えた開発サーバーでは、同じステートメントが問題なく実行されます(SQL2017サーバーでも機能します)。

テーブル

  • 約4mioの行があります
  • 整数列で分割されています
  • 2つの列(パーティション列とbigint)にクラスター化されたPKがあります
  • 25個のインデックスがあります(私は少しクリーンアップする必要があると思います:-))
1
Thomas Franz

最初の解決策: CURSOR宣言をに変更したとき

DECLARE CurName CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR ...

(または少なくともSTATICキーワードを追加して)、正常に実行されます。

最終解決策:テーブルにはジオメトリと地理列があり、これらは今週末に削除されました(2つの対応する空間インデックスと共に)。

これがこのテーブルへの唯一の変更だったので、この問題を解決したクラスター化された主キーインデックスを再構築することにしました。

SQL2014のSP2CU11には、この特殊なケースで小さなバグがあるようです。したがって、同様の問題を抱えている人は、この解決策が役立つと思うかもしれません...

1
Thomas Franz