潜在的なヒントを提供exec sp_spaceused myTable
を実行しているから、あなたの結果:NVARCHAR(MAX)
をすることはできませんので、(インデックスが作成されていないフィールドを読み込むときにここで注意すべき重要なことは、あなたのテーブルを意味reserved = 1994320 KB
ある
rows = 255,000
reserved = 1994320 KB
data = 1911088 KB
index_size = 82752 KB
unused 480KB
は、いくつかの1866メガバイトですインデックス付き)SQL Serverは、列を制限する前に、行全体をメモリに読み込む必要があります。したがって、1GBのRAM制限を過ぎても簡単に実行できます。
単純なテストでは、最後の(または最初の)150k行を削除して、クエリを再試行してどのようなパフォーマンスが得られるかを確認してください。
いくつかの質問:
- は、あなたのテーブルには主キー(それは
id
フィールドまたは何か他のものである)にクラスタ化インデックスを持っていますか?
`nvarchar(max)
フィールドなどのインデックスに登録されていない列でソートしていますか?最高のシナリオでは
あなたのためにPKがid
ともクラスタ化インデックスであり、あなたのいずれかが全くorder by
か、order by id
されていない:あなたのvarchar(max)
フィールドがcomments
命名されたと仮定すると、
:
SELECT id, comments
FROM myTable
ORDER BY id
これは正常に動作しますが、すべての行をメモリに読み込む必要がありますが(テーブル上で1つの解析しか行いません)、comments
はVARCHAR(MAX)
であり、 2GBのSQLは、テーブルをメモリにロードする必要があります。 comment_date
が索引付けされていない追加のフィールドである
SELECT id, comments
FROM myTable
ORDER BY comment_date
:
多分何が起こっているかは、あなたがこのようなものを持っています。この場合の動作は、SQLがメモリ内のすべての行を実際に並べ替えることができず、メモリにテーブルを出し入れすることになり、見逃している可能性があります。
この場合の簡単な解決策は、comment_dateにインデックスを追加することです。
しかし、その後、別のソリューションでは、次を使用したいデータの局所的な一時テーブルを作成している、あなただけのデータベースへの読み取りアクセス権を持っているとしてそれが不可能であると仮定します
DECLARE @T TABLE
(
id BIGINT,
comments NVARCHAR(MAX),
comment_date date
)
INSERT INTO @T SELECT id, comments, comment_date FROM myTable
SELECT id, comments
FROM @T
ORDER BY comment_date
これがない場合お手伝いをして、追加情報が必要な場合は、実際のクエリをテーブル定義全体とそのインデックスと一緒に投稿してください。このすべてを越えて
あなたはインデックスと統計情報を再構築するために、バックアップを復元した後、以下を実行して、あなただけの(断片化されたデータベースのバックアップ時に起こり、その後、新しいインスタンスに復元する)破損した統計に苦しんことができます:
EXEC [sp_MSforeachtable] @command1="RAISERROR('UPDATE STATISTICS(''?'') ...',10,1) WITH NOWAIT UPDATE STATISTICS ? "
EXEC [sp_MSforeachtable] @command1="RAISERROR('DBCC DBREINDEX(''?'') ...',10,1) WITH NOWAIT DBCC DBREINDEX('?')"
EXEC [sp_MSforeachtable] @command1="RAISERROR('UPDATE STATISTICS(''?'') ...',10,1) WITH NOWAIT UPDATE STATISTICS ? "
より多くのテスト - SQLServer 2008 R2のフルバージョンを同じデータベースにインストールした同じマシンにインストールしました。 DataReaderは、250,000レコードを4.3分でループし、22分をSQLExpressでループしました。 – econner
あなたは〜1k文字にしかアクセスしていないと言いますが、実際のテーブルの大きさはどれくらいですか? 'exec sp_spaceused myTable'を実行します(' myTable'をテーブル名に置き換えてください)。 'NVARCHAR(MAX)'の単一レコードの最大サイズは非常に大きいので、 'NVARCHAR'フィールドにはインデックスを持たない/できないので、行全体を要求します。つまり、行あたり10KB、250k行は実際には2.5GBなどです。つまり、RAMにすべて収まるわけではありません。 – Seph
行= 255,000。 reserved = 1994320 KB、data = 1911088 KB、index_size = 82752 KB、未使用480 KB – econner