すでにかなりの数があるので、私はここにさらに別の答えを追加するのをためらいますが、行われていない、または明確にされていないいくつかのポイントを作る必要があります。
最初:常に使用しないでくださいNVARCHAR
。これは非常に危険であり、多くの場合コストがかかる態度/アプローチです。そして、それは「言うことは良いではありません決して、彼らは時々 、特定の問題を解決するための最も効率的な手段であり、行うための一般的な回避策ので、カーソルを使用しない」WHILE
ループはほとんど常により遅いだろう適切に行わカーソル。
「常に」という用語を使用する必要があるのは、「常に状況に最適なことを常に行う」ようにアドバイスするときだけです。特に、開発時間の短期的な利益(マネージャー:「この機能が必要です-今まで知らなかった-1週間前!」)と、期間のメンテナンスコスト(3週間のスプリントで3か月のプロジェクトを完了するように最初にチームに圧力をかけたマネージャー:「なぜこれらのパフォーマンスの問題が発生しているのですか?柔軟性のないXをどうしたら実行できたのでしょうか?これを修正するための1つか2つのスプリント。優先アイテムに戻すために、1週間で何ができるでしょうか?そして、これが起こらないように、設計により多くの時間を費やす必要があります!」)。
第二に、 @ gbnの回答では、パスが100%明確でない場合に特定のデータモデリングの決定を行う際に考慮すべきいくつかの非常に重要なポイントに触れています。ただし、さらに考慮すべき点があります。
- トランザクションログファイルのサイズ
- 複製にかかる時間(複製を使用している場合)
- ETLにかかる時間(ETLの場合)
- ログをリモートシステムに送信して復元するのにかかる時間(ログ配布を使用している場合)
- バックアップのサイズ
- バックアップの完了にかかる時間
- 復元にかかる時間(これはいつか重要になるかもしれません;-)
- tempdbに必要なサイズ
- トリガーのパフォーマンス(tempdbに格納されている挿入および削除されたテーブルの場合)
- 行のバージョン管理のパフォーマンス(バージョンストアがtempdbにあるため、SNAPSHOT ISOLATIONを使用している場合)
- CFOが昨年のSANに100万ドルを費やしたばかりで、追加のストレージ用にさらに25万ドルを承認しないとCFOが言ったときに、新しいディスク領域を取得する機能
- INSERTおよびUPDATE操作を実行するのにかかる時間の長さ
- インデックスのメンテナンスにかかる時間
- などなど
スペースの浪費は、システム全体に大きな影響を及ぼします。私はこのトピックの明確な詳細に入る記事を書きました:ディスクは安いです!ORLY?(無料登録が必要です。申し訳ありませんが、そのポリシーは管理できません)。
3番目:「これは小さなアプリです」という側面に誤って焦点を当てている回答もあれば、「適切なものを使用する」ことを正しく提案している回答もありますが、いずれの回答もOPに実際のガイダンスを提供していません。質問で言及された重要な詳細これは彼らの学校のウェブページであるということです。すごい!したがって、次のことを提案できます。
- 学生や学部の名前のフィールドは、おそらく
NVARCHAR
他の文化の名前がそれらの場所に表示される可能性が高まるため、おそらくそうなるはずです。
- しかし、住所や都市名についてはどうでしょうか。アプリの目的は明記されていませんが(有用だったでしょう)、住所レコードがある場合、特定の地理的領域(つまり、単一の言語/文化)のみに関係していると想定
VARCHAR
し、適切なコードページ(フィールドの照合から決定されます)。
- 州および/または国のISOコードを格納する場合(格納する必要はありません
INT
/ TINYINT
ISOコードは固定長で、人間が読める形式であり、標準なので:) CHAR(2)
2文字のコードとCHAR(3)
3文字のコードを使用する場合に使用します。また、などのバイナリ照合順序の使用を検討してくださいLatin1_General_100_BIN2
。
- 郵便番号(つまり、郵便番号)を保管する場合
VARCHAR
は、AZ以外の文字を使用しないことが国際標準であるため、使用してください。そして、はい。VARCHAR
郵便番号は数字ではなく文字列であり、一部に先行 "0"があるため、INTではなくUSの郵便番号のみを格納する場合でも使用します。また、などのバイナリ照合順序の使用を検討してくださいLatin1_General_100_BIN2
。
- メールアドレスやURLを保存する場合は
NVARCHAR
、両方にUnicode文字を含めることができるようになったので使用します。
- 等々....
第四:今、あなたが持っているNVARCHAR
データは、多くのスペースとして二回取って、それはデータのためにする必要があるよりも、そのきれいに収まるVARCHAR
(「うまくフィット」=に入らない「?」)と何とか、まるで魔法のように、アプリケーションがしたが成長現在、これらのフィールドの少なくとも1つに数百万のレコードがあり、ほとんどの行は標準のASCIIですが、一部にはUnicode文字が含まれているためNVARCHAR
、保持する必要があります。以下を検討してください。
SQL Server 2008-2016 RTM を使用していて、Enterprise Editionを使用している場合、またはSQL Server 2016 SP1(すべてのエディションでデータ圧縮が利用可能になった)以降を使用している場合は、データ圧縮を有効にできます。データ圧縮ではNCHAR
、NVARCHAR
フィールド内のUnicodeデータを圧縮できます(ただし、「常に」ではありません)。決定要因は次のとおりです。
NCHAR(1 - 4000)
また、Unicodeの標準圧縮スキームをNVARCHAR(1 - 4000)
使用しますが、SQL Server 2008 R2以降のみで、IN ROWデータのみで、OVERFLOWではありません。これは、通常のROW / PAGE圧縮アルゴリズムよりも優れているようです。
NVARCHAR(MAX)
そして、XML
(と私も思いますVARBINARY(MAX)
、TEXT
とNTEXT
(LOBまたはオーバーフローページでない行オフ)の行である)データ缶が少なくともPAGEは圧縮されますが、ない ROWは、圧縮されました。もちろん、PAGE圧縮は行内の値のサイズに依存します。VARCHAR(MAX)でテストしたところ、6000文字/バイトの行は圧縮されませんでしたが、4000文字/バイトの行は圧縮されました。
- OFF ROWデータ、LOBまたはOVERLOW =圧縮なし!
SQL Server 2005、または2008-2016 RTMを使用していて、Enterprise Editionを使用していない場合VARCHAR
、1つと1 つの2つのフィールドを使用できますNVARCHAR
。たとえば、ほとんどすべてのベースASCII文字(値0〜127)であるため、に収まるがVARCHAR
、場合によってはUnicode文字が含まれるURLを格納しているとします。スキーマには、次の3つのフィールドを含めることができます。
...
URLa VARCHAR(2048) NULL,
URLu NVARCHAR(2048) NULL,
URL AS (ISNULL(CONVERT(NVARCHAR([URLa])), [URLu])),
CONSTRAINT [CK_TableName_OneUrlMax] CHECK (
([URLa] IS NOT NULL OR [URLu] IS NOT NULL)
AND ([URLa] IS NULL OR [URLu] IS NULL))
);
このモデルでは、計算列からSELECT するだけ[URL]
です。挿入および更新の場合、変換によって入力値が変更されるかどうかを確認して、使用するフィールドを決定しますNVARCHAR
。
INSERT INTO TableName (..., URLa, URLu)
VALUES (...,
IIF (CONVERT(VARCHAR(2048), @URL) = @URL, @URL, NULL),
IIF (CONVERT(VARCHAR(2048), @URL) <> @URL, NULL, @URL)
);
着信値をGZIP VARBINARY(MAX)
して、その途中で解凍できます。
- SQL Server 2005-2014の場合:SQLCLRを使用できます。SQL#(私が書いたSQLCLRライブラリ)には、無料バージョンのUtil_GZipとUtil_GUnzipが付属しています
- SQL Server 2016以降の場合:GZipでもある組み込み関数
COMPRESS
とDECOMPRESS
関数を使用できます。
SQL Server 2017以降を使用している場合は、テーブルをクラスター化列ストアインデックスにすることを検討できます。
これはまだ実行可能なオプションではありませんが、SQL Server 2019ではVARCHAR
/ CHAR
データ型にUTF-8のネイティブサポートが導入されています。現在、それを使用するにはバグが多すぎますが、修正されている場合、これは一部のシナリオではオプションです。この新機能の詳細な分析については、投稿「SQL Server 2019でのネイティブUTF-8サポート:救世主か偽預言者か?」を参照してください。