คำถามติดแท็ก uniqueidentifier

7
Guid vs INT - คีย์ไหนดีกว่ากัน?
ผมเคยถูกอ่านไปรอบ ๆ เหตุผลที่จะใช้หรือไม่และGuidint intมีขนาดเล็กลงเร็วขึ้นและง่ายต่อการจดจำตามลำดับเวลา และสำหรับGuidข้อได้เปรียบเดียวที่ฉันพบคือมันไม่เหมือนใคร ในกรณีGuidใดจะดีกว่าintและทำไม? จากสิ่งที่ฉันเห็นintไม่มีข้อบกพร่องยกเว้นโดยการ จำกัด จำนวนซึ่งในหลายกรณีไม่เกี่ยวข้อง ทำไมถึงถูกGuidสร้างขึ้นมา? ฉันคิดว่ามันมีจุดประสงค์อื่นนอกเหนือจากการให้บริการเป็นกุญแจหลักของตารางง่ายๆ (ตัวอย่างของแอปพลิเคชันจริงที่ใช้Guidกับบางสิ่ง) (Guid = UniqueIdentifier) ​​พิมพ์บน SQL Server

3
ชนิดข้อมูลที่เหมาะสมที่สุดสำหรับเขตข้อมูล MD5 คืออะไร
เรากำลังออกแบบระบบที่รู้กันว่าอ่านยาก (ตามคำสั่งของการอ่านหมื่นครั้งต่อนาที) มีตารางnamesที่ทำหน้าที่จัดเรียงรีจิสทรีกลาง แต่ละแถวมีtextเขตข้อมูลrepresentationและไม่ซ้ำกันkeyซึ่งเป็นแฮช MD5 ของสิ่งrepresentationนั้น 1ตารางนี้มีระเบียนหลายสิบล้านระเบียนและคาดว่าจะเติบโตเป็นพันล้านตลอดอายุการใช้งานแอปพลิเคชัน มีตารางอื่น ๆ อีกหลายสิบตาราง (ของสคีมาที่แตกต่างกันอย่างมากและจำนวนเรคคอร์ด) ที่อ้างอิงถึงnamesตาราง ระเบียนใดก็ตามที่ระบุในตารางใดตารางหนึ่งเหล่านี้รับประกันว่าจะมี a name_keyซึ่งเป็น foreign key ไปยังnamesตาราง 1: อนึ่งตามที่คุณคาดไว้ระเบียนในตารางนี้จะไม่เปลี่ยนรูปเมื่อมีการเขียน สำหรับตารางใดก็ตามที่ไม่ใช่namesตารางแบบสอบถามที่พบบ่อยที่สุดจะเป็นไปตามรูปแบบนี้: SELECT list, of, fields FROM table WHERE name_key IN (md5a, md5b, md5c...); ฉันต้องการปรับให้เหมาะสมสำหรับการอ่าน ฉันสงสัยว่าจุดแรกของฉันควรจะลดขนาดของดัชนี (แม้ว่าฉันจะไม่ได้รับการพิสูจน์ว่าผิด) คำถาม: อะไรคือ / ชนิดข้อมูลที่ดีที่สุดสำหรับkeyและname_keyคอลัมน์คืออะไร? มีเหตุผลที่จะใช้hex(32)มากกว่าbit(128)? BTREEหรือGIN?

2
การแทนค่าภายในของ SQL Server UniqueIdentifier / GUID
เพื่อนร่วมงานของฉันส่งคำถามที่น่าสนใจมาให้ฉันซึ่งฉันไม่สามารถอธิบายได้ทั้งหมด เขารันโค้ดบางส่วน (รวมอยู่ด้านล่าง) และได้ผลลัพธ์ที่ไม่คาดคิดมาบ้าง เป็นหลักเมื่อแปลงUniqueIdentifier(ซึ่งฉันจะอ้างถึงGuidจากที่นี่จาก) เป็นประเภทbinary(หรือvarbinary) ลำดับของครึ่งแรกของผลลัพธ์จะย้อนกลับ แต่ครึ่งหลังไม่ใช่ ความคิดแรกของฉันคือการ endianness ของระบบเป็นสาเหตุและที่Guidแสดงถูกเก็บรักษาไว้ แต่binaryแบบฟอร์มไม่รับประกัน เห็นได้ชัดว่านี่เป็นรายละเอียดการใช้งาน แต่ฉันสงสัยว่ามีคำอธิบายที่ดีหรือไม่ รหัส: declare @guid uniqueidentifier = '8A737954-CBEC-40CE-A534-2AFFB5A0E207'; declare @binary binary(16) = (select convert(binary(16), @guid)); select @guid as [GUID], @binary as [Binary]; ผล: GUID Binary 8A737954-CBEC-40CE-A534-2AFFB5A0E207 0x5479738AECCBCE40A5342AFFB5A0E207 อย่างที่คุณเห็นครึ่งแรกของGuid(ตลอดทาง40CE) จะถูกเก็บไว้ด้านหลังสำหรับแต่ละส่วน นั่นคือส่วนแรกของGuidย้อนหลังจากนั้นส่วนที่สองจากนั้นส่วนที่สาม แต่ลำดับของส่วนจะถูกเก็บรักษาไว้ Guidหลังจากนั้นสองคนสุดท้ายส่วนจะถูกเก็บไว้ในลำดับที่แน่นอนที่พวกเขาปรากฏใน มีใครอธิบายเรื่องนี้ได้บ้าง (ชุดทดสอบที่มีขนาดใหญ่กว่านั้นรวมอยู่ด้านล่าง) รหัส: declare @guid_to_binary table …

3
สร้าง UNIQUEIDENTIFIER อย่างปลอดภัยใน SQL Server
ฉันตั้งใจจะใช้UNIQUEIDENTIFIERเป็นคีย์การเข้าถึงที่ผู้ใช้สามารถใช้เพื่อเข้าถึงข้อมูลบางอย่าง กุญแจจะทำหน้าที่เป็นรหัสผ่านในแง่นั้น ฉันจำเป็นต้องสร้างตัวระบุหลายตัวเป็นส่วนหนึ่งของINSERT...SELECTคำสั่ง ด้วยเหตุผลทางสถาปัตยกรรมฉันต้องการสร้างตัวระบุฝั่งเซิร์ฟเวอร์ในกรณีนี้ ฉันจะสร้างแบบสุ่มที่ปลอดภัยได้UNIQUEIDENTIFIERอย่างไร โปรดทราบว่าNEWIDจะไม่สามารถสุ่มได้มากพอเนื่องจากไม่ได้รับประกันคุณสมบัติความปลอดภัยใด ๆ เลย ฉันกำลังมองหา SQL Server ที่เทียบเท่ากับSystem.Security.Cryptography.RandomNumberGeneratorเพราะฉันต้องการ ID ที่ไม่สามารถคาดเดาได้ สิ่งใดขึ้นอยู่กับCHECKSUM, RANDหรือGETUTCDATEยังจะได้มีสิทธิ์

5
GUID ตามลำดับหรือใหญ่สำหรับตารางฐานข้อมูล 'ใหญ่' PK
ฉันรู้ว่าคำถามประเภทนี้เกิดขึ้นมากมาย แต่ฉันยังไม่ได้อ่านข้อโต้แย้งที่น่าสนใจใด ๆ เพื่อช่วยในการตัดสินใจ กรุณาทนกับฉัน! ฉันมีฐานข้อมูลขนาดใหญ่ - มันเติบโตประมาณ 10,000,000 รายการต่อวัน ข้อมูลมีความสัมพันธ์และสำหรับเหตุผลด้านประสิทธิภาพฉันโหลดตารางด้วย BULK COPY ด้วยเหตุนี้ฉันจำเป็นต้องสร้างคีย์สำหรับแถวและไม่สามารถพึ่งพาคอลัมน์ตัวตน เลขจำนวนเต็ม 64- บิต - ใหญ่ - กว้างพอสำหรับฉันที่จะใช้ แต่เพื่อรับประกันเอกลักษณ์ฉันต้องมีเครื่องกำเนิดส่วนกลางเพื่อสร้าง ID ของฉันให้ฉัน ขณะนี้ฉันมีบริการตัวสร้างซึ่งอนุญาตให้บริการสำรองหมายเลขลำดับ X และรับประกันว่าไม่มีการชนกัน อย่างไรก็ตามผลที่ตามมาก็คือบริการทั้งหมดที่ฉันเชื่อถือได้จากเครื่องกำเนิดไฟฟ้าส่วนกลางนี้และดังนั้นฉันจึงถูก จำกัด ในวิธีที่ฉันสามารถกระจายระบบของฉันและฉันไม่พอใจกับการพึ่งพาอื่น ๆ (เช่นต้องใช้การเข้าถึงเครือข่าย) โดยการออกแบบนี้ นี่เป็นปัญหาในบางโอกาส ตอนนี้ฉันกำลังพิจารณาการใช้ GUID ตามลำดับเป็นคีย์หลักของฉัน (สร้างจาก SQL ภายนอก) เท่าที่ฉันสามารถตรวจสอบได้จากการทดสอบของฉันเองข้อเสียเปรียบเพียงอย่างเดียวคือค่าใช้จ่ายในพื้นที่ดิสก์ของประเภทข้อมูลที่กว้างขึ้น (ซึ่งเป็นที่มาจากการใช้งานในดัชนี) ฉันไม่ได้เห็นการชะลอตัวที่มองเห็นได้ในประสิทธิภาพการค้นหาเมื่อเทียบกับทางเลือกที่ใหญ่ การโหลดตารางด้วย BULK COPY ช้ากว่าเล็กน้อย แต่ไม่มากนัก ดัชนีที่ใช้ GUID …

3
การจัดทำดัชนี PK GUID ใน SQL Server 2012
นักพัฒนาของฉันได้ติดตั้งแอปพลิเคชันของพวกเขาเพื่อใช้ GUID เป็น PK สำหรับตารางทั้งหมดของพวกเขาและโดยค่าเริ่มต้น SQL Server ได้ตั้งค่าดัชนีคลัสเตอร์บน PK เหล่านี้ ระบบนี้ค่อนข้างใหม่และตารางที่ใหญ่ที่สุดของเรามีมากกว่าหนึ่งล้านแถว แต่เรากำลังดูการจัดทำดัชนีของเราและต้องการให้สามารถปรับขนาดได้อย่างรวดเร็วเนื่องจากอาจมีความจำเป็นในอนาคตอันใกล้ ดังนั้นความโน้มเอียงแรกของฉันคือการย้ายดัชนีคลัสเตอร์ไปยังเขตข้อมูลที่สร้างขึ้นซึ่งเป็นตัวแทนขนาดใหญ่ของ DateTime อย่างไรก็ตามวิธีเดียวที่ฉันสามารถสร้าง CX ที่ไม่เหมือนใครคือการรวมคอลัมน์ GUID ใน CX นี้ แต่เรียงลำดับโดยสร้างขึ้นก่อน นี่จะทำให้คีย์การทำคลัสเตอร์กว้างเกินไปและจะเพิ่มประสิทธิภาพสำหรับการเขียนหรือไม่ การอ่านมีความสำคัญเช่นกัน แต่การเขียนอาจเป็นปัญหาที่ใหญ่กว่าในตอนนี้

8
คอลัมน์ตัวตนหรือ UDF ที่สร้างรหัสเฉพาะอย่างชัดเจน?
ผมอยู่ในช่วงกลางของการอภิปรายเกี่ยวกับว่ามันจะดีกว่าที่จะทำให้PRIMARY KEYออกมาจากคอลัมน์ประจำตัวของเราออกจาก UDF ที่ชัดเจนสร้างรหัสที่ไม่ซ้ำกัน ฉันโต้เถียงกับคอลัมน์ข้อมูลประจำตัว คู่ของฉันกำลังโต้เถียงในการสร้างค่าด้วยตนเองเขาอ้างว่า โดยใส่ UDF ลงในตารางอื่นที่เราสามารถมี UDF ได้ ล็อคทรัพยากร เพิ่มตาราง ID ด้วยหนึ่งฟิลด์ที่เรียกID_Valueโดย1 ใช้สิ่งนี้เป็นตัวระบุที่ไม่ซ้ำกันระดับโลก หรือมีตารางทำid+1เมื่อแทรก ง่ายกว่าที่จะย้ายข้อมูลระหว่างเซิร์ฟเวอร์และ / หรือสภาพแวดล้อมที่ไม่มีข้อ จำกัด ในการระบุ ย้ายจากฐานข้อมูลหนึ่งที่มีข้อมูลไปยังฐานข้อมูลอื่นที่คล้ายกันพร้อมให้บอกว่าการจัดเตรียมหรือข้อมูลจำลอง สำหรับการทดสอบที่ไม่ใช่การผลิตเราอาจต้องการดึงระเบียนทั้งหมดจากเมื่อวานนี้ลงไปยังการจัดเตรียมสำหรับการทดสอบ การใช้งานแบบใดที่เหมาะสมกว่า

2
ฉันควรใช้ UUID เช่นเดียวกับ ID
ฉันใช้ UUID ในระบบของฉันมาระยะหนึ่งแล้วด้วยเหตุผลหลายประการตั้งแต่การบันทึกไปจนถึงความสัมพันธ์ที่ล่าช้า รูปแบบที่ฉันใช้เปลี่ยนไปเมื่อฉันไร้เดียงสาน้อยลงจาก: VARCHAR(255) VARCHAR(36) CHAR(36) BINARY(16) เมื่อฉันไปถึงขั้นสุดท้ายBINARY(16)ที่ฉันเริ่มเปรียบเทียบประสิทธิภาพกับจำนวนเต็มพื้นฐานที่เพิ่มขึ้นอัตโนมัติ การทดสอบและผลลัพธ์แสดงไว้ด้านล่าง แต่ถ้าคุณต้องการสรุปก็แสดงว่าINT AUTOINCREMENTและBINARY(16) RANDOMมีประสิทธิภาพเหมือนกันในช่วงข้อมูลสูงสุด 200,000 (ฐานข้อมูลถูกเติมข้อมูลล่วงหน้าก่อนการทดสอบ) ตอนแรกฉันสงสัยว่าจะใช้ UUID เป็นคีย์หลักและแน่นอนฉันก็ยังอยู่ แต่ฉันเห็นศักยภาพที่นี่เพื่อสร้างฐานข้อมูลที่ยืดหยุ่นที่สามารถใช้ทั้งสองได้ ในขณะที่หลายคนเครียดกับข้อได้เปรียบของทั้งสองข้อเสียอะไรที่ถูกยกเลิกโดยการใช้ข้อมูลทั้งสองชนิด? PRIMARY INT UNIQUE BINARY(16) กรณีการใช้งานสำหรับการตั้งค่าประเภทนี้จะเป็นคีย์หลักดั้งเดิมสำหรับความสัมพันธ์ระหว่างตารางโดยมีตัวระบุเฉพาะที่ใช้สำหรับความสัมพันธ์ระหว่างระบบ สิ่งที่ฉันพยายามค้นพบเป็นหลักคือประสิทธิภาพที่แตกต่างระหว่างสองแนวทาง นอกเหนือจากพื้นที่ดิสก์สี่เท่าที่ใช้ซึ่งอาจเล็กน้อยมากหลังจากเพิ่มข้อมูลเพิ่มเติมพวกเขาดูเหมือนจะเหมือนกัน schema: -- phpMyAdmin SQL Dump -- version 4.0.10deb1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Sep 22, 2015 at 10:54 AM …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.