ฉันตระหนักว่า CHAR แนะนำถ้าค่าทั้งหมดของฉันเป็นความกว้างคงที่ แต่อะไรนะ? ทำไมไม่เพียงแค่เลือก VARCHAR สำหรับฟิลด์ข้อความทั้งหมดเพื่อความปลอดภัย
ฉันตระหนักว่า CHAR แนะนำถ้าค่าทั้งหมดของฉันเป็นความกว้างคงที่ แต่อะไรนะ? ทำไมไม่เพียงแค่เลือก VARCHAR สำหรับฟิลด์ข้อความทั้งหมดเพื่อความปลอดภัย
คำตอบ:
โดยทั่วไปรับCHARถ้าแถวทั้งหมดจะต้องใกล้เคียงกับระยะเวลาเดียวกัน เลือกVARCHARเมื่อความยาวแตกต่างกันมาก CHAR อาจเร็วขึ้นอีกเล็กน้อยเนื่องจากแถวทั้งหมดมีความยาวเท่ากัน
มันแตกต่างกันไปตามการใช้งานฐานข้อมูล แต่โดยทั่วไป VARCHAR ใช้ที่เก็บข้อมูลหนึ่งหรือสองไบต์เพิ่มเติม (สำหรับความยาวหรือการเลิกจ้าง) นอกเหนือจากข้อมูลจริง ดังนั้น (สมมติว่าคุณกำลังใช้ชุดอักขระไบต์เดียว) การจัดเก็บคำว่า "FooBar"
บรรทัดล่างคือCHARสามารถเร็วขึ้นและมีพื้นที่มากขึ้นสำหรับข้อมูลที่มีความยาวเท่ากัน (ภายในความแตกต่างของความยาวอักขระสองตัว)
หมายเหตุ : Microsoft SQL มีค่าใช้จ่าย 2 ไบต์สำหรับ VARCHAR สิ่งนี้อาจแตกต่างจาก DB ถึง DB แต่โดยทั่วไปจะต้องมีค่าใช้จ่ายอย่างน้อย 1 ไบต์เพื่อระบุความยาวหรือ EOL ใน VARCHAR
ตามที่ Gaven ชี้ให้เห็นในความคิดเห็นหากคุณใช้หลายไบต์ชุดอักขระความยาวผันแปรเช่น UTF8 CHAR จะเก็บจำนวนไบต์สูงสุดที่จำเป็นในการจัดเก็บจำนวนอักขระ ดังนั้นถ้า UTF8 ต้องการมากที่สุด 3 ไบต์เพื่อเก็บอักขระ CHAR (6) จะถูกแก้ไขที่ 18 ไบต์แม้ว่าจะเก็บอักขระ latin1 เท่านั้น ดังนั้นในกรณีนี้ VARCHAR จึงเป็นทางเลือกที่ดีกว่ามาก
หากคุณทำงานกับฉันและคุณกำลังทำงานกับ Oracle ฉันอาจจะทำให้คุณใช้งานได้varchar
เกือบทุกสถานการณ์ สมมติฐานที่char
ใช้กำลังการประมวลผลน้อยกว่าที่varchar
อาจเป็นจริง ... ตอนนี้ ... แต่เครื่องมือฐานข้อมูลดีขึ้นเมื่อเวลาผ่านไปและกฎทั่วไปประเภทนี้ทำให้เกิด "ตำนาน" ในอนาคต
varchar
อีกสิ่งหนึ่งที่ผมไม่เคยเห็นปัญหาประสิทธิภาพการทำงานเพราะมีคนตัดสินใจที่จะไปด้วย คุณจะใช้เวลาในการเขียนโค้ดได้ดีขึ้น (โทรไปยังฐานข้อมูลน้อยลง) และ SQL ที่มีประสิทธิภาพ (ดัชนีทำงานอย่างไร, เครื่องมือเพิ่มประสิทธิภาพจะตัดสินใจexists
ได้in
อย่างไร
ความคิดสุดท้าย: ฉันได้เห็นปัญหาทุกประเภทเกี่ยวกับการใช้CHAR
คนมองหา '' เมื่อพวกเขาควรจะมองหา '' หรือคนที่มองหา 'FOO' เมื่อพวกเขาควรจะมองหา 'FOO (กลุ่มของที่นี่) หรือคนที่ไม่ตัดทอนช่องว่างต่อท้ายหรือบั๊กที่มี Powerbuilder เพิ่มช่องว่างได้มากถึง 2,000 ช่องเป็นค่าที่ส่งคืนจากโพรซีเดอร์ Oracle
นอกจากประโยชน์ด้านประสิทธิภาพแล้วCHAR
ยังสามารถใช้เพื่อระบุว่าค่าทั้งหมดควรมีความยาวเท่ากันเช่นคอลัมน์สำหรับตัวย่อของรัฐในสหรัฐอเมริกา
CHAR
คุณจะต้องตรวจสอบให้แน่ใจว่าคุณได้รับส่วนลด
Char เร็วขึ้นเล็กน้อยดังนั้นหากคุณมีคอลัมน์ที่คุณรู้ว่ามีความยาวพอสมควรให้ใช้ถ่าน ตัวอย่างเช่นการจัดเก็บ (M) ale / (F) emale / (U) ไม่ทราบเพศหรือ 2 ตัวอักษรสำหรับรัฐของสหรัฐอเมริกา
NChar หรือ Char มีประสิทธิภาพดีกว่าหรือไม่?
เป็นคำถามที่ดีมาก คำตอบง่ายๆคือใช่ในบางสถานการณ์ เรามาดูกันว่าสิ่งนี้สามารถอธิบายได้หรือไม่
เห็นได้ชัดว่าเราทุกคนรู้ว่าถ้าฉันสร้างตารางที่มีคอลัมน์ของ varchar (255) (ลองเรียกคอลัมน์นี้ว่า myColumn) และแทรกหนึ่งล้านแถว แต่ใส่เพียงไม่กี่ตัวอักษรลงใน myColumn สำหรับแต่ละแถวตารางจะเล็กกว่ามาก จำนวนหน้าข้อมูลที่เอ็นจิ้นการจัดเก็บที่ต้องการ) มากกว่าถ้าฉันสร้าง myColumn เป็น char (255) ทุกครั้งที่ฉันทำการดำเนินการ (DML) บนตารางนั้นและขอแถวจำนวนมากมันจะเร็วขึ้นเมื่อ myColumn เป็น varchar เพราะฉันไม่ต้องย้ายไปรอบ ๆ ช่องว่าง "พิเศษ" ทั้งหมดในตอนท้าย ย้ายเช่นเดียวกับเมื่อ SQL Server ทำการเรียงลำดับภายในเช่นระหว่างการดำเนินการที่แตกต่างกันหรือการรวมหรือถ้ามันเลือกผสานระหว่างมันเป็นแผนแบบสอบถาม ฯลฯ
แต่มีค่าใช้จ่ายในการใช้ varchar SQL Server จะต้องใช้ตัวบ่งชี้ที่สองไบต์ (ค่าใช้จ่าย) เพื่อ, ในแต่ละแถว, เพื่อทราบจำนวนไบต์ที่ myColumn ของแถวใดแถวหนึ่งมีอยู่ในนั้น ไม่ใช่ 2 ไบต์พิเศษที่นำเสนอปัญหา แต่ก็ต้อง "ถอดรหัส" ความยาวของข้อมูลใน myColumn ทุกแถว
จากประสบการณ์ของฉันมันมีเหตุผลที่จะใช้ถ่านแทน varchar ในคอลัมน์ที่จะเข้าร่วมในแบบสอบถาม ตัวอย่างเช่นคีย์หลักของตารางหรือคอลัมน์อื่น ๆ ที่จะได้รับการจัดทำดัชนี หมายเลขลูกค้าในตารางข้อมูลประชากรหรือรหัสประจำตัวบนตารางถอดรหัสหรืออาจเป็นหมายเลขสั่งซื้อบนตารางคำสั่งซื้อ โดยการใช้ถ่านเคียวรีเอ็นจินสามารถดำเนินการเข้าร่วมได้เร็วขึ้นเนื่องจากมันสามารถทำเลขคณิตตัวชี้แบบตรง (กำหนดขึ้น) แทนที่จะต้องย้ายตัวชี้เป็นจำนวนไบต์ที่แปรผันตามที่อ่านหน้า ฉันรู้ว่าฉันอาจสูญเสียคุณในประโยคสุดท้าย ตัวเชื่อมใน SQL Server อิงตามแนวคิดของ "ภาคแสดง" เพรดิเคตเป็นเงื่อนไข ตัวอย่างเช่น myColumn = 1 หรือ OrderNumber <500
ดังนั้นหาก SQL Server กำลังดำเนินการคำสั่ง DML และเพรดิเคตหรือ "คีย์" ที่เข้าร่วมจะมีความยาวคงที่ (ถ่าน) เอ็นจินการสืบค้นไม่จำเป็นต้องทำงานมากเพื่อจับคู่แถวจากตารางหนึ่งไปยังแถวจาก ตารางอื่น ไม่ต้องค้นหาว่าข้อมูลอยู่ในแถวนานเท่าไรจากนั้นจึงเดินลงไปตามสายเพื่อค้นหาจุดสิ้นสุด ทั้งหมดที่ต้องใช้เวลา
ตอนนี้จำไว้ว่าสิ่งนี้สามารถนำไปปฏิบัติได้อย่างง่ายดาย ฉันได้เห็นถ่านที่ใช้สำหรับเขตข้อมูลคีย์หลักในระบบออนไลน์ ความกว้างจะต้องอยู่ในระดับเล็กน้อยเช่นถ่าน (15) หรืออะไรที่สมเหตุสมผล และทำงานได้ดีที่สุดในระบบออนไลน์เพราะโดยปกติคุณจะเรียกหรือเพิ่มจำนวนแถวน้อยดังนั้นการ "rtrim" ช่องว่างต่อท้ายที่คุณจะได้รับในชุดผลลัพธ์นั้นเป็นงานที่ไม่สำคัญเมื่อเทียบกับการเข้าร่วมนับล้าน แถวจากตารางหนึ่งไปยังอีกหลายล้านแถวในตารางอื่น
อีกเหตุผลหนึ่งที่ทำให้ CHAR มีความหมายมากกว่า varchar ในระบบออนไลน์คือมันช่วยลดการแยกหน้า โดยการใช้ถ่านคุณจะต้อง "จองล่วงหน้า" (และสิ้นเปลือง) เป็นพื้นที่นั้นดังนั้นหากผู้ใช้เข้ามาภายหลังและใส่ข้อมูลเพิ่มเติมลงในคอลัมน์ SQL นั้นได้จัดสรรพื้นที่สำหรับมันแล้ว
เหตุผลอื่นที่ใช้ CHAR คล้ายกับเหตุผลที่สอง หากโปรแกรมเมอร์หรือผู้ใช้อัปเดตเป็น "ชุดข้อมูล" เป็นล้านแถวแล้วเพิ่มประโยคลงในฟิลด์บันทึกย่อตัวอย่างเช่นคุณจะไม่ได้รับสายจาก DBA ของคุณในกลางดึกเพราะสงสัยว่าทำไมไดรฟ์ถึงเต็ม มันจะนำไปสู่การเติบโตที่คาดการณ์ได้มากขึ้นของขนาดของฐานข้อมูล
ดังนั้นสิ่งเหล่านี้จึงเป็น 3 วิธีที่ระบบออนไลน์ (OLTP) จะได้รับประโยชน์จากการใช้ถ่านมากกว่า varchar ฉันแทบจะไม่เคยใช้ถ่านในสถานการณ์ของคลังสินค้า / การวิเคราะห์ / OLAP เพราะโดยปกติคุณมีข้อมูลมากมายที่คอลัมน์ถ่านทั้งหมดสามารถเพิ่มพื้นที่ที่สูญเปล่าได้มาก
โปรดทราบว่าถ่านสามารถทำให้ฐานข้อมูลของคุณมีขนาดใหญ่ขึ้น แต่เครื่องมือสำรองส่วนใหญ่มีการบีบอัดข้อมูลดังนั้นการสำรองข้อมูลของคุณมักจะมีขนาดใกล้เคียงกับถ้าคุณใช้ varchar ตัวอย่างเช่น LiteSpeed หรือ RedGate SQL Backup
การใช้งานอื่นอยู่ในมุมมองที่สร้างขึ้นสำหรับการส่งออกข้อมูลไปยังไฟล์ความกว้างคงที่ สมมติว่าฉันต้องส่งออกข้อมูลไปยังไฟล์แบบแฟลตเพื่อให้เมนเฟรมอ่านได้ มันคือความกว้างคงที่ (ไม่ใช่ตัวคั่น) ฉันต้องการจัดเก็บข้อมูลในตาราง "การจัดเตรียม" ของฉันเป็น varchar (ซึ่งใช้พื้นที่น้อยลงในฐานข้อมูลของฉัน) จากนั้นใช้มุมมองเพื่อแสดงทุกสิ่งเพื่อเทียบเท่ากับถ่านด้วยความยาวที่สอดคล้องกับความกว้างคงที่สำหรับคอลัมน์นั้น . ตัวอย่างเช่น:
create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )
insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)
create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))
SELECT * from vwStagingTable
นี่เจ๋งเพราะข้อมูลของฉันใช้พื้นที่น้อยกว่าเพราะใช้ varchar แต่เมื่อฉันใช้ DTS หรือ SSIS หรือเพียงแค่ตัดและวางจาก SSMS ไปยัง Notepad ฉันสามารถใช้มุมมองและรับจำนวนช่องว่างที่ถูกต้อง ใน DTS เราเคยมีคุณสมบัติที่เรียกว่า, ฉันลืมฉันคิดว่ามันถูกเรียกว่า "คอลัมน์แนะนำ" หรืออะไรบางอย่าง ใน SSIS คุณไม่สามารถทำเช่นนั้นได้อีกต่อไปคุณต้องกำหนดตัวจัดการการเชื่อมต่อไฟล์แฟล็ต แต่เนื่องจากคุณมีการตั้งค่ามุมมอง SSIS สามารถทราบความกว้างของแต่ละคอลัมน์และสามารถประหยัดเวลาได้มากเมื่อสร้างงานการรับส่งข้อมูล
ดังนั้นบรรทัดล่าง ... ใช้ varchar มีเหตุผลจำนวนน้อยมากที่จะใช้ถ่านและเป็นเพียงเหตุผลด้านประสิทธิภาพ หากคุณมีระบบที่มี hundrends หลายล้านแถวคุณจะเห็นความแตกต่างที่เห็นได้ชัดหากเพรดิเคตเป็นแบบกำหนดค่าได้ (char) แต่สำหรับระบบส่วนใหญ่ที่ใช้ถ่านเป็นเพียงการสูญเสียพื้นที่
หวังว่าจะช่วย เจฟฟ์
มีประโยชน์ด้านประสิทธิภาพ แต่นี่คือสิ่งที่ไม่ได้กล่าวถึง: การย้ายข้อมูลแถว ด้วยถ่านคุณจองพื้นที่ทั้งหมดล่วงหน้าดังนั้นสมมติว่าคุณมีถ่าน (1,000) และคุณเก็บอักขระ 10 ตัวคุณจะใช้พื้นที่ทั้งหมด 1,000 หลังคา ใน varchar2 (1,000) คุณจะใช้เพียง 10 ตัวอักษร ปัญหาเกิดขึ้นเมื่อคุณแก้ไขข้อมูล สมมติว่าคุณอัปเดตคอลัมน์ให้มีอักขระ 900 ตัว เป็นไปได้ว่าพื้นที่สำหรับขยาย varchar ไม่พร้อมใช้งานในบล็อกปัจจุบัน ในกรณีนั้นเอ็นจิน DB ต้องย้ายแถวไปยังบล็อกอื่นและสร้างตัวชี้ในบล็อกดั้งเดิมไปยังแถวใหม่ในบล็อกใหม่ หากต้องการอ่านข้อมูลนี้เอ็นจิน DB จะต้องอ่าน 2 บล็อก
ไม่มีใครพูดได้อย่างมั่นใจว่าวาร์ชาหรือชาร์จะดีกว่า มีพื้นที่สำหรับการแลกเปลี่ยนเวลาและการพิจารณาว่าข้อมูลจะได้รับการปรับปรุงโดยเฉพาะอย่างยิ่งหากมีโอกาสที่จะเติบโต
มีความแตกต่างระหว่างการปรับประสิทธิภาพต้นให้เหมาะสมกับการใช้ประเภทของกฎที่ดีที่สุด หากคุณกำลังสร้างตารางใหม่ที่คุณจะมีฟิลด์ความยาวคงที่เสมอมันทำให้รู้สึกถึงการใช้ CHAR คุณควรจะใช้มันในกรณีนี้ นี่ไม่ใช่การเพิ่มประสิทธิภาพ แต่เนิ่นๆ แต่ควรใช้กฎง่ายๆ (หรือแนวปฏิบัติที่ดีที่สุด)
ie - หากคุณมีฟิลด์สถานะตัวอักษร 2 ตัวให้ใช้ CHAR (2) หากคุณมีฟิลด์ที่มีชื่อสถานะจริงให้ใช้ VARCHAR
ฉันจะเลือก varchar เว้นเสียแต่ว่าคอลัมน์จะเก็บค่าคงที่เช่นรหัสรัฐของสหรัฐอเมริกา - ซึ่งจะมีความยาว 2 ตัวอักษรเสมอและรายการรหัสสหรัฐอเมริกาที่ถูกต้องจะไม่เปลี่ยนแปลงบ่อย :)
ในกรณีอื่น ๆ เช่นการจัดเก็บรหัสผ่านที่แฮช (ซึ่งมีความยาวคงที่) ฉันจะเลือก varchar
ทำไม - คอลัมน์ประเภท char มีการเติมเต็มช่องว่างเสมอซึ่งทำให้คอลัมน์my_columnถูกกำหนดเป็นอักขระ char (5) ที่มีค่า 'ABC' อยู่ในการเปรียบเทียบ:
my_column = 'ABC' -- my_column stores 'ABC ' value which is different then 'ABC'
เท็จ
คุณลักษณะนี้อาจนำไปสู่ข้อบกพร่องที่น่ารำคาญมากมายระหว่างการพัฒนาและทำให้การทดสอบหนักขึ้น
CHAR ใช้พื้นที่เก็บข้อมูลน้อยกว่า VARCHAR หากค่าข้อมูลทั้งหมดของคุณในฟิลด์นั้นมีความยาวเท่ากัน ตอนนี้บางทีในปี 2009 ฐานข้อมูล 800GB จะเหมือนกันสำหรับทุก intents และวัตถุประสงค์เป็น 810GB ถ้าคุณแปลง VARCHARs เป็น CHARs แต่สำหรับสตริงสั้น ๆ (1 หรือ 2 ตัวอักษร) CHAR ยังคงเป็น "แนวปฏิบัติที่ดีที่สุด" ในอุตสาหกรรม
ตอนนี้ถ้าคุณดูที่ชนิดข้อมูลที่หลากหลายฐานข้อมูลส่วนใหญ่จะให้แม้แต่จำนวนเต็มเพียงอย่างเดียว (บิต, เล็ก, int, bigint) มีเหตุผลที่จะเลือกอย่างใดอย่างหนึ่ง เพียงแค่เลือกสีที่ยิ่งใหญ่ทุกครั้งที่เป็นเพียงเล็กน้อยไม่รู้วัตถุประสงค์และการใช้งานของสนาม หากเขตข้อมูลแสดงถึงบุคคลที่มีอายุเพียงไม่กี่ปี ตอนนี้ไม่จำเป็นต้อง "ผิด" แต่ไม่ได้มีประสิทธิภาพ
แต่มันเป็นข้อโต้แย้งที่น่าสนใจและเมื่อฐานข้อมูลดีขึ้นเรื่อย ๆ มันอาจจะเป็นที่ถกเถียงกันอยู่ว่า CHAR กับ VARCHAR มีความเกี่ยวข้องน้อย
ฉันยืนตามความคิดเห็นของ Jim McKeeth
นอกจากนี้การจัดทำดัชนีและการสแกนตารางแบบเต็มจะเร็วขึ้นหากตารางของคุณมีคอลัมน์ CHAR เท่านั้น โดยพื้นฐานแล้วเครื่องมือเพิ่มประสิทธิภาพจะสามารถทำนายได้ว่าแต่ละเร็กคอร์ดมีขนาดใหญ่เพียงใดมีคอลัมน์ CHAR เท่านั้นในขณะที่ต้องการตรวจสอบค่าขนาดของทุกคอลัมน์ VARCHAR
นอกจากนี้หากคุณอัปเดตคอลัมน์ VARCHAR ให้มีขนาดใหญ่กว่าเนื้อหาก่อนหน้าคุณอาจบังคับให้ฐานข้อมูลสร้างดัชนีขึ้นใหม่ (เนื่องจากคุณบังคับให้ฐานข้อมูลย้ายระเบียนบนดิสก์ทางกายภาพ) ในขณะที่มีคอลัมน์ CHAR ที่จะไม่เกิดขึ้น
แต่คุณอาจจะไม่สนใจเกี่ยวกับประสิทธิภาพการทำงานเว้นแต่ว่าโต๊ะของคุณมีขนาดใหญ่
จำคำพูดที่ชาญฉลาดของ Djikstra การเพิ่มประสิทธิภาพก่อนกำหนดเป็นรากฐานของความชั่วร้ายทั้งหมด
CHAR
คอลัมน์ดัชนีจำเป็นต้องได้รับการอัปเดตเช่นกัน ไม่มีความแตกต่างในการอัปเดต VARCHAR หรือคอลัมน์ CHAR ในเรื่องนั้น คิดเกี่ยวกับการปรับปรุงการFOO
BAR
หลายคนได้ชี้ให้เห็นว่าถ้าคุณรู้ว่าความยาวของค่าที่ใช้ CHAR นั้นมีประโยชน์อย่างแน่นอน แต่ในขณะที่การจัดเก็บรัฐของสหรัฐอเมริกาในฐานะ CHAR (2) เป็นสิ่งที่ยอดเยี่ยมในวันนี้เมื่อคุณได้รับข้อความจากการขายว่า 'เราเพิ่งขายสินค้าครั้งแรกไปยังออสเตรเลีย' คุณอยู่ในโลกแห่งความเจ็บปวด ฉันส่งไปประเมินค่าสูงไปเสมอว่าฉันจะต้องใช้เวลานานแค่ไหนในการคิดมากกว่าที่จะคาดเดา 'แน่นอน' เพื่อครอบคลุมเหตุการณ์ในอนาคต VARCHAR จะทำให้ฉันมีความยืดหยุ่นมากขึ้นในพื้นที่นี้
ฉันคิดว่าในกรณีของคุณอาจไม่มีเหตุผลที่จะไม่เลือก Varchar มันให้ความยืดหยุ่นแก่คุณและตามที่ได้รับการกล่าวถึงจากผู้ตอบแบบสอบถามจำนวนมากการปฏิบัติงานดังกล่าวขณะนี้ยกเว้นในกรณีที่เฉพาะเจาะจงเรามนุษย์ทั่วไป (เมื่อเทียบกับ Google DBA) จะไม่สังเกตเห็นความแตกต่าง
สิ่งที่น่าสนใจที่ควรทราบเมื่อพูดถึงประเภทฐานข้อมูลคือ sqlite (ฐานข้อมูลขนาดเล็กยอดนิยมที่มีประสิทธิภาพที่น่าประทับใจ) ทำให้ทุกอย่างในฐานข้อมูลเป็นสตริงและประเภทได้ทันที
ฉันมักจะใช้ VarChar และมักจะทำให้มันใหญ่กว่าที่ฉันต้องการอย่างมาก เช่น. 50 สำหรับชื่ออย่างที่คุณพูดทำไมไม่เพียง แต่จะปลอดภัย
ฉันจะไม่ใช้ตัวอักษร ฉันเคยมีการถกเถียงกันนี้กับหลาย ๆ คนและพวกเขามักจะเบื่อหน่ายกับความเบื่อหน่ายที่ถ่านเร็วขึ้น ฉันพูดได้เร็วเท่าไหร่? เรากำลังพูดถึงอะไรที่นี่, มิลลิวินาที, วินาทีและถ้าเป็นเท่าไหร่? คุณกำลังบอกฉันเพราะมีคนอ้างว่าเป็นเวลาไม่กี่มิลลิวินาทีเร็วกว่าเราควรแนะนำการแก้ไขข้อบกพร่องจำนวนมากในระบบ
ดังนั้นนี่คือปัญหาบางส่วนที่คุณจะพบ:
ทุกฟิลด์จะมีเบาะดังนั้นคุณจะจบลงด้วยรหัสถาวรที่มี RTRIMS ทุกที่ นี่เป็นพื้นที่ดิสก์ขนาดใหญ่ที่สิ้นเปลืองสำหรับฟิลด์ที่ยาวกว่า
ทีนี้สมมติว่าคุณมีตัวอย่างที่เป็นแก่นสารของฟิลด์ char ของอักขระเพียงตัวเดียว แต่ฟิลด์นั้นเป็นตัวเลือก หากใครบางคนผ่านสตริงว่างไปยังเขตข้อมูลนั้นมันจะกลายเป็นหนึ่งช่อง ดังนั้นเมื่อแอปพลิเคชัน / กระบวนการอื่นสอบถามพวกเขาจะได้รับหนึ่งช่องว่างถ้าไม่ใช้ rtrim เรามีเอกสาร xml, ไฟล์และโปรแกรมอื่น ๆ , แสดงเพียงหนึ่งช่องว่าง, ในฟิลด์ตัวเลือกและแบ่งสิ่งต่างๆ
ดังนั้นตอนนี้คุณต้องให้แน่ใจว่าคุณผ่านโมฆะและไม่ใช่สตริงว่างไปยังช่องถ่าน แต่นั่นไม่ใช่การใช้ null อย่างถูกต้อง นี่คือการใช้เป็นโมฆะ ให้บอกว่าคุณได้รับไฟล์จากผู้ขาย
ชื่อ | เพศ | เมือง
Bob || ลอสแองเจลิส
หากไม่ระบุเพศนอกเหนือจากที่คุณป้อนบ็อบสตริงว่างและลอสแอนเจลิสลงในตาราง ตอนนี้สมมติว่าคุณได้รับไฟล์และการเปลี่ยนแปลงรูปแบบและเพศจะไม่รวมอีกต่อไป แต่ในอดีตที่ผ่านมา
ชื่อ | เมือง
บ๊อบ | แอตเทิล
ตอนนี้เนื่องจากไม่รวมเพศฉันจะใช้ null Varchars สนับสนุนสิ่งนี้โดยไม่มีปัญหา
Char ในทางกลับกันจะแตกต่างกัน คุณต้องส่งค่าว่างเสมอ หากคุณเคยส่งสตริงว่างคุณจะพบกับฟิลด์ที่มีช่องว่างอยู่
ฉันสามารถทำต่อไปเรื่อย ๆ กับข้อบกพร่องทั้งหมดที่ฉันต้องแก้ไขจากตัวอักษรและในการพัฒนาประมาณ 20 ปี
มีค่าใช้จ่ายในการประมวลผลขนาดเล็กในการคำนวณขนาดที่ต้องการจริงสำหรับค่าคอลัมน์และการจัดสรรพื้นที่สำหรับ Varchar ดังนั้นหากคุณแน่ใจว่าจะต้องใช้เวลานานเท่าไรจึงควรใช้ Char และหลีกเลี่ยงการตี
มันเป็นพื้นที่คลาสสิกกับการแลกเปลี่ยนประสิทธิภาพ
ใน MS SQL 2005 Varchar (หรือ NVarchar สำหรับ lanuagues ที่ต้องการสองไบต์ต่ออักขระเช่นจีน) เป็นความยาวผันแปร หากคุณเพิ่มลงในแถวหลังจากที่ถูกเขียนลงในฮาร์ดดิสก์แล้วมันจะค้นหาข้อมูลในตำแหน่งที่ไม่เกี่ยวข้องกับแถวต้นฉบับและนำไปสู่การแตกไฟล์ข้อมูลของคุณ สิ่งนี้จะส่งผลต่อประสิทธิภาพ
ดังนั้นหากพื้นที่ไม่ใช่ปัญหาแล้ว Char จะดีกว่าสำหรับประสิทธิภาพการทำงาน แต่ถ้าคุณต้องการลดขนาดฐานข้อมูลลง varchars จะดีกว่า
การกระจายตัวของ Char จองพื้นที่และ VarChar ไม่ได้ สามารถแบ่งหน้าได้เพื่อรองรับการอัปเดตเป็น varchar
CHAR
คอลัมน์
เมื่อใช้ค่า varchar SQL Server ต้องการ 2 ไบต์ต่อแถวเพิ่มเติมเพื่อเก็บข้อมูลบางอย่างเกี่ยวกับคอลัมน์นั้นในขณะที่ถ้าคุณใช้ถ่านไม่จำเป็นต้องทำเช่นนั้นเว้นแต่คุณจะ
ในฐานข้อมูล SQL บางตัว VARCHAR จะถูกย่อขนาดให้ใหญ่ที่สุดเพื่อปรับอ็อฟเซ็ตให้เหมาะสมนี่คือเพื่อเพิ่มความเร็วในการสแกนตารางและดัชนี
ด้วยเหตุนี้คุณจึงไม่ต้องประหยัดพื้นที่โดยใช้ VARCHAR (200) เทียบกับ CHAR (200)
การใช้ CHAR (NCHAR) และ VARCHAR (NVARCHAR) ทำให้เกิดความแตกต่างในวิธีที่เซิร์ฟเวอร์ฐานข้อมูลเก็บข้อมูล คนแรกแนะนำช่องว่างต่อท้าย; ฉันพบปัญหาเมื่อใช้กับตัวดำเนินการ LIKE ในฟังก์ชัน SQL SERVER ดังนั้นฉันต้องทำให้ปลอดภัยโดยใช้ VARCHAR (NVARCHAR) ตลอดเวลา
ตัวอย่างเช่นถ้าเรามีตารางTEST (ID INT, CHAR สถานะ (1))และคุณเขียนฟังก์ชั่นเพื่อแสดงรายการระเบียนทั้งหมดที่มีค่าเฉพาะบางอย่างดังต่อไปนี้:
CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'
ในฟังก์ชั่นนี้เราคาดหวังว่าเมื่อเราใส่พารามิเตอร์เริ่มต้นฟังก์ชั่นจะกลับแถวทั้งหมด แต่ในความเป็นจริงมันไม่ได้ เปลี่ยนชนิดข้อมูล @Status เป็น VARCHAR จะแก้ไขปัญหา