これにより違いが生じる可能性のある1つの例は、After Triggerを使用してテーブルに行バージョン情報を追加することを回避するパフォーマンスの最適化を妨げることです。
これはここのSQL Kiwiでカバーされています
保存されるデータの実際のサイズは重要ではありません。重要なのは潜在的なサイズです。
同様に、2016年以降にメモリ最適化テーブルを使用する場合、行の制限を超える可能性があるがペナルティを伴う可能性のあるLOB列または列幅の組み合わせを使用することが可能になりました。
(最大)列は常に行外に格納されます。その他の列の場合、テーブル定義のデータ行のサイズが8,060バイトを超える可能性がある場合、SQL Serverは最大の可変長列を行外にプッシュします。繰り返しますが、そこに格納するデータの量には依存しません。
これは、メモリの消費とパフォーマンスに大きな悪影響を与える可能性があります
列幅を過度に宣言すると大きな違いが生じる可能性があるもう1つのケースは、テーブルがSSISを使用して処理されるかどうかです。可変長(非BLOB)列に割り当てられたメモリは、実行ツリーの各行に対して固定され、列の宣言された最大長に基づいているため、メモリバッファの非効率的な使用につながる可能性があります(例)。SSISパッケージの開発者はソースよりも小さい列サイズを宣言できますが、この分析は前もって実行してそこで実施するのが最適です。
SQL Serverエンジン自体に戻ると、同様のケースとして、SORT
操作に割り当てるメモリ許可を計算するときに、SQL Serverはvarchar(x)
列が平均してx/2
バイトを消費すると想定します。
ほとんどのvarchar
列がそれよりもいっぱいの場合、sort
操作がに波及する可能性がありますtempdb
。
あなたの場合、varchar
列が8000
バイトとして宣言されているが、実際の内容がクエリよりもはるかに少ない場合、クエリに必要とされないメモリが割り当てられます。これは明らかに非効率であり、メモリ付与の待機につながる可能性があります。
これは、ここからダウンロードできる SQL Workshops Webcast 1のパート2でカバーされているか、以下を参照してください。
use tempdb;
CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))
INSERT INTO T
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values
SELECT id,name500
FROM T
ORDER BY number

SELECT id,name8000
FROM T
ORDER BY number
