datetime2 (0) vs datetime2 (2)


15

ตามเอกสารdatetime2 (Transact-SQL) :

ขนาดหน่วยเก็บข้อมูล
6 ไบต์สำหรับ precisions น้อยกว่า 3
7 ไบต์สำหรับ precensions 3 และ 4 ข้อกำหนด
อื่น ๆ ทั้งหมดต้องการ 8 ไบต์

ขนาดของdatetime2(0), datetime2(1), datetime2(2)ใช้เงินเดียวกันของการจัดเก็บ (6 bytes)

ฉันจะถูกต้องหรือไม่ในการบอกว่าฉันอาจไปด้วยdatetime2(2)และได้รับประโยชน์จากความแม่นยำโดยไม่มีค่าใช้จ่ายเพิ่มเติม

โปรดทราบ:

  • คอลัมน์นี้ถูกทำดัชนีด้วย PK เพื่อจัดทำดัชนีแบบคลัสเตอร์ผสม (ใช้สำหรับการแบ่งตาราง)
  • ฉันไม่สนใจเกี่ยวกับมิลลิวินาที

จะdatetime2(0)เป็นซีพียูที่มีประสิทธิภาพเมื่อใช้ในประโยคหรือเมื่อแสวงหาผ่านดัชนี?

นี่เป็นตารางขนาดใหญ่ดังนั้นการเพิ่มประสิทธิภาพขนาดเล็กที่สุดจะสร้างความแตกต่างอย่างมาก

คำตอบ:


26

ขนาดของ dateTime2 (0), dateTime2 (1), dateTime2 (2), dateTime2 (3) ใช้พื้นที่เก็บข้อมูลเท่ากัน (6 ไบต์)

ฉันจะถูกต้องหรือไม่ในการบอกว่าฉันอาจใช้ dateTime2 (3) และได้รับประโยชน์จากความแม่นยำโดยไม่มีค่าใช้จ่ายเพิ่มเติม

ไม่คุณแปลเอกสารผิด หมายเหตุ doc ระบุขนาดหน่วยเก็บข้อมูล 6 ไบต์สำหรับการกำหนดน้อยกว่า 3 (การเน้นที่เหมือง) ดังนั้นความแม่นยำเท่ากับ 3 จะต้องมี 7 ไบต์

หากคุณไม่สนใจมิลลิวินาทีdatetime2(0)ก็จะเป็นประเภทข้อมูลและความแม่นยำที่เหมาะสม วิธีปฏิบัติที่ดีที่สุดคือการระบุชนิดข้อมูลและความแม่นยำที่เหมาะสมตามข้อมูลที่จัดเก็บเนื่องจากจะให้การจัดเก็บและประสิทธิภาพที่ดีที่สุด ที่ถูกกล่าวว่าฉันจะไม่คาดหวังผลกระทบอย่างมีนัยสำคัญประสิทธิภาพตามความแม่นยำ datetime2 ที่ระบุตราบใดที่ขนาดการจัดเก็บจะเหมือนกัน แต่ฉันไม่ได้ทดสอบเฉพาะว่าตัวเอง

ข้อกำหนดของแอปพลิเคชันจะกำหนดสิ่งที่ต้องเก็บไว้ในฐานข้อมูลเมื่อมีความแม่นยำมากขึ้นในแหล่งข้อมูล ตัวอย่างเช่นสำหรับเวลารายการสั่งซื้อที่มาจากSYSDATETIME()ผู้ใช้อาจไม่ต้องการความแม่นยำ 100 นาโนวินาที อีกครั้งเลือกประเภทข้อมูลและความแม่นยำสำหรับการพัฒนาใหม่ตามข้อกำหนดและโดยทั่วไปคุณจะได้รับประสิทธิภาพที่ดีที่สุดโดยไม่ต้องคิดเพิ่มเติม:

  • วันที่ - คุณไม่ต้องการเวลา
  • smalldatetime - คุณไม่ต้องการวินาที
  • datetime2 (0) - คุณไม่จำเป็นต้องมีเศษส่วนเป็นวินาที
  • datetime2 (1-7) - คุณต้องการวินาทีเศษส่วนของความแม่นยำที่ระบุ
  • datetimeoffset (0-7) - คุณต้องการวันที่และเวลาที่มีการรับรู้เขตเวลา
  • เวลา (0-7) - คุณต้องการเวลาเท่านั้น (ไม่มีวันที่) ด้วยเศษส่วนวินาทีของความแม่นยำที่ระบุ

แม้ว่า datetime2 จะเหมาะสมที่สุดสำหรับการพัฒนาใหม่ตามที่ระบุข้างต้นบางครั้งอาจจำเป็นต้องใช้datetime (ความแม่นยำคงที่ 3 ที่มีความแม่นยำ 1/300 เศษส่วนวินาที) แทนการใช้งานร่วมกับแอปพลิเคชัน datetime ดั้งเดิมดังนั้นจึงหลีกเลี่ยงการแปลงโดยนัย ค่าใช้จ่ายของความแม่นยำที่สองเศษส่วนและการจัดเก็บที่เพิ่มขึ้น

พิจารณาว่าการจัดเก็บความแม่นยำสูงกว่าที่ต้องการอาจมีค่าใช้จ่ายในการพัฒนา หากมีการเก็บส่วนประกอบเวลาที่มีเศษส่วนเป็นวินาทีเมื่อต้องการเพียงความแม่นยำที่สองทั้งหมดการสืบค้นจะยังต้องพิจารณาเศษส่วนวินาทีเพื่อส่งคืนผลลัพธ์ที่ถูกต้อง ตัวอย่างเช่นกับแอพที่ผู้ใช้เลือกช่วงเวลาผ่าน UI ที่อนุญาตให้ใช้เวลาเพียงไม่กี่วินาทีเท่านั้นรหัสแอปจะต้องมีการนับเป็นเศษส่วนของวินาทีในค่าช่วงเวลาสิ้นสุดและปรับค่าที่ผู้ใช้จัดหาตามนั้น (เช่นWHERE OrderEntryTime BETWEEN '2017-01-11T08:00:00.00.00' AND '2017-01-11T08:59:59.99'หรือWHERE OrderEntryTime >= '2017-01-11T08:00:00.00' AND OrderEntryTime < '2017-01-11T09:00:00.00') สิ่งนี้จะเพิ่มความซับซ้อนของรหัส


ขออภัยที่จะชนในหัวข้อเก่านี้เพียงโน้ตเล็ก ๆ นี้ แต่อายุน้อยจะมีทั้งวินาที (เช่น hh: mm: ss)
pgfiore


@pgfiore, เอกสารระบุความถูกต้องหนึ่งนาทีและคุณจะพบว่ามันถูกต้องด้วย smalldatetimeSELECT CAST(GETDATE() AS smalldatetime);
Dan Guzman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.