0

次のように定義されたテーブルがあります。

CREATE TABLE [dbo].[T](
[FileID] [bigint] NOT NULL,
[Line] [nvarchar](250) NULL
) ON [PRIMARY]

FileID は外部キーであり、テーブルには 7,000,000 を超えるレコードがあります

このテーブルで select count(1) を実行すると、1.5GB 以上のメモリ スパイクが発生します。これに対する回避策はありますか?

4

1 に答える 1

2

カウントを取得している間にすべてのユーザーをブロックする必要がなく、現在発生しているトランザクションによる小さな違いを受け入れることができる場合、これははるかに優れています:

SELECT SUM([rows]) FROM sys.partitions
  WHERE [object_id] = OBJECT_ID('dbo.T')
  AND index_id IN (0,1);

それ以外の場合、Marc は正しいです。FileID列にインデックスを配置すると、SQL Server はテーブル全体をスキャンするのではなく、そのインデックスをスキャンすることを選択します。

このテーブルには本当にインデックスがありませんか? クラスター化インデックスが意味をなさないユースケースがいくつかありますが、これがその 1 つだとは思いません。外部キーを作成するとオプティマイザは役立ちますが、インデックスは作成されません (よくある誤解ですが)。

于 2012-06-28T12:37:36.880 に答える