次のように定義されたテーブルがあります。
CREATE TABLE [dbo].[T](
[FileID] [bigint] NOT NULL,
[Line] [nvarchar](250) NULL
) ON [PRIMARY]
FileID は外部キーであり、テーブルには 7,000,000 を超えるレコードがあります
このテーブルで select count(1) を実行すると、1.5GB 以上のメモリ スパイクが発生します。これに対する回避策はありますか?
次のように定義されたテーブルがあります。
CREATE TABLE [dbo].[T](
[FileID] [bigint] NOT NULL,
[Line] [nvarchar](250) NULL
) ON [PRIMARY]
FileID は外部キーであり、テーブルには 7,000,000 を超えるレコードがあります
このテーブルで select count(1) を実行すると、1.5GB 以上のメモリ スパイクが発生します。これに対する回避策はありますか?
カウントを取得している間にすべてのユーザーをブロックする必要がなく、現在発生しているトランザクションによる小さな違いを受け入れることができる場合、これははるかに優れています:
SELECT SUM([rows]) FROM sys.partitions
WHERE [object_id] = OBJECT_ID('dbo.T')
AND index_id IN (0,1);
それ以外の場合、Marc は正しいです。FileID
列にインデックスを配置すると、SQL Server はテーブル全体をスキャンするのではなく、そのインデックスをスキャンすることを選択します。
このテーブルには本当にインデックスがありませんか? クラスター化インデックスが意味をなさないユースケースがいくつかありますが、これがその 1 つだとは思いません。外部キーを作成するとオプティマイザは役立ちますが、インデックスは作成されません (よくある誤解ですが)。