常にnvarchar(MAX)を使用することに不利な点はありますか?


342

SQL Server 2005では、nvarchar(255)のように、長さを明示的に指定するのではなく、すべての文字フィールドをnvarchar(MAX)にすることの欠点はありますか?(データベースレベルでフィールド長を制限できないことは明らかですが)


1
8000文字以上の名前を誰かに入力させたい理由がわかりません。
DForck42 2009年

2
同じロジックをプログラミング言語に適用できます。すべてのデータを古いVB6バリアントに戻してみませんか?チェックとバランスが複数の場所にあることは必ずしも悪いことではないと思います。
Matt Spradley、2009年

1
これを確認してください:stackoverflow.com/questions/2009694/…–
山本明

10
あなたの更新はこの質問に対する独自の答えでなければなりません。
Johann

元の作成者が行っていないため、質問への回答は適切な回答に移動しました。stackoverflow.com/a/35177895/10245私は7年で十分だと考えています:-)
Tim Abell

回答:


153

同じ質問がMSDNフォーラムで質問されました:

元の投稿から(そこに多くの情報があります):

データをVARCHAR(N)列に格納すると、値は物理的に同じ方法で格納されます。ただし、VARCHAR(MAX)列に格納すると、画面の背後でデータはTEXT値として処理されます。そのため、VARCHAR(MAX)値を処理するときに必要な追加処理がいくつかあります。(サイズが8000を超える場合のみ)

VARCHAR(MAX)またはNVARCHAR(MAX)は「大きな値の型」と見なされます。大きな値型は通常「行外」に格納されます。これは、データ行に「大きな値」が格納されている別の場所へのポインターがあることを意味します...


2
それで問題は、N / VARCHAR(MAX)とN / TEXTの使用に違いがあるのでしょうか?
スライスされていない

18
正しく思い出せば、サイズが8kを超えた場合にのみ行外に格納されるのではないですか
Sam Schutte、

79
N/VARCHAR(MAX)「サイズが8000を超えた場合のみ」という追加の処理があるので「いいえ、使っても不都合はありません」と答えました。したがって、必要な場合にのみコストが発生し、データベースの制限が緩和されます。私はこれを間違って読んでいますか?ほとんどの場合、あなたが望むN/VARCHAR(MAX)よりはむしろN/VARCHAR(1-8000)
Kent Boogaart

1
上記デッドリンク- MSDN上の問題のための作業のリンクですsocial.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/...
ミノテルヤークト

68
残念ながら、この回答にはいくつかの問題があります。これは、8k境界をマジックナンバーのように見せますが、そうではありません。値は、msdn.microsoft.comsp_tableoptions / en-us / library / ms173530.aspxなどのより多くの要因に基づいて行からプッシュされます。VARCHAR(255)型も行からプッシュできます。前述の「オーバーヘッド」は、MAXと255でまったく同じになる場合があります。MAX型とTEXT型が異なる場合、MAX型とTEXT型を比較します(操作するAPIが完全に異なる場合、別のストレージなど)。実際の違いについては言及していません。MAXタイプではインデックスもオンライン操作もありません
Remus Rusanu '25 / 08/25

50

それは公正な質問であり、彼は明白なものとは別に述べました...

短所は次のとおりです。

パフォーマンスへの影響クエリオプティマイザーはフィールドサイズを使用して、最も効率的な実行計画を決定します

"1.データベースの拡張とページのスペース割り当ては柔軟です。したがって、更新を使用してフィールドに情報を追加する場合、新しいデータが以前に挿入されたものより長い場合、データベースはポインタを作成する必要があります。これにより、データベースファイルは断片化する=インデックスから削除、更新、挿入まで、ほとんどすべてのパフォーマンスが低下する。 " http://sqlblogcasts.com/blogs/simons/archive/2006/02/28/Why-use-anything-but-varchar_2800_max_2900_.aspx

統合への影響-他のシステムがデータベースと統合する方法を知るのが難しい予測できないデータの増加考えられるセキュリティの問題、たとえば、すべてのディスク領域を占有してシステムをクラッシュさせる可能性

ここに良い記事があります:http : //searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1098157,00.html


4
+1統合とセキュリティへの影響。これらは、他のほとんどの回答がパフォーマンスについて語るときに考慮すべき元の角度です。統合の影響に関連して、適切なデフォルトのコントロールサイズを提供するためにメタデータを使用するツール(レポートライターやフォームデザイナなど)は、すべての列がそうである場合、さらに多くの作業を必要としますvarchar(max)
2014

データベースによる統合は、私が知っている最も馬鹿げたことです。一度インポートしただけならLEN機能で以前のデータを確認できます。
Maximの

30

承認された回答で提供されたリンクに基づいて、次のように表示されます:

  1. に保存されている100文字 nvarchar(MAX)フィールドにフィールドに格納される100文字と同じです。nvarchar(100)データはインラインで格納されるため、「行外」でデータを読み書きするオーバーヘッドがありません。だから心配はありません。

  2. サイズが4000より大きい場合、データは自動的に「行外」に格納されますが、これは必要なことです。だからそこにも心配はありません。

しかしながら...

  1. nvarchar(MAX)列にインデックスを作成することはできません。フルテキストインデックスを使用できますが、列にインデックスを作成してクエリのパフォーマンスを向上させることはできません。私にとって、これは契約を結びます...常にnvarchar(MAX)を使用することは明らかに不利です。

結論:

インデックスを作成でき、スペースとアクセス時間を無駄にしない、データベース全体で一種の「ユニバーサルな文字列長」が必要な場合は、を使用できますnvarchar(4000)


1
これは元の質問に追加された編集で、回答として投稿されているはずです
Tim Abell

1
ありがとう、私にとってこれが最終的な答えです。私は同じことを自問しました- なぜnvarchar(max)いつも使用しないのstringですか-C#のように?-しかし、ポイント3)(インデックスの問題)が答えを与えています。
SQLポリス

1
編集を追加しました。「普遍的な文字列長」の一種として、いつでも使用できますnvarchar(4000)
SQL Police

@SQLGeorgeを参照することにより、この優れた答えマーティン・スミス彼らがこれまでになりますよりも広い列を宣言するのクエリのパフォーマンスへの影響について
billinkc

@billinkcありがとう、それは素晴らしい記事です。OK、そのため実際にサイズはパフォーマンスに影響します。もう一度答えを編集します。
SQLポリス

28

場合によっては、データタイプにデータ内のデータに何らかの意味を持たせたいことがあります。

たとえば、実際には20文字を超えてはならない列があるとします。その列をVARCHAR(MAX)として定義すると、一部の不正なアプリケーションが長い文字列を挿入する可能性があり、それを知らない、またはそれを防ぐ方法がありません。

次にアプリケーションがその文字列を使用するとき、文字列の長さがそれが表すドメインにとって控えめで妥当であるという想定の下で、予測不能で混乱する結果が発生します。


9
私はこれと他のコメントの一部に同意しますが、これはビジネス層の責任であると私はまだ主張しています。それがデータベース層に到達するまでに、たとえそれがどれほど途方もなく長いものであっても、敬礼を鳴らしてその値を保存する必要があります。私がここで本当に役立っているのは、開発者がvarchar(255)を指定するときの約90%の時間だと思います。彼の意図は実際には255文字ではなく、未指定の長さの値です。そして、私のdbの不当に大きな値と予期しない例外の間のトレードオフを考慮して、私は大きな値を取ります。
クリスB.ベーレンス

4
不明な長さを示すためにVARCHAR(255)を指定している場合は、設計しているものを適切に調査していないことが原因です。解決策は、開発者が仕事をすることであり、データベースが不合理な値を許可することではありません。
トムH

10
著者には役に立たない。彼はあなたが答えを出したこの質問を明示的に除外しました。
USR

6
@クリスBベーレンス:私は同意しません。データベーススキーマビジネスロジックの一部です。テーブル、リレーション、フィールド、およびデータ型の選択はすべてビジネスロジックであり、RDBMSを使用してこのビジネスロジックのルールを適用することは価値があります。1つの理由で、データベースにアクセスするアプリケーション層が1つしかないことは非常にまれです。たとえば、メインビジネス層をバイパスするデータインポートおよび抽出ツールがある場合があります。これは、DBでルールを適用する必要があることを意味します。
Vince Bowdren 2013

1
長い文字列を保存する必要がない場合、または実際に保存したい場合は、データに意味を持たせることをお勧めします。たとえば、PostCodeフィールドを保存する場合、最大数が10である必要があるときに、誰かが数百または数千の文字を入力できるようにします。最大サイズは、すべてのレベル、クライアント、ビジネス層、およびデータベースで検証する必要があります。C#やEntity Frameworkなどのモデルファーストアプローチを使用している場合は、モデルでmaxsizeを定義して、データベース、ビジネスロジック、およびクライアント検証(jquery検証など)に適用できます。nvarchar(max)は本当に必要な場合にのみ使用してください
Peter Kerr

21

私はいくつかの記事をチェックし、これから有用なテストスクリプトを見つけました:http : //www.sqlservercentral.com/Forums/Topic1480639-1292-1.aspx 次に、NVARCHAR(10)とNVARCHAR(4000)とNVARCHAR(MAX )そして、指定された数値を使用してもMAXを使用すると速度の違いはわかりません。自分でテストできます。これがお役に立てば幸いです。

SET NOCOUNT ON;

--===== Test Variable Assignment 1,000,000 times using NVARCHAR(10)
DECLARE @SomeString NVARCHAR(10),
        @StartTime DATETIME;
--=====         
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='10', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(4000)
DECLARE @SomeString NVARCHAR(4000),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='4000', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(MAX)
DECLARE @SomeString NVARCHAR(MAX),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='MAX', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO

4
それは面白い。私の箱では、MAXの方が4倍遅いようです。
stucampbell 2014年

4
SQL Server 2012の新しい結果:10は4kより2倍遅く、MAXは4kより5.5倍遅い。
cassandrad 2016

1
ほとんどの場合、varcharからnvarchar(max)への暗黙的なキャストです。これを試してください:DECLARE \ @SomeString NVARCHAR(MAX)、\ @abc NVARCHAR(max)= N'ABC '、\ @StartTime DATETIME; SELECT @startTime = GETDATE(); SELECT TOP 1000000 \ @SomeString = \ @abc FROM master.sys.all_columns ac1、master.sys.all_columns ac2; SELECT testTime = 'MAX'、Duration = DATEDIFF(ms、\ @ StartTime、GETDATE()); ポストするために、変数の前に\を挿入する必要がありました。
Kvasi

4
SSD上のSQL Server 2014:150、156、716(10、4000、MAX)。
Maximの

2
この議論にいくつかの実数を追加してくれてありがとう。テストケースを作成することが洞察する最も速い方法であることをよく忘れます。
David C

13

それを単なる別の安全レベルと考えてください。外部キーの関係なしに(完全に有効な)テーブルを設計し、関連するエンティティが完全にビジネス層に存在することを保証できます。ただし、外部キーは、ビジネスレイヤーで何かが混乱した場合に別の制約レベルを追加するため、優れた設計手法と見なされます。フィールドサイズの制限についても同様で、varchar MAXは使用しません。


8

最大フィールドまたはテキストフィールドを使用しない理由は、SQL Server Enterprise Editionを使用していても、オンラインインデックスの再構築、つまりREBUILD WITH ONLINE = ONを実行できないためです


1
これと同じ制限がTEXTフィールドタイプにも適用されるため、TEXTの代わりにVARCHAR(MAX)を使用する必要があります。
シェーバーは

このため、クラスター化インデックスを再構築できませんでした。列を独自のテーブルに抽出できるようになるまで、多くのディスク容量が必要でした(7秒を超えてテーブルをロックする余裕がありませんでした)
Choco Smith

4

、私が見つけた唯一の問題は、我々は、SQL Server 2005の上の私たちのアプリケーションを開発することで、一つの例では、我々は、私はちょうど学んだSQL Serverの2000をサポートする必要がハードな方法 SQL Server 2000はvarchar型のためにMAXオプション好きではないということかnvarchar。


2
それでは、なぜ最小公分母で開発しないのですか?
binki 2016年

4

フィールドが設定された範囲(たとえば、5〜10文字)になることがわかっている場合は、悪い考えです。長さがどうなるかわからない場合のみ、maxを使用すると思います。たとえば、電話番号が特定の文字数を超えることはありません。

テーブルのすべてのフィールドのおおよその長さの要件について不確かであると正直に言えますか?

私はあなたの要点を理解しています-私が確かにvarchar(max)の使用を検討するいくつかのフィールドがあります。

興味深いことに、MSDNドキュメントはそれをかなりうまくまとめています:

列データエントリのサイズが大幅に異なる場合は、varcharを使用します。列データエントリのサイズが大幅に異なり、サイズが8,000バイトを超える可能性がある場合は、varchar(max)を使用します。

この問題に関する興味深い議論がここにあります


2
電話番号などの場合は、varcharの代わりにcharフィールドを使用するほうがはるかに快適です。ストレージで標準を維持していて、さまざまな国の電話番号を心配する必要がない限り、電話番号(フォーマットなしの10)または郵便番号(5または、最後の4桁を追加する場合は9-10)など
TheTXI

長さが異なる可能性のある電話番号を参照していました。おそらく私はこれを答えに入れるべきです。固定長のものであれば、charフィールドを使用します。
RichardOD

あるいは、コメントでncharまたはcharと言ったほうがいいでしょう。:-)
RichardOD

2
電話番号の文字数は、ほとんどビジネス要件です。番号とともに国際標準コードを格納する必要がある場合は、10を超えることがあります。または、世界の一部の地域で、電話番号の桁が10桁を超える場合があります。IPV4からIPV6への移行のケースを想像してください。古き良きIPV4の日には12桁以上が必要だと主張する人は誰もいなかったでしょう。IPV6が普及すると、うまくいかない可能性があります。これもまた、一定期間にわたるビジネスルールの変更です。言われているように、変化は私たちが期待することができる唯一の一定のものです:)
penslate

2
電話番号フィールドに入力できる文字数、またはそれらの文字の種類を知っていると想定する場合は注意してください。システムがそのデータを使用して実際にダイヤルアウトしない限り(その場合はフォーマットについて厳格にする必要があります)、ユーザーは予想外に長い文字列をそこに合法的に配置する可能性があります。
Vince Bowdren 2013

4

データベースの仕事は、企業が使用できるようにデータを格納することです。そのデータを有用なものにすることの一部は、それが有意義であることを保証することです。名に無制限の文字を入力できるようにしても、意味のあるデータが得られるとは限りません。

これらの制約をビジネスレイヤーに組み込むことは良い考えですが、データベースがそのまま残るとは限りません。データルールに違反していないことを保証する唯一の方法は、データベースで可能な限り低いレベルでルールを実施することです。


6
IMO、データ長の制限は純粋にビジネスルールに基づいており、アプリケーションが成長するにつれて、一定期間にわたって変更される可能性があります。ビジネスロジックでのビジネスルールの変更は、dbレベルよりも簡単です。だから、私はDBは柔軟性に十分であるべきとmaxは、世界あなたの一部に非常に依存している最初の名前の長さを許可するなどのビジネスルールに縛られるべきではないと考えるところでは、ユーザーの生活。
pencilslate

3

1つの問題は、SQL Serverの複数のバージョンを操作する必要がある場合、MAXが常に機能するとは限らないことです。そのため、レガシーDBや、複数のバージョンに関連するその他の状況で作業している場合は、十分に注意する必要があります。


OP側の暗黙の仮定は、彼が完全に2005以上のインスタンスを扱っていること、そして彼のアプリが2000(またはそれより下の)バージョンで動作する必要がないということだと思います。ただし、古いバージョンをサポートする必要がある場合は、完全に同意します。
ジョンルディ

ジョン・ルディ:そうだと想像します。自分がそうするつもりがなかったと思っていたときに、自分でこれらのハードルにぶつかったことを知っています。
TheTXI 2009年

実際、これはSQL CE 4がMAX列タイプをサポートしていないため、相互運用性が面倒なため、最近の問題では依然として一般的な問題です。
JohnC

3

上記で指摘したように、これは主にストレージとパフォーマンスのトレードオフです。少なくともほとんどの場合。

ただし、n / varchar(n)よりもn / varchar(Max)を選択する場合に考慮すべき他の要素が少なくとも1つあります。データにインデックスが付けられますか(姓など)?MAX定義はLOBと見なされるため、MAXとして定義されたものはインデックス作成に使用できません。インデックスがない場合、WHERE句の述語としてデータを含むルックアップは、フルテーブルスキャンに強制されます。これは、データルックアップで取得できる最悪のパフォーマンスです。


2

1)nvarchar(max)とnvarchar(n)を処理する場合、SQLサーバーはより多くのリソース(割り当てられたメモリとCPU時間)を使用する必要があります。ここで、nはフィールドに固有の数値です。

2)パフォーマンスに関してこれはどういう意味ですか?

SQL Server 2005では、15個のnvarchar(max)列を持つテーブルから13,000行のデータをクエリしました。クエリのタイミングを繰り返してから、列をnvarchar(255)以下に変更しました。

最適化前のクエリの平均は2.0858秒でした。変更後のクエリは、平均1.90秒で戻りました。これは、基本的なselect *クエリに対する約184ミリ秒の改善でした。これは8.8%の改善です。

3)私の結果は、パフォーマンスの違いがあったことを示した他のいくつかの記事と一致しています。データベースとクエリに応じて、改善の割合は異なります。多数の同時ユーザーまたは非常に多くのレコードがない場合は、パフォーマンスの違いは問題になりません。ただし、レコード数と同時ユーザー数が増えるほど、パフォーマンスの違いは大きくなります。


1

文字列をパディングして出力をvarchar(max)に入れるudfがありました。調整する列に適切なサイズにキャストバックする代わりにこれを直接使用した場合、パフォーマンスは非常に低下しました。文字列をより小さいサイズに再キャストするためにudfのすべての呼び出し元に依存するのではなく、大きな音符でudfを任意の長さにしました。


1

レガシーシステムのサポート。データを使用しているシステムがあり、それが特定の長さであることが予想される場合、データベースは長さを適用するのに適した場所です。これは理想的ではありませんが、レガシーシステムは理想的ではない場合があります。= P


1

(すべての列の)行のすべてのデータが合理的に8000文字以下になることがない場合は、データ層の設計でこれを強制する必要があります。

データベースエンジンは、ブロブストレージからすべてを除外することで、はるかに効率的です。小さいほど、行を制限できます。ページに詰め込むことができる行が多いほど良いです。より少ないページにアクセスする必要がある場合、データベースのパフォーマンスは向上します。


1

私のテストでは、選択するときに違いがあることが示されています。

CREATE TABLE t4000 (a NVARCHAR(4000) NULL);

CREATE TABLE tmax (a NVARCHAR(MAX) NULL);

DECLARE @abc4 NVARCHAR(4000) = N'ABC';

INSERT INTO t4000
SELECT TOP 1000000 @abc4
    FROM
    master.sys.all_columns ac1,
    master.sys.all_columns ac2;

DECLARE @abc NVARCHAR(MAX) = N'ABC';

INSERT INTO tmax
SELECT TOP 1000000 @abc
    FROM
    master.sys.all_columns ac1,
    master.sys.all_columns ac2;

SET STATISTICS TIME ON;
SET STATISTICS IO ON;

SELECT * FROM dbo.t4000;
SELECT * FROM dbo.tmax;

0

興味深いリンク:TEXTを使用できるのに、なぜVARCHARを使用するのですか?

それはPostgreSQLとMySQLに関するものなので、パフォーマンス分析は異なりますが、「明示性」のロジックは依然として成り立ちます。電子メールアドレスを変数に保存した場合、「80文字に制限された文字列」ではなく「文字列」を使用します。


1
これは、個人の年齢が負の数でないことを確認するためのチェック制約を設定するべきではないと主張するのと同じです。
ジョナサンアレン

データの正確さとパフォーマンスの最適化の違いがわかります。
orip

0

私が見ることができる主な欠点は、あなたがこれを持っているとしましょう:

UIに必要なデータについて最も多くの情報を提供するものはどれですか。

この

            CREATE TABLE [dbo].[BusData](
                [ID] [int] IDENTITY(1,1) NOT NULL,
                [RecordId] [nvarchar](MAX) NULL,
                [CompanyName] [nvarchar](MAX) NOT NULL,
                [FirstName] [nvarchar](MAX) NOT NULL,
                [LastName] [nvarchar](MAX) NOT NULL,
                [ADDRESS] [nvarchar](MAX) NOT NULL,
                [CITY] [nvarchar](MAX) NOT NULL,
                [County] [nvarchar](MAX) NOT NULL,
                [STATE] [nvarchar](MAX) NOT NULL,
                [ZIP] [nvarchar](MAX) NOT NULL,
                [PHONE] [nvarchar](MAX) NOT NULL,
                [COUNTRY] [nvarchar](MAX) NOT NULL,
                [NPA] [nvarchar](MAX) NULL,
                [NXX] [nvarchar](MAX) NULL,
                [XXXX] [nvarchar](MAX) NULL,
                [CurrentRecord] [nvarchar](MAX) NULL,
                [TotalCount] [nvarchar](MAX) NULL,
                [Status] [int] NOT NULL,
                [ChangeDate] [datetime] NOT NULL
            ) ON [PRIMARY]

それともこれ?

            CREATE TABLE [dbo].[BusData](
                [ID] [int] IDENTITY(1,1) NOT NULL,
                [RecordId] [nvarchar](50) NULL,
                [CompanyName] [nvarchar](50) NOT NULL,
                [FirstName] [nvarchar](50) NOT NULL,
                [LastName] [nvarchar](50) NOT NULL,
                [ADDRESS] [nvarchar](50) NOT NULL,
                [CITY] [nvarchar](50) NOT NULL,
                [County] [nvarchar](50) NOT NULL,
                [STATE] [nvarchar](2) NOT NULL,
                [ZIP] [nvarchar](16) NOT NULL,
                [PHONE] [nvarchar](18) NOT NULL,
                [COUNTRY] [nvarchar](50) NOT NULL,
                [NPA] [nvarchar](3) NULL,
                [NXX] [nvarchar](3) NULL,
                [XXXX] [nvarchar](4) NULL,
                [CurrentRecord] [nvarchar](50) NULL,
                [TotalCount] [nvarchar](50) NULL,
                [Status] [int] NOT NULL,
                [ChangeDate] [datetime] NOT NULL
            ) ON [PRIMARY]

3
ビジネスロジックでは、データベーステーブルにその情報を依存させるのではなく、会社名を最大50文字にすることができます。
2012

私はジェフに同意します。永続ストアは、ビジネスルールを定義するのに適切な場所ではないと思います。そして、階層化されたアーキテクチャでは、UIは永続化レイヤーについてさえ知りません。
スタカンベル2012

もちろん、特定の国のISOコードなど、特定のサイズに制限された値を使用している場合を除きます。
ベン

2
それはテーブル定義とどう関係していますか?あなたはまだビジネスロジックを持つことができます。テーブルの設計に関連して、あなたのポイントは意味がないと思います。それでもビジネスレイヤーである種の定義を設計したい場合は、そうしてください。より理にかなったことですが、とにかくビジネス層でストアドプロシージャを使用しています。テーブルデフではない??
カルロスマティーニ

1
それは人気がないようですが、カルロスに同意します。dbが最大サイズを設定する場合は、その上に構築するすべてのレイヤーで、対処しなければならない可能性のあるものを快適にすることができます。データベースに書き込むシステムが複数ある場合、これは特に重要です。
Tim Abell、2016

0

1つの欠点は、予測できない変数を中心に設計することであり、行、ページ、およびエクステントで構成される内部SQL Serverデータ構造を利用する代わりに、おそらく無視することになります。

それは私に考えさせます 、Cでのデータ構造のアラインメントアラインメントを認識することは、一般的には良いこと(TM)と見なされます。同様のアイデア、異なるコンテキスト。

ページとエクステントの MSDNページ

行オーバーフローデータの MSDNページ


0

最初はこれについて考えましたが、次にもう一度考えました。パフォーマンスには影響がありますが、フィールドの実際のサイズを把握するためのドキュメントとしても役立ちます。そして、そのデータベースがより大きなエコシステムに存在する場合は強制されます。私の意見では、鍵は寛容であることですが、理にかなった範囲内である必要があります。

わかりました、これがビジネスとデータレイヤーロジックの問題についての私の気持ちです。それは、DBがビジネスロジックを共有するシステム間の共有リソースである場合、もちろん、そのようなロジックを適用するのに自然な場所であるように見えますが、それを行う最善の方法ではなく、APIを提供することが最善の方法です。これにより、テストされる相互作用と、ビジネスロジックが属する場所での相互作用、システムの分離、システム内の層の分離が維持されます。ただし、データベースが1つのアプリケーションのみにサービスを提供することになっている場合、アジャイルを考えてみましょう。今、何が本当ですか?今のところデザイン。そのようなアクセスが必要な場合は、そのデータにAPIを提供してください。

もちろん、これは理想的な方法です。既存のシステムを使用している場合は、少なくとも短期的には別の方法で実行する必要がある可能性があります。


-1

これにより、パフォーマンスの問題が発生しますが、データベースが小さい場合は実際の問題が発生することはありません。一度に多くのレコードを検索する場合、各レコードはハードドライブ上のより多くのスペースを占有し、データベースはディスクのより多くのセクターを読み取る必要があります。たとえば、小さなレコードは50をセクターに、大きなレコードは5を収めることができます。大きなレコードを使用して、ディスクから10倍のデータを読み取る必要があります。


5
-1。列に格納された長さ100の文字列は、nvarchar(max)列にある場合よりも多くのディスク領域を必要としませんnvarchar(100)
マーティン・スミス

格納されているデータのサイズが大きい場合、あなたが説明していることは正しいですが、この質問は、データ型にパフォーマンスへの影響やその他の考慮事項があるかどうかについてです。

-2

コントロールの幅を予測できなくなるため、画面デザインが難しくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.