データベースが与えられた場合、クエリは 99% の確率で正しい出力を返しますが、1% の確率で間違った出力を返します。考えられる理由は何ですか?
3 に答える
クエリが「間違った」または「予期しない」結果セットを返す理由はいくつかあります。
- 「間違った」データがデータベース/テーブルに追加されました。
- クエリは、コミットされていないレコードまたはファントム レコードを読み取ります (データベースの分離レベルを参照)
- データがまだインデックス化されていない可能性があります (フルテキスト インデックスの場合)、またはフルテキスト サービスがインデックスを再構築しています。
- クエリに ORDER BY 句がなく、システムの負荷が高い。この場合、「メリーゴーランド スキャン」が観察されることがあります。
たとえば、500,000 ページのテーブルがあるとします。UserA は、テーブルのスキャン (およびいくつかのレコードの取得) を必要とする Transact-SQL ステートメントを実行します。そのスキャンで 100,000 ページが処理されると、UserB は同じテーブルをスキャンする別の Transact-SQL ステートメントを実行します。データベース エンジンDatabase Engine は、100,001 以降のページに対する一連の読み取り要求をスケジュールし、各ページの行を両方のスキャンに渡します。スキャンが 200,000 ページに達すると、UserC は同じテーブルをスキャンする別の Transact-SQL ステートメントを実行します。200,001 ページ以降、データベース エンジンは、読み取った各ページの行を 3 つのスキャンすべてに渡します。500,000 番目の行を読み取った後、UserA のスキャンが完了し、UserB と UserC のスキャンがラップバックして、ページ 1 から始まるページの読み取りを開始します。データベース エンジンが 100,000 ページに達すると、UserB のスキャンが完了します。その後、UserC のスキャンは、200,000 ページを読み取るまで単独で続行されます。この時点で、すべてのスキャンが完了しました。この最適化の詳細については、次を参照してください。メリーゴーランドスキャン
- 分散データベースの場合、データベースの異なるコピーに対してクエリを実行できます (「データベース ロード バランサー」のため)。そのため、レプリケーション手順中、一部のデータベース コピーは、ある時点で異なるデータを持つ場合があります。
他のアイデアが出てきたら、投稿を更新します。
たぶん彼らは特殊文字のチェックを入れておらず、1%の時間のユーザーが特殊文字を挿入できると思います。
キャッシュ、同期/複製、リソース不足など