SQL 數據類型和 SmallInt/TinyInt 與正常整數
使用正確的數據類型對 SQL Server 有什麼好處?
例子:
- SmallInt/TinyInt 與正常整數
- 小數(2)與浮點數
- varchar(100) 與 char(100)
這些天,現代計算真的很重要嗎?
謝謝,
使用正確的數據類型對 SQL Server 有什麼好處?
如果您使用正確的數據類型,您的數據庫將更好地匹配您的模型,並且在空間和速度方面更有可能高效。您可能會因為“太寬泛”而關閉這個問題,因為它可能是一個相當廣泛的主題。
要觸及您更具體的觀點:
SmallInt/TinyInt 與正常整數
較小的類型占用的空間更少,因此頁面中可以容納更多的行,從而減少了磁碟和記憶體中佔用的空間。當然,如果您選擇的類型太小,您的應用程序將會失敗。還要考慮
BIGINT
何時可能需要大於 2,147,483,648(或小於 -2,147,483,647)的值。當您考慮索引時,差異會成倍增加:較大的類型最終會出現在任何涵蓋列的索引中。
小數(2)與浮點數
這裡有很大的不同。
DECIMAL
(及其同義詞NUMERIC
)實際上是按比例縮放的整數,保證具有您指定的精度。浮點數有其用途,但要非常小心,因為它們只是近似值,因為在二進制和十進制形式之間轉換的捨入問題 - 最常見的例子是 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)
它們,它們可能會被儲存在頁外,這會再次降低效率,並且如果您在表上使用它,則會停止壓縮生效。如果您使用行或頁面壓縮,您的固定長度類型無論如何都會變為可變長度,但您保留了對您的模型可能有用的內置長度驗證。這些天,現代計算真的很重要嗎?
簡短的回答:是的。
長答案:yyyyyyyyeeeeeeeeeeesssssssssssssssssss!
現代 CPU 的考慮可能會有所不同——它們相對於儲存和網路傳輸速度可能比以前快得多,因此以額外的 CPU 時間為代價來節省空間通常是一個很好的優化,但正確的類型選擇仍然很重要。
儘管類型選擇對於優化以外的問題最為重要:正確的類型可以更好地為您的數據建模,這應該是您的首要任務。