Presentation is loading. Please wait.

Presentation is loading. Please wait.

Ouch! Our Data Type Choices Did THAT?

Similar presentations


Presentation on theme: "Ouch! Our Data Type Choices Did THAT?"— Presentation transcript:

1 Ouch! Our Data Type Choices Did THAT?
G. Vern Rabe RabeData, LLC

2 Thank You! local PASS Community & Sponsors!

3 Vern Rabe Independent consultant, trainer MCTA, MCDBA, MCSE, MCITP Co-VP Oregon PASS Chapter Working with/focusing on SQL Server since 1993, starting with SQL Server 4.21a

4 What We’ll Cover Why do we care? Data type by Data type
Performance, accuracy Data type by Data type When to use which Functions and Nuggets What to use, what not to use, some workarounds

5 Accuracy > Performance > Implicit Conversion (SARGable) >
Why Important? Accuracy > Performance > Implicit Conversion (SARGable) >

6 Implicit Conversion Data Type Precedence
user-defined data types (highest) sql_variant xml datetimeoffset datetime2 datetime smalldatetime date time float real decimal money smallmoney bigint int smallint tinyint bit ntext text image rownumber uniqueidentifier nvarchar nchar varchar char varbinary binary (lowest)

7 Data Type Categories Numeric Character Temporal Binary Other

8 Numeric Category bit : 0 or 1 tinyint : 0 to 255 smallint : -32,768 to 32,767 int : -2,147,483,648 to 2,147,483,647 bigint : -9,223,372,036,854,775,808 to 9,223,372,036,854,775,808 decimal, numeric : maximum precision of 38 smallmoney : -214, to 214, money : -922,337,203,685, to 922,337,203,685, float : approx ± 2 * 10 ±308 real : approx ± 2 * 10 ±38

9 Numeric Data Type Issues
Float/real are imprecise/approximate > Money has (early) rounding surprises > More rounding surprises >

10 Precision and Scale of Decimal Operation Results
Result precision Result scale * e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 - e2 e1 * e2 p1 + p2 + 1 s1 + s2 e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1) e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) e1 % e2 min(p1-s1, p2 -s2) + max( s1,s2 ) * The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.

11 Character Category char(N) : 8000 characters nchar(N) : 4000 characters varchar(N) : 8000 characters varchar(MAX) ≈ 2,000,000,000 characters nvarchar(N) : 4000 characters nvarchar(MAX) ≈1,000,000,000 characters) text : ≈ 2,000,000,000 characters ntext : ≈ 1,000,000,000 characters

12 Character Category char(N) : 8000 characters nchar(N) : 4000 characters varchar(N) : 8000 characters varchar(MAX) ≈ 2,000,000,000 characters nvarchar(N) : 4000 characters nvarchar(MAX) ≈1,000,000,000 characters) text : ≈ 2,000,000,000 characters ntext : ≈ 1,000,000,000 characters

13 Size Matters (var)char(small) vs. (var)char(big) – difference? >
Domain integrity (var)char vs. (var)char(n) > (var)char(n) - When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30 varchar(n) vs. char(n) varchar(n) vs. varchar(MAX) Performance Rob Garrison blog –

14 Temporal Category date : 0001-01-01 to 9999-12-31
time : 00:00: to 23:59: datetime2 : to , 100ns precision datetimeoffset : to , 100ns precision smalldatetime : to , precision of 1 minute datetime : to , precision of 3⅓ millisecond (.000, .003, .007, .010 sec)

15 Temporal Category date : 0001-01-01 to 9999-12-31
time : 00:00: to 23:59: datetime2 : to , 100ns precision datetimeoffset : to , 100ns precision smalldatetime : to , precision of 1 minute datetime : to , precision of ~3⅓ millisecond (.000, .003, .007, .010 sec)

16 Temporal Examples Date literals >
‘1/2/11’? ‘ ’? ‘ ’? ? Using BETWEEN to identify day > Adding days > What date is 0 or ‘’ (empty string)? > Eliminating time from datetime >

17 Binary Category binary(N) : 8000 bytes varbinary(N) : 8000 bytes varbinary(MAX) ≈ 2,000,000,000 bytes image : ≈ 2,000,000,000 bytes

18 Binary Category binary(N) : 8000 bytes varbinary(N) : 8000 bytes varbinary(MAX) ≈ 2,000,000,000 bytes image : ≈ 2,000,000,000 bytes

19 Other Category cursor timestamp/rowversion hierarchyid uniqueidentifier sql_variant xml table

20 Other Category cursor timestamp/rowversion hierarchyid uniqueidentifier sql_variant xml table

21 Functions ISNUMERIC > TRY_CONVERT / TRY_CAST > ISDATE >
Watch out for empty strings ISDATE > Doesn’t cover entire date range Doesn’t support full resolution of datetime2 CURRENT_TIMESTAMP vs. GETDATE() vs. SYSDATETIME() vs. GETUTCDATE() vs. SYSUTCDATETIME() ISNULL vs. COALESCE > ISNULL returns data type of first argument COALESCE returns data type of highest precedence

22 Summary Pick data types with consideration Avoid deprecated data types
Size matters Domain constraint Avoid deprecated data types Beware of implicit conversions Not SARGable Unexpected results Use functions with caution

23 Thanks Questions? Contact information @VernRabe LinkedIn References Don’t use datetime or smalldatetime


Download ppt "Ouch! Our Data Type Choices Did THAT?"

Similar presentations


Ads by Google