ตัวอย่างหนึ่งที่สามารถสร้างความแตกต่างได้คือสามารถป้องกันการเพิ่มประสิทธิภาพการทำงานที่หลีกเลี่ยงการเพิ่มข้อมูลการกำหนดเวอร์ชันของแถวลงในตารางโดยใช้ทริกเกอร์หลัง
สิ่งนี้ครอบคลุมโดย SQL Kiwi ที่นี่
ขนาดที่แท้จริงของข้อมูลที่จัดเก็บนั้นไม่มีสาระสำคัญ - เป็นขนาดที่เป็นไปได้ที่มีความสำคัญ
ในทำนองเดียวกันหากใช้ตารางที่ปรับแต่งหน่วยความจำตั้งแต่ปี 2559 เป็นไปได้ที่จะใช้คอลัมน์ LOB หรือการรวมกันของความกว้างของคอลัมน์ที่อาจเกินขีด จำกัด การไหลเวียน แต่มีโทษ
คอลัมน์ (สูงสุด) จะถูกจัดเก็บไว้นอกแถวเสมอ สำหรับคอลัมน์อื่น ๆ ถ้าขนาดแถวข้อมูลในข้อกำหนดของตารางสามารถเกิน 8,060 ไบต์ SQL Server จะผลักคอลัมน์ที่มีความยาวตัวแปรที่ใหญ่ที่สุดออกจากแถว อีกครั้งไม่ได้ขึ้นอยู่กับจำนวนข้อมูลที่คุณจัดเก็บไว้ที่นั่น
ซึ่งอาจส่งผลเสียอย่างมากต่อการใช้หน่วยความจำและประสิทธิภาพ
อีกกรณีหนึ่งที่การประกาศความกว้างของคอลัมน์มากเกินไปสามารถสร้างความแตกต่างได้มากคือถ้าตารางจะถูกประมวลผลโดยใช้ SSIS หน่วยความจำที่จัดสรรไว้สำหรับความยาวของตัวแปร (หยดไม่ใช่) คอลัมน์ได้รับการแก้ไขในแต่ละแถวในต้นดำเนินการและเป็นต่อคอลัมน์ประกาศความยาวสูงสุดที่สามารถนำไปสู่การใช้งานไม่มีประสิทธิภาพของหน่วยความจำบัฟเฟอร์(ตัวอย่าง) ในขณะที่ผู้พัฒนาแพคเกจ SSIS สามารถประกาศขนาดคอลัมน์ที่เล็กกว่าแหล่งที่มาการวิเคราะห์นี้ทำได้ดีที่สุดก่อนและบังคับ
ย้อนกลับไปในกลไกของ SQL Server เองในกรณีที่คล้ายกันคือเมื่อคำนวณการให้หน่วยความจำเพื่อจัดสรรสำหรับSORT
การดำเนินการ SQL Server จะถือว่าvarchar(x)
คอลัมน์จะใช้x/2
ไบต์โดยเฉลี่ย
ถ้าของคุณมากที่สุดvarchar
คอลัมน์ฟูลเลอร์กว่าที่ว่านี้สามารถนำไปสู่การดำเนินงานที่จะทะลักsort
tempdb
ในกรณีของคุณหากvarchar
คอลัมน์ของคุณถูกประกาศเป็น8000
ไบต์ แต่จริงๆแล้วมีเนื้อหาน้อยกว่าที่แบบสอบถามของคุณจะได้รับการจัดสรรหน่วยความจำที่ไม่ต้องการซึ่งเห็นได้ชัดว่าไม่มีประสิทธิภาพและอาจทำให้ต้องรอการให้หน่วยความจำ
สิ่งนี้กล่าวถึงในส่วนที่ 2 ของ SQL Workshops Webcast 1 ซึ่งสามารถดาวน์โหลดได้จากที่นี่หรือดูด้านล่าง
use tempdb;
CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))
INSERT INTO T
(number,name8000,name500)
SELECT number, name, name
FROM master..spt_values
SELECT id,name500
FROM T
ORDER BY number
SELECT id,name8000
FROM T
ORDER BY number