9

SQL Azure では、 null 非許容の datetime 列を現在の時刻と単純に比較する2 つの計算列 (IsExpiredおよび) を使用して、多かれ少なかれ次のように設定されたテーブルがあります。IsDeadlineExpired

CREATE TABLE [dbo].[Stuff]
(
   [StuffId] int NOT NULL IDENTITY(1,1),
   [Guid] uniqueidentifier NOT NULL,
   [ExpirationDate] datetime NOT NULL,
   [DeadlineDate] datetime NOT NULL,
   [UserId] int NOT NULL,
   [IsExpired] AS CAST((CASE WHEN [ExpirationDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
   [IsDeadlineExpired] AS CAST((CASE WHEN [DeadlineDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
   CONSTRAINT [PK_StuffId] PRIMARY KEY ([StuffId]),
   CONSTRAINT [UNQ_Guid] UNIQUE([Guid]),
)
GO

複数の結果セットを持つストアド プロシージャがあり、そのうちの 1 つがプルされます。

SELECT * FROM [dbo].[Stuff] WHERE [Guid] = @guid

最近、結果セットを で読み取るとSqlDataReader、 でSqlDataReader.GetOrdinal("IsExpired")失敗することがあるというエラー ログに気付きましたIndexOutOfRangeException。前の列はコードの前の行でエラーなしで読み取られるため、そのような場合でも問題なく機能することを私は知っています。また、手順の結果セットは列名を共有していないため、適切な順序になっていると思います (そうしないと、以前の列を読み取ると同様に失敗します)。

また、ほとんどの場合、すべてが完全に機能しているように見えます。

これは、Azure の一時的な障害が原因である可能性がありますか?

4

2 に答える 2

1

この記事を参照してください: SELECT * AND SQL Azure .

その作者は交換することを強く推奨します

SELECT *
FROM TableName

SELECT [Column1], [Column2], ... [ColumnN]
FROM TableName

SELECT * を使用すると、余分なページング、RFID ルックアップ、不要なテーブル ロックが発生し、カバーされたインデックスを作成する将来の試みが妨げられる可能性があるためです要するに性能が悪い

ところで、ここに一連の興味深い記事があります。

  1. SQL Azure クエリ パフォーマンス データへのアクセス方法
  2. クエリのパフォーマンス
  3. Windows Azure Tools for Visual Studio の概要
  4. SQL Azure 開発の概要
  5. I/O パフォーマンスの向上
  6. SQL Azure を使用すると、クエリ パフォーマンスの分析が簡単になります。

上記の MS SQL Azure フレームワークの動作により、 GetOrdinary("IsExpired")がSystem.IndexOutOfRangeExceptionを引き起こしていると思われます。

結論?列のリストを定義したSELECTステートメントを使用して、SQL Azure データベースのパフォーマンスを向上させ、IndexOutOfRange 例外を回避します。

于 2013-12-30T08:09:58.780 に答える
0

いくつかの古いログを見て、このエラーは DACPAC が同時に展開されているときにクエリが実行されているときにのみ発生していたという結論に達しました (この特定のテスト環境への自動展開の一環として)。

DACPAC の展開中、スキーマは必ずしも信頼できる状態にあるとは限りません。

それ以来、デプロイ中にアプリを「メンテナンス モード」にするコードを追加しました (これらの自動化されたものでも)。これにより、問題が軽減されるようです。

于 2016-04-05T21:20:15.590 に答える