web-dev-qa-db-ja.com

SQLデータ型とSmallInt / TinyIntと通常の整数

SQL Serverが適切なデータ型を使用する利点は何ですか?

例:

  1. SmallInt/TinyIntと通常の整数
  2. Decimal(2)対float
  3. Varchar(100)とchar(100)

最近のコンピューティングでは、最近本当に問題になるのでしょうか?

おかげで、

4
user129291

SQL Serverが適切なデータ型を使用する利点は何ですか?

適切なデータ型を使用する場合、データベースはモデルによりよく一致し、スペースと速度の両方の点で効率的です。この質問は非常に広い主題になる可能性があるため、「広すぎる」として閉じられるリスクがあります。

より具体的なポイントに触れるには:

SmallInt/TinyIntと通常の整数

型が小さいとスペースが少なくて済むため、ページにより多くの行が収まり、ディスクとメモリの両方で使用されるスペースが少なくなります。もちろん、小さすぎるタイプを選択すると、アプリケーションは失敗します。 2,147,483,648より大きい(または-2,147,483,647より小さい)値が必要になる可能性がある場合は、BIGINTも検討してください。

インデックスを検討すると、違いが倍になります。大きなタイプは、列をカバーするすべてのインデックスにも適用されます。

Decimal(2)対float

ここには大きな違いがあります。 DECIMAL(およびその同義語NUMERIC)は、指定した精度を持つことが保証されている実際にスケーリングされた整数です。浮動小数点数には用途がありますが、2進法と10進法の間の変換の丸めの問題による近似にすぎないため、注意が必要です。最も一般的な例は0.1 + 0.2で、通常は0.3に等しくありません。詳細については、他の多くのリファレンスの中で http://floating-point-gui.de/ を参照し、これを実行して効果を直接確認してください。

SELECT CAST(0.1 AS FLOAT        ) + CAST(0.2 AS FLOAT        ), CASE WHEN CAST(0.1 AS FLOAT        ) + CAST(0.2 AS FLOAT        ) = 0.3 THEN 'OK' ELSE 'oops' END
SELECT CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2)), CASE WHEN CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2)) = 0.3 THEN 'OK' ELSE 'oops' END

基本的に、必要なものであることがわかっている場合を除き、FLOATを使用しないでください。

Varchar(100)とchar(100)

可変長型は、スペースに関してははるかに効率的ですが、CPUに関しては効率的ではありません。 (MAX)を使用すると、ページ外に格納される可能性が高くなり、効率が低下し、テーブルで使用すると圧縮の効果が停止します。行またはページ圧縮を使用する場合、固定長タイプはとにかく可変長になりますbutあなたはモデルに役立つ可能性がある組み込みの長さの検証を保持します。

最近のコンピューティングでは、最近問題になるのでしょうか?

短い答え:はい。
長い答え:Yyyyyyyyeeeeeeeeeeeeesssssssssssss!

最近のCPUでは、考慮事項が少し異なる場合があります。ストレージやネットワーク転送に比べて、以前よりもはるかに高速になる可能性があるため、余分なCPU時間を犠牲にしてスペースを節約するための優れた最適化ですが、正しいタイプを選択します非常に重要です。

最適化以外の問題では、タイプの選択が最も重要ですが、正しいタイプは、最優先すべきデータをより適切にモデル化します。

17
David Spillett

適切なタイプを使用する利点は、SQL Serverがこのタイプまたはそのタイプのデータを格納するために使用する[〜#〜] memory [〜#〜]です。 。

  1. TinyInt-1バイト(0〜255の整数値を格納できます)
  2. SmallInt-2バイト(整数値を格納できます-32,768-32,767)
  3. Int-4バイト(整数値-2 ^ 31-2 ^ 31 -1を格納できます)
  4. BigInt-8バイト(整数値を格納できます-2 ^ 63-2 ^ 63 -1)
  5. Varchar(n)-n記号以下の文字列を格納できます。文字列内のすべてのシンボルごとに1バイトを使用します。

    _DECLARE @String varchar(100) = 'Hi' -- 2bytes
    DECLARE @String varchar(100) = 'Hello' -- 5bytes
    _
  6. char(n)-n記号以下の文字列を格納できます。 nバイトのメモリを使用し、そこにシンボルをいくつ入れても問題ありません。

    _DECLARE @String char(100) = 'Hi' -- 100bytes
    DECLARE @String char(100) = 'Hello' -- 100bytes
    _

floatdecimalのデータ型の違いを読むことができます here

最近のコンピューティングでも、それは今日でも間違いなく重要です。それは非常に長い間問題になると思います。適切なデータ型を使用すると、MBsを節約できます。 GBsでさえ時々。

Aaron Bertrandの記事 here をご覧ください。

それはあなたのために物事を明確にします。

2
George K