3

私は通常、SOで質​​問に対する回答を見つけることができますが、このトピックに関する情報を見つけることができません(間違った質問をしている可能性があります)。

背景:6年前、一部の開発者はVisualFoxProデータベースをSQLServer 2005(テーブルの構造とデータ)にアップサイズしました。このプロセスにより、データ構造とパフォーマンスを改善するために修正しようとしているさまざまなバグが発生しました(TEXTをVARCHAR(MAX)に変更し、一部のFloatをDECIMALに変更し、未使用の列を削除します...)

私の以前のタスクは、対応するデフォルトオブジェクトが存在しなかったすべてのテーブルのすべての列に割り当てられたすべてのデフォルト制約を見つけて、 / 、などにsys.default_constraints空の文字列を割り当てて修正することでした...(の30%以上壊れた列...はい私は知っています-_-wtf!.私のスクリプトはスムーズに機能しました。charvarchar0Decimal

楽しみのために、これらのテーブルの1つで固定列を検証しましたが、変更しなかった列のデフォルト値が、使用していた単純な空の文字列ではなく、であるSP_HELPことに気付きました。char(space((1)))''

私の質問は:これらの列をデフォルト値のままにしておくべきです(space((1)))か?または、次のように変更する必要が''あります(スクリプトを変更するのは本当に簡単です)。

私の賭けは、それを変更する必要があるということです(すべての挿入で関数を呼び出すことは無料ではありません)が、最初に確認するように依頼したかったのです。

PD:私はDBAではありませんが、時々DBAハットを使用しなければならない開発者です。

4

2 に答える 2

3

多くの場合、議論はnullとデフォルトの空の文字列についてです(dba.seの議論はここにあります)。この場合、主な懸念事項は、アプリケーションのいずれかの部分が列内の単一のスペースに基づいてロジックを実行するかどうかだと思います。ストレージと速度の懸念はこれに比べて最小限であり、最大のテーブルと最高のTPSの場合以外ではおそらく無視できます。また、無料ではないとおっしゃっていたとしてもinsert ' 'insert ''との間の意味のあるパフォーマンスの違いを確実に検出することは難しいと思います。insert space(1)

アップデート

このデフォルトがあるとあなたがchar列だけに言及していることに気づきました。この場合、空の文字列または単一のスペースを挿入することは、列の長さまでのスペースとして格納されるため、実際には重要ではないと思います。

create table #CharTest ( Chars char(2) )
insert into #CharTest select ''
insert into #CharTest select ' '
insert into #CharTest select '  '
select distinct Chars from #CharTest
-- returns 1 row!

この時点で、スペースを削除して、空の文字列をデフォルトにすることができます。潜在的な注意点の1つは、null許容のchar列があり、作成時にANSI_PADDINGがオフになっていた場合です。ただし、ansi-nulls、char、varchar、およびnullibilityのさまざまな組み合わせをテストしているときに、falseの状況を思い付くことができません'' = ' '(とにかく、SQL Server 2008 R2では)。うーん...私はいくつかの読書をする必要があります。

于 2013-02-07T17:49:02.710 に答える
1

アプリケーションが問題にとらわれない場合、考慮すべきことの1つは、長さがゼロのvarchar列は、単一のスペース列よりもわずかに少ないスペースを占めることです。

列の値として1行あたり1バイトを節約し、その後に空でない可変長の列が続かない場合は、列オフセット配列にさらに2バイトを節約する可能性があります。

私はおそらくNULLこれらのどちらかではなく使用するでしょう。

于 2013-02-07T17:48:18.987 に答える