1

SQL Server 2008 R2データベースには、主キーとして単一の整数を持つテーブルがあります。主キーで選択を実行しても結果が得られない場合がありますが、特定の値の間で主キーのすべてのレコードを検索すると、行を取得できます。これは、少数のレコード(数百万行のうち10行未満)にのみ影響します。レコードの大部分は、単純な「等しい」ステートメントで選択できます。

誰かがこれを引き起こしている可能性があるもの、または問題を解決する方法を知っていますか?クラスタ化されたインデックスに問題があるのではないかと思います。ヒント「index(0)」を使用すると、範囲を使用せずにレコードを取得できます。

詳細:

ステートメント1は結果を生成しません。

select * from claim where claim_id = 12166769

ステートメント2は、claim_id12166769に対して1つの結果を生成します。

select * from claim where claim_id > 12166768 and claim_id < 12166770

どちらのステートメントも、PK_claim_claim_idを使用したクラスター化インデックスシークを使用します。

ステートメント3は、ヒントを使用して、claim_id12166769に対して1つの結果を生成します。

select * from claim  with (index(0)) where claim_id = 12166769

クレームテーブルには、nullではなく整数の主キーとして定義された「claim_id」という名前の列があります。「PK_claim_claim_id」という名前の主キーにクラスター化インデックスがあります。

SQLSentryプランエクスプローラーを使用してプランツリーを表示しています。ステートメント1には、1つの推定行と0の実際の行があります。ステートメント2には、7つの推定行と1つの実際の行があります。

更新 さらに、実行したときに

select * from claim where claim_id > 12166774 and claim_id < 12166775

12166770から12166774までの5行が返されました。

select * from claim with (index(0))  where claim_id > 12166774 
and claim_id < 12166775

ヒントを使用すると、期待どおりにレコードが返されませんでした。

2012年6月22日更新

私はあまりにも早く話しました。このエラーは別の場所で見つかりました。データベース全体を実際にスキャンしたのではなく、その一部だけをスキャンしたことがわかりました。

select * from claim where claim_id in (8223749,8223752,8223753,8223754,8223755)

行を返しませんが、

select * from claim with (index(0))
    where claim_id in (8223749,8223752,8223753,8223754,8223755)

行を返します。走った

SELECT sys.fn_PhysLocFormatter(%%physloc%%),claim_id FROM claim with (index(0)) 
WHERE claim`_id in (8223749,8223752,8223753,8223754,8223755)

受け取った

(3:1394868:2)   8223749
(3:1394868:5)   8223752
(3:1394868:6)   8223753
(3:1394868:7)   8223754
(3:1394868:8)   8223755
4

1 に答える 1

0

私のコメントは問題を解決したように見えたので、回答として投稿します。

DBCC CHECKTABLE ( テーブル名 | ビュー名 [ , { NOINDEX | インデックス ID } |, { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] )

于 2012-06-19T18:22:37.480 に答える