คำถามและคำตอบในการสัมภาษณ์ T-SQL 50 อันดับแรก (2026)

กำลังเตรียมตัวสำหรับการสัมภาษณ์ T-SQL หรือไม่? ถึงเวลาที่จะเพิ่มพูนความเข้าใจของคุณเกี่ยวกับการทำงานของฐานข้อมูลอย่างแท้จริงภายใต้พื้นผิว ด้วย คำถามสัมภาษณ์ T-SQLผู้สรรหาบุคลากรจะประเมินไม่เพียงแค่การจดจำไวยากรณ์เท่านั้น แต่ยังรวมถึงคำสั่งของคุณในการจัดการข้อมูล การเพิ่มประสิทธิภาพ และการจัดโครงสร้างเชิงตรรกะด้วย
โอกาสในสายงานนี้ยังคงขยายตัวอย่างต่อเนื่อง เนื่องจากธุรกิจต่างๆ ต้องพึ่งพาข้อมูลเชิงลึกที่ขับเคลื่อนด้วยข้อมูล ผู้สมัครที่มีความเชี่ยวชาญทางเทคนิคที่แข็งแกร่ง ทักษะการวิเคราะห์ และความสามารถในการแก้ปัญหาจริงจะโดดเด่นเป็นพิเศษ ไม่ว่าจะเป็นมือใหม่หรือมืออาชีพที่มีประสบการณ์ 5 ถึง 10 ปี การเข้าใจคำถามและคำตอบทั้งในระดับพื้นฐานและขั้นสูง ช่วยให้หัวหน้าทีม ผู้จัดการ และเจ้าหน้าที่เทคนิคอาวุโสสามารถระบุชุดทักษะ SQL ที่แข็งแกร่งและประสบการณ์ระดับรากได้
คู่มือของเราดึงข้อมูลเชิงลึกจากผู้จัดการการจ้างงานกว่า 65 ราย นักพัฒนาอาวุโสกว่า 40 ราย และผู้เชี่ยวชาญด้านข้อมูลจากหลากหลายอุตสาหกรรม เพื่อให้แน่ใจว่าครอบคลุมตั้งแต่ตรรกะ SQL พื้นฐานไปจนถึงเทคนิคการปรับแต่งขั้นสูงที่ได้รับความไว้วางใจจากผู้นำทางเทคนิคทั่วโลก อ่านเพิ่มเติม ...
👉 ดาวน์โหลด PDF ฟรี: คำถามและคำตอบสัมภาษณ์ T-SQL
คำถามและคำตอบสัมภาษณ์ T-SQL ยอดนิยม
1) T-SQL คืออะไร และแตกต่างจาก SQL มาตรฐานอย่างไร?
Transact-SQL (T-SQL) คือ Microsoftส่วนขยายที่เป็นกรรมสิทธิ์ของภาษา SQL ซึ่งใช้เป็นหลักกับ Microsoft SQL Serverเพิ่มประสิทธิภาพ SQL มาตรฐานด้วยการนำเสนอฟีเจอร์การเขียนโปรแกรมเชิงขั้นตอน เช่น ตัวแปร เงื่อนไข ลูป การจัดการข้อผิดพลาด และฟังก์ชันในตัว ในขณะที่ SQL มาตรฐานมุ่งเน้นไปที่การจัดการข้อมูล (SELECT, INSERT, UPDATE, DELETE) T-SQL รองรับคำสั่งควบคุมการไหล (IF…ELSE, WHILE) การจัดการธุรกรรม และฟังก์ชันระบบที่ช่วยให้นักพัฒนาสามารถเขียนสคริปต์ที่ซับซ้อนได้
| แง่มุม | SQL | T-SQL |
|---|---|---|
| กรรมสิทธิ์ | มาตรฐาน ANSI/ISO | Microsoft |
| ตรรกะเชิงขั้นตอน | ถูก จำกัด | รองรับ (ตัวแปร, ลูป) |
| จัดการข้อผิดพลาด | ต่ำสุด | TRY…CATCH ได้รับการสนับสนุน |
| การใช้งานหลัก | ฐานข้อมูลทั่วไป | SQL Server |
ตัวอย่าง:
DECLARE @count INT = 5;
WHILE @count > 0
BEGIN
PRINT @count;
SET @count -= 1;
END;
2) อธิบายประเภทต่างๆ ของการจอยน์ใน T-SQL พร้อมตัวอย่าง
การเข้าร่วมใน T-SQL จะรวมแถวจากสองตารางหรือมากกว่าโดยอิงตามคอลัมน์ที่เกี่ยวข้อง การทำความเข้าใจประเภทของข้อมูลเหล่านี้เป็นสิ่งสำคัญสำหรับการสืบค้นข้อมูลเชิงสัมพันธ์
| ประเภทการเข้าร่วม | Descriptไอออน | ตัวอย่างไวยากรณ์ |
|---|---|---|
| INNER JOIN | ส่งคืนเฉพาะแถวที่ตรงกันเท่านั้น | SELECT * FROM A INNER JOIN B ON A.id = B.id; |
| LEFT JOIN | ทั้งหมดจากซ้าย + แมตช์จากขวา | SELECT * FROM A LEFT JOIN B ON A.id = B.id; |
| ขวาเข้าร่วม | ทั้งหมดจากขวา + แมตช์จากซ้าย | SELECT * FROM A RIGHT JOIN B ON A.id = B.id; |
| เข้าร่วมเต็มรูปแบบ | รวมซ้าย + ขวา | SELECT * FROM A FULL JOIN B ON A.id = B.id; |
| ข้ามเข้าร่วม | ผลิตภัณฑ์คาร์ทีเซียน | SELECT * FROM A CROSS JOIN B; |
ตัวอย่างการปฏิบัติ: การร่วม Orders และ Customers เพื่อค้นหาว่าลูกค้ารายใดได้สั่งซื้อสินค้าโดยใช้ INNER JOIN.
3) Common Table Expressions (CTEs) คืออะไร และมีข้อดีอะไรบ้าง
Common Table Expression (CTE) จะให้ชุดผลลัพธ์ที่มีชื่อชั่วคราวซึ่งสามารถอ้างอิงได้ภายใน SELECT, INSERT, UPDATEหรือ DELETE คำสั่งนี้ช่วยให้อ่านง่ายขึ้นและลดความซับซ้อนของการค้นหาแบบเรียกซ้ำ
ข้อดี:
- ปรับปรุงความชัดเจนของแบบสอบถามและการบำรุงรักษา
- เปิดใช้งานการเรียกซ้ำ (สำหรับข้อมูลลำดับชั้นเช่นแผนผังองค์กร)
- ช่วยหลีกเลี่ยงการสอบถามซ้ำ
- เพิ่มการแบ่งส่วนในสคริปต์ขนาดใหญ่
ตัวอย่าง:
WITH EmployeeCTE AS (
SELECT EmpID, EmpName, ManagerID
FROM Employees
)
SELECT * FROM EmployeeCTE WHERE ManagerID IS NULL;
4) ตารางชั่วคราวและตัวแปรตารางใน T-SQL แตกต่างกันอย่างไร
ทั้งสองอย่างใช้ในการจัดเก็บผลลัพธ์กลาง แต่พฤติกรรมและขอบเขตของทั้งสองอย่างแตกต่างกันอย่างมาก
| ลักษณะ | โต๊ะชั่วคราว (#Temp) |
ตัวแปรตาราง (@TableVar) |
|---|---|---|
| เก็บไว้ใน | เทมป์ดีบี | หน่วยความจำ (การใช้งาน TempDB แบบจำกัด) |
| ขอบเขตการทำธุรกรรม | ติดตามธุรกรรม | อิสระจากการทำธุรกรรม |
| ดัชนี | ที่สนับสนุน | ถูก จำกัด |
| ประสิทธิภาพ | ดีกว่าสำหรับชุดข้อมูลขนาดใหญ่ | ดีกว่าสำหรับชุดข้อมูลขนาดเล็ก |
ตัวอย่าง:
DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50)); INSERT INTO @TableVar VALUES (1, 'Alice');
ใช้ตารางชั่วคราวเมื่อทำงานกับชุดข้อมูลขนาดใหญ่หรือต้องการดัชนี
5) อธิบายแนวคิดของธุรกรรมใน T-SQL และวงจรชีวิตของพวกเขา
ธุรกรรมใน T-SQL ช่วยให้มั่นใจว่าลำดับการดำเนินการจะดำเนินการเป็นหน่วยตรรกะเดียว วงจรชีวิตประกอบด้วย เริ่มต้นการทำธุรกรรม, COMMITและ ย้อนกลับ.
| ระยะ | Descriptไอออน |
|---|---|
| เริ่มต้นการทำธุรกรรม | เริ่มการทำธุรกรรม |
| ทำธุรกรรม | บันทึกการเปลี่ยนแปลงทั้งหมดอย่างถาวร |
| ธุรกรรมย้อนกลับ | เลิกทำการดำเนินการทั้งหมดตั้งแต่ BEGIN ครั้งล่าสุด |
ตัวอย่าง:
BEGIN TRANSACTION; UPDATE Accounts SET Balance = Balance - 100 WHERE AccID = 1; UPDATE Accounts SET Balance = Balance + 100 WHERE AccID = 2; COMMIT TRANSACTION;
หากเกิดข้อผิดพลาดระหว่างทาง ROLLBACK รักษาความสมบูรณ์ของข้อมูล
6) ความแตกต่างระหว่างคำสั่ง DELETE, TRUNCATE และ DROP คืออะไร
| คำสั่ง | ฟังก์ชัน | ย้อนกลับ | ส่งผลต่อโครงสร้าง | ความเร็ว |
|---|---|---|---|---|
| ลบ | ลบแถวที่ระบุ | ใช่ | ไม่ | ช้าลง |
| ตัด | ลบแถวทั้งหมด | ไม่ (ปกติ) | ไม่ | รวดเร็ว |
| DROP | ลบตารางทั้งหมด | ไม่ | ใช่ | เร็วที่สุด |
ตัวอย่าง:
DELETE FROM Employees WHERE Department = 'HR'; TRUNCATE TABLE TempData; DROP TABLE OldLogs;
ใช้ DELETE สำหรับการกำจัดแบบเลือก TRUNCATE เพื่อการเคลียร์และ DROP เพื่อถอดโต๊ะออกไปทั้งหมด
7) การจัดการข้อผิดพลาดทำงานอย่างไรใน T-SQL?
T-SQL ให้การจัดการข้อผิดพลาดที่มีโครงสร้างผ่าน TRY...CATCH บล็อกที่ช่วยให้ผู้พัฒนาสามารถจัดการข้อผิดพลาดรันไทม์ได้อย่างสวยงาม
ตัวอย่าง:
BEGIN TRY
INSERT INTO Employees VALUES (1, 'John');
END TRY
BEGIN CATCH
PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH;
แนวทางนี้จะแยกการทำงานที่ผิดพลาดและป้องกันไม่ให้ธุรกรรมทำลายความสมบูรณ์ของข้อมูล นักพัฒนายังสามารถเข้าถึงฟังก์ชันระบบต่างๆ เช่น ERROR_NUMBER() or ERROR_SEVERITY() เพื่อการวินิจฉัย
8) มีวิธีใดบ้างในการเพิ่มประสิทธิภาพการทำงานของแบบสอบถาม T-SQL?
การเพิ่มประสิทธิภาพเกี่ยวข้องกับการปรับแต่งการออกแบบ SQL การสร้างดัชนี และกลยุทธ์การดำเนินการ
เทคนิคสำคัญ:
- ใช้ การจัดทำดัชนีที่เหมาะสม ในคอลัมน์ที่ถูกค้นหาบ่อยครั้ง
- หลีกเลี่ยง
SELECT *— ระบุคอลัมน์อย่างชัดเจน - ใช้ การดำเนินการตามชุด แทนเคอร์เซอร์
- วิเคราะห์แผนการดำเนินการโดยใช้ SQL Server Management Studio
- ใช้ เข้าร่วมอย่างมีประสิทธิภาพ ด้วยเงื่อนไขเปิดที่เหมาะสม
- ลด ซับเควรีแบบซ้อนกัน; ชอบ CTE หรือตารางชั่วคราว
การปรับแต่งประสิทธิภาพใน T-SQL ยังรวมถึงการตรวจสอบสถิติการดำเนินการแบบสอบถามโดยใช้ SET STATISTICS IO ON.
9) ฟังก์ชันหน้าต่างคืออะไร และควรใช้เมื่อใด?
ฟังก์ชัน Window จะทำการคำนวณข้ามแถวที่เกี่ยวข้องกับแถวปัจจุบัน โดยไม่ยุบรวมเป็นผลลัพธ์เดียว ฟังก์ชันเหล่านี้มีประโยชน์สำหรับการจัดอันดับ ผลรวมต่อเนื่อง และค่าเฉลี่ยเคลื่อนที่
ตัวอย่าง:
SELECT
EmployeeID,
Salary,
RANK() OVER (ORDER BY Salary DESC) AS RankBySalary
FROM Employees;
ฟังก์ชั่นทั่วไปได้แก่ RANK(), ROW_NUMBER(), DENSE_RANK()และ SUM() OVER().
สิ่งเหล่านี้มีความสำคัญต่อเวิร์กโหลดการวิเคราะห์ที่คุณต้องการทั้งข้อมูลรวมและข้อมูลระดับแถว
10) อธิบายความแตกต่างระหว่างดัชนีแบบคลัสเตอร์และแบบไม่คลัสเตอร์
| ลักษณะ | Clusterดัชนีเอ็ด | ไม่Clusterดัชนีเอ็ด |
|---|---|---|
| การจัดเก็บข้อมูล | จัดเรียงตารางใหม่ตามหลักกายภาพ | โครงสร้างแยก |
| จำนวนต่อตาราง | หนึ่ง | แพลตฟอร์มที่หลากหลาย |
| ประสิทธิภาพ | เร็วขึ้นสำหรับการสอบถามช่วง | เร็วขึ้นสำหรับการค้นหาที่เฉพาะเจาะจง |
| ตัวอย่างการใช้งาน | คีย์หลัก | การค้นหารอง |
ตัวอย่าง:
CREATE CLUSTERED INDEX IX_EmployeeID ON Employees(EmployeeID); CREATE NONCLUSTERED INDEX IX_Dept ON Employees(Department);
การเลือกประเภทดัชนีที่ถูกต้องส่งผลโดยตรงต่อความเร็วในการดำเนินการแบบสอบถามและประสิทธิภาพในการจัดเก็บข้อมูล
11) กระบวนการที่เก็บไว้ใน T-SQL คืออะไร และใช้เพื่ออะไร
โพรซีเดอร์ที่เก็บไว้ (Stored Procedure) คือชุดคำสั่ง SQL อย่างน้อยหนึ่งคำสั่งที่คอมไพล์ไว้ล่วงหน้า ซึ่งจัดเก็บไว้บนเซิร์ฟเวอร์ โพรซีเดอร์เหล่านี้ช่วยเพิ่มประสิทธิภาพ ความปลอดภัย และความสามารถในการนำกลับมาใช้ใหม่ โดยช่วยให้คุณสามารถห่อหุ้มตรรกะและดำเนินการซ้ำได้โดยไม่ต้องคอมไพล์ซ้ำ โพรซีเดอร์ที่เก็บไว้ช่วยลดปริมาณการรับส่งข้อมูลบนเครือข่ายและรองรับพารามิเตอร์สำหรับการดำเนินการแบบไดนามิก
ตัวอย่าง:
CREATE PROCEDURE GetEmployeeDetails @Dept NVARCHAR(50)
AS
BEGIN
SELECT EmpName, Position FROM Employees WHERE Department = @Dept;
END;
ประโยชน์ที่ได้รับ:
- ประสิทธิภาพดีขึ้นเนื่องจากการคอมไพล์ล่วงหน้า
- เพิ่มความปลอดภัยด้วยการดำเนินการที่ควบคุมได้
- การบำรุงรักษาโค้ดและการสร้างโมดูลที่ง่ายขึ้น
12) อธิบายความแตกต่างระหว่างกระบวนการที่เก็บไว้และฟังก์ชันใน T-SQL
| แง่มุม | ขั้นตอนการเก็บ | ฟังก์ชัน |
|---|---|---|
| ประเภทผลตอบแทน | สามารถคืนค่าได้หลายค่า | จะต้องส่งคืนค่าหรือตารางเดี่ยว |
| ใช้ใน SELECT | ไม่ได้รับอนุญาต | ได้รับอนุญาต |
| จัดการข้อผิดพลาด | TRY…CATCH ได้รับการสนับสนุน | ถูก จำกัด |
| การกระทำ | ดำเนินการผ่าน EXEC |
ใช้แบบอินไลน์กับ SQL |
| การควบคุมธุรกรรม | ที่สนับสนุน | ไม่ได้รับการสนับสนุน |
ตัวอย่าง:
- ขั้นตอน:
EXEC GetEmployeeDetails 'HR'; - ฟังก์ชั่น:
SELECT dbo.GetSalary(101);
ฟังก์ชั่นเหมาะสำหรับการคำนวณ ส่วนขั้นตอนการทำงานเหมาะสำหรับตรรกะทางธุรกิจและการจัดการข้อมูล
13) ทริกเกอร์ใน T-SQL คืออะไร และมีประเภทใดบ้าง
ทริกเกอร์คือโพรซีเดอร์จัดเก็บพิเศษที่ดำเนินการโดยอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่าง (INSERT, UPDATE, DELETE) บนตารางหรือมุมมอง ทริกเกอร์ถูกใช้เพื่อบังคับใช้กฎทางธุรกิจ ตรวจสอบการเปลี่ยนแปลง หรือรักษาความสมบูรณ์ของข้อมูลอ้างอิง
| ประเภท | Descriptไอออน |
|---|---|
| หลังจากทริกเกอร์ | ไฟไหม้หลังจากงานเสร็จสิ้น |
| แทนทริกเกอร์ | ดำเนินการแทนเหตุการณ์ที่กระตุ้น |
ตัวอย่าง:
CREATE TRIGGER trgAfterInsert
ON Employees
AFTER INSERT
AS
BEGIN
PRINT 'New employee record added!';
END;
หลีกเลี่ยงการใช้ทริกเกอร์มากเกินไป เพราะอาจส่งผลต่อประสิทธิภาพและทำให้การดีบักซับซ้อนขึ้น
14) คุณจัดการค่า NULL ใน T-SQL อย่างไร
NULL หมายถึงข้อมูลที่หายไปหรือไม่รู้จัก T-SQL มีฟังก์ชันต่างๆ มากมายเพื่อจัดการข้อมูลดังกล่าวอย่างมีประสิทธิภาพ:
ISNULL(expression, replacement)→ แทนที่ค่า NULL ด้วยค่าเริ่มต้นCOALESCE(expression1, expression2, ...)→ คืนค่าที่ไม่ใช่ค่า NULL แรกNULLIF(expression1, expression2)→ คืนค่า NULL ถ้านิพจน์เท่ากัน
ตัวอย่าง:
SELECT ISNULL(Manager, 'No Manager') AS ManagerName FROM Employees;
แนวทางปฏิบัติที่ดีที่สุด: คำนึงถึงค่า NULL ในการเข้าร่วมและเงื่อนไขเสมอเพื่อหลีกเลี่ยงผลลัพธ์ที่ไม่คาดคิด
15) เคอร์เซอร์ใน T-SQL คืออะไร และควรหลีกเลี่ยงเมื่อใด
เคอร์เซอร์ช่วยให้สามารถประมวลผลผลลัพธ์ของแบบสอบถามแบบแถวต่อแถว ซึ่งมีประโยชน์สำหรับตรรกะที่ซับซ้อนซึ่งการดำเนินการแบบเซตยังไม่เพียงพอ อย่างไรก็ตาม เคอร์เซอร์ ช้า และ ทรัพยากรหนัก เมื่อเทียบกับทางเลือกแบบชุด
ตัวอย่าง:
DECLARE emp_cursor CURSOR FOR SELECT EmpName FROM Employees; OPEN emp_cursor; FETCH NEXT FROM emp_cursor; -- process CLOSE emp_cursor; DEALLOCATE emp_cursor;
ข้อเสีย:
- เพิ่มการใช้งานหน่วยความจำ
- ความสามารถในการปรับขนาดไม่ดี
- ประสิทธิภาพลดลง
ทางเลือก: ใช้การรวมตาราง แบบสอบถามย่อย หรือฟังก์ชันหน้าต่างเมื่อใดก็ตามที่เป็นไปได้
16) อธิบายคำสั่ง MERGE และกรณีการใช้งาน
การขอ MERGE คำสั่งดำเนินการ INSERT, อัพเดทและ ลบ การดำเนินการในคำสั่งเดียว เหมาะอย่างยิ่งสำหรับการซิงโครไนซ์สองตาราง
ตัวอย่างไวยากรณ์:
MERGE INTO Target AS T USING Source AS S ON T.ID = S.ID WHEN MATCHED THEN UPDATE SET T.Name = S.Name WHEN NOT MATCHED BY TARGET THEN INSERT (ID, Name) VALUES (S.ID, S.Name) WHEN NOT MATCHED BY SOURCE THEN DELETE;
ใช้กรณี:
- การจัดเก็บข้อมูล (การจัดเตรียมการซิงค์และตารางเป้าหมาย)
- การโหลดข้อมูลเพิ่ม
- การดูแลรักษาตารางการตรวจสอบหรือมิติ
17) ฟังก์ชันที่ผู้ใช้กำหนด (UDF) ใน T-SQL มีกี่ประเภท?
| ประเภท | Descriptไอออน | ตัวอย่าง |
|---|---|---|
| เกลา | ส่งคืนค่าเดียว | CREATE FUNCTION GetTax(@Salary DECIMAL) RETURNS DECIMAL |
| ตารางอินไลน์ที่มีค่า | ส่งคืนตารางผ่านช่องทางเดียว SELECT |
RETURN SELECT * FROM Employees WHERE Dept = 'HR' |
| ตารางค่าหลายคำสั่ง | ส่งคืนตารางหลังจากคำสั่งหลายคำสั่ง | มีประโยชน์สำหรับตรรกะที่ซับซ้อน |
ฟังก์ชันส่งเสริมการนำโค้ดกลับมาใช้ใหม่และปรับปรุงการออกแบบแบบสอบถามแบบโมดูลาร์
ควรเป็นแบบกำหนดได้ (ส่งคืนผลลัพธ์เดียวกันสำหรับอินพุตเดียวกัน) เมื่อใดก็ตามที่เป็นไปได้เพื่อการเพิ่มประสิทธิภาพการทำงาน
18) Normalization คืออะไร และมีข้อดีข้อเสียอะไรบ้าง?
การทำให้เป็นมาตรฐาน (Normalization) คือกระบวนการจัดระเบียบข้อมูลในฐานข้อมูลเพื่อลดความซ้ำซ้อนและปรับปรุงความสมบูรณ์ของข้อมูล ซึ่งประกอบด้วยการแบ่งตารางออกเป็นเอนทิตีย่อยๆ ที่เกี่ยวข้องกัน
| แบบฟอร์มปกติ | กฎ | ตัวอย่าง |
|---|---|---|
| 1NF | กำจัดกลุ่มที่ทำซ้ำ | แยกข้อมูลที่คั่นด้วยเครื่องหมายจุลภาค |
| 2NF | ลบการอ้างอิงบางส่วน | ให้แน่ใจว่ามีการอ้างอิงคีย์หลักอย่างครบถ้วน |
| 3NF | ลบการอ้างอิงแบบสกรรมกริยา | ย้ายคุณสมบัติที่ได้รับมา |
ข้อดี:
- ลดความซ้ำซ้อน
- รับประกันความสอดคล้องของข้อมูล
- ทำให้การบำรุงรักษาง่ายขึ้น
ข้อเสีย:
- การรวมที่ซับซ้อน
- การแลกเปลี่ยนประสิทธิภาพที่เป็นไปได้สำหรับแบบสอบถามเชิงวิเคราะห์
19) ข้อจำกัดประเภทต่างๆ ใน T-SQL มีอะไรบ้าง
ข้อจำกัดบังคับใช้กฎเกณฑ์เกี่ยวกับความสมบูรณ์ของข้อมูลภายในตาราง
| การ จำกัด | จุดมุ่งหมาย | ตัวอย่าง |
|---|---|---|
| คีย์หลัก | ระบุแต่ละแถวอย่างเฉพาะเจาะจง | PRIMARY KEY (EmpID) |
| คีย์ต่างประเทศ | เชื่อมโยงสองตาราง | FOREIGN KEY (DeptID) |
| ที่ไม่ซ้ำกัน | รับประกันค่าคอลัมน์ที่ไม่ซ้ำกัน | UNIQUE (Email) |
| ตรวจสอบ | ตรวจสอบช่วงข้อมูล | CHECK (Age >= 18) |
| เริ่มต้น | ให้ค่าเริ่มต้น | DEFAULT GETDATE() |
ข้อจำกัดช่วยให้มั่นใจถึงความแม่นยำและความน่าเชื่อถือ ลดความจำเป็นในการตรวจสอบระดับแอปพลิเคชันที่ครอบคลุม
20) คุณจัดการสิทธิ์และความปลอดภัยใน T-SQL อย่างไร
T-SQL จัดการความปลอดภัยของฐานข้อมูลผ่าน การเข้าสู่ระบบ ผู้ใช้ บทบาท และการอนุญาต.
สามารถให้หรือเพิกถอนสิทธิ์ได้ที่ระดับวัตถุหรือรูปแบบ
ตัวอย่าง:
CREATE LOGIN John WITH PASSWORD = 'Strong@123'; CREATE USER John FOR LOGIN John; GRANT SELECT, INSERT ON Employees TO John;
ปฏิบัติที่ดีที่สุด:
- ใช้ บทบาท แทนการอนุญาตผู้ใช้โดยตรง
- หลีกเลี่ยงการใช้
saหรือบัญชีระบบสำหรับแอปพลิเคชัน - ตรวจสอบสิทธิ์การอนุญาตเป็นประจำด้วย
sys.database_permissions.
การจัดการการอนุญาตที่เหมาะสมช่วยให้มั่นใจถึงหลักการของสิทธิ์ขั้นต่ำและเป็นไปตามนโยบายความปลอดภัย
21) ระดับการแยกธุรกรรมที่แตกต่างกันใน T-SQL มีอะไรบ้าง
ระดับการแยกธุรกรรมจะกำหนดว่าธุรกรรมหนึ่งจะถูกแยกออกจากธุรกรรมอื่นอย่างไร — การปรับสมดุล ความมั่นคง สีสดสวย ภาวะพร้อมกัน. SQL Server รองรับสิ่งต่อไปนี้:
| ระดับการแยก | Descriptไอออน | อ่านสกปรก | อ่านซ้ำไม่ได้ | อ่านผี |
|---|---|---|---|---|
| อ่านไม่เข้าใจ | อ่านข้อมูลที่ยังไม่ได้ยืนยัน | ใช่ | ใช่ | ใช่ |
| อ่านคำมั่นสัญญา | ค่าเริ่มต้น; ล็อคป้องกันการอ่านข้อมูลสกปรก | ไม่ | ใช่ | ใช่ |
| อ่านซ้ำได้ | ป้องกันการเปลี่ยนแปลงข้อมูลจนกว่าจะยืนยัน | ไม่ | ไม่ | ใช่ |
| ซีเรียลไลซ์ได้ | การแยกส่วนอย่างสมบูรณ์; การล็อคสูงสุด | ไม่ | ไม่ | ไม่ |
| ภาพรวม | ใช้การกำหนดเวอร์ชัน ไม่ใช่การล็อค | ไม่ | ไม่ | ไม่ |
ตัวอย่าง:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; -- your code COMMIT;
ใช้ ภาพรวม สำหรับระบบที่มีการทำงานพร้อมกันสูงเพื่อลดการบล็อกโดยไม่กระทบต่อความสอดคล้อง
22) เดดล็อกใน SQL Server คืออะไร และจะป้องกันได้อย่างไร
A การหยุดชะงัก เกิดขึ้นเมื่อธุรกรรมสองรายการมีล็อกที่แต่ละรายการต้องการ ส่งผลให้เกิดภาวะเดดล็อก SQL Server จะตรวจจับและยุติธุรกรรมหนึ่งรายการโดยอัตโนมัติว่าเป็นเหยื่อของภาวะเดดล็อก
ตัวอย่างสถานการณ์:
- ธุรกรรม A ล็อค Table1 จากนั้นรอ Table2
- ธุรกรรม B ล็อค Table2 จากนั้นรอ Table1
เทคนิคการป้องกัน:
- เข้าถึงทรัพยากรตามลำดับเดียวกัน
- รักษาธุรกรรมให้สั้น
- ใช้ระดับการแยกที่เหมาะสม
- หลีกเลี่ยงการโต้ตอบของผู้ใช้ภายในธุรกรรม
ใช้ SQL Profiler หรือ Extended Events เพื่อติดตามเดดล็อกแบบเรียลไทม์
23) อธิบายความแตกต่างระหว่างการควบคุมการทำงานพร้อมกันแบบมองโลกในแง่ร้ายและมองโลกในแง่ดี
| ประเภท | Descriptไอออน | กลไกการล็อค | ใช้กรณี |
|---|---|---|---|
| ในแง่ร้าย | ล็อคข้อมูลระหว่างทำธุรกรรม | การล็อคแบบหนัก | สภาพแวดล้อมที่มีความขัดแย้งสูง |
| ในแง่ดี | ใช้การกำหนดเวอร์ชันแถว ตรวจสอบก่อนคอมมิท | การล็อคขั้นต่ำ | ภาระงานที่อ่านหนักและมีข้อขัดแย้งน้อย |
ตัวอย่าง:
- มองโลกในแง่ร้าย: ค่าเริ่มต้น
READ COMMITTEDการล็อค - มองโลกในแง่ดี:
SNAPSHOTการแยกด้วยการกำหนดเวอร์ชันแถว
การทำงานพร้อมกันที่มองโลกในแง่ดีช่วยเพิ่มประสิทธิภาพให้กับระบบที่มีการอ่านข้อมูลจำนวนมากและอัปเดตไม่บ่อยครั้ง
24) คุณจะวิเคราะห์และเพิ่มประสิทธิภาพแบบสอบถาม T-SQL ที่ทำงานช้าได้อย่างไร
- ตรวจสอบแผนการดำเนินการ: ระบุการสแกน ดัชนีที่หายไป และการดำเนินการที่มีต้นทุนสูง
- ใช้ SET STATISTICS IO/TIME: วิเคราะห์การใช้งาน I/O และ CPU
- หลีกเลี่ยงเคอร์เซอร์และลูป: แทนที่ด้วยการดำเนินการตามชุด
- การเพิ่มประสิทธิภาพดัชนี: เพิ่มหรือจัดระเบียบดัชนีที่แยกส่วนใหม่
- การดมกลิ่นพารามิเตอร์: ใช้
OPTION (RECOMPILE)เพื่อสร้างแผนใหม่
ตัวอย่าง:
SET STATISTICS TIME ON; SELECT * FROM Orders WHERE CustomerID = 123;
ตรวจสอบการสอบถามที่ช้าเป็นประจำด้วย มุมมองการจัดการแบบไดนามิก (DMV) กดไลก์ sys.dm_exec_query_stats เป็นแนวทางปฏิบัติที่ดีที่สุด
25) Dynamic SQL คืออะไร และมีข้อดีและความเสี่ยงอะไรบ้าง?
SQL แบบไดนามิกช่วยให้คุณสามารถสร้างคำสั่ง SQL แบบไดนามิกในระหว่างการรันไทม์โดยใช้ตัวแปร
ตัวอย่าง:
DECLARE @sql NVARCHAR(MAX); SET @sql = 'SELECT * FROM Employees WHERE Dept = ''' + @Dept + ''''; EXEC(@sql);
ข้อดี:
- ความยืดหยุ่นสำหรับชื่อตารางตัวแปรหรือตัวกรอง
- สามารถนำกลับมาใช้ใหม่ได้สำหรับ schema หลาย ๆ แบบ
ข้อเสีย:
- ความเสี่ยงที่จะ ด้วย SQL Injection หากไม่ได้กำหนดพารามิเตอร์
- ยากกว่าที่จะแก้ไขและบำรุงรักษา
ใช้เสมอ sp_executesql พร้อมพารามิเตอร์เพื่อความปลอดภัย
26) Temporary Object ใน T-SQL คืออะไร และแตกต่างกันอย่างไร
วัตถุชั่วคราวจะถูกเก็บไว้ใน เทมป์ดีบี และช่วยจัดการข้อมูลกลาง
| ประเภทวัตถุ | ขอบเขต | ตัวอย่าง |
|---|---|---|
| ตารางอุณหภูมิท้องถิ่น | เฉพาะเซสชัน | CREATE TABLE #TempTable |
| ตารางอุณหภูมิโลก | มองเห็นได้ในทุกเซสชัน | CREATE TABLE ##TempGlobal |
| ตัวแปรตาราง | เฉพาะชุด | DECLARE @Temp TABLE (...) |
ปฏิบัติที่ดีที่สุด:
- ควรใช้ตัวแปรตารางสำหรับชุดข้อมูลขนาดเล็ก
- ใช้ตารางชั่วคราวในพื้นที่สำหรับข้อมูลขนาดใหญ่ที่มีความต้องการการจัดทำดัชนี
- ลบตารางชั่วคราวออกอย่างชัดเจนเพื่อปลดปล่อยทรัพยากรได้เร็วขึ้น
27) คุณใช้ฟังก์ชันการแบ่งพาร์ติชันหน้าต่างใน T-SQL ได้อย่างไร
การแบ่งพาร์ติชันช่วยให้สามารถใช้ฟังก์ชันหน้าต่างกับชุดย่อยของข้อมูลที่เจาะจงได้
ตัวอย่าง:
SELECT
Department,
EmpName,
Salary,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RankInDept
FROM Employees;
ประโยชน์ที่ได้รับ:
- คำนวณอันดับ ยอดรวม และค่าเฉลี่ยต่อกลุ่มอย่างมีประสิทธิภาพ
- ขจัดความจำเป็นในการเข้าร่วมด้วยตนเองหรือแบบสอบถามย่อย
ใช้กรณี: ระดับเงินเดือน การจัดอันดับการขาย และการวิเคราะห์แนวโน้ม
28) ความแตกต่างระหว่าง UNION และ UNION ALL ใน T-SQL คืออะไร
| ประโยค | รายการที่ซ้ำกัน | ประสิทธิภาพ | ใช้กรณี |
|---|---|---|---|
| ยูเนี่ยน | ลบรายการที่ซ้ำกัน | ช้ากว่า (ใช้การเรียงลำดับ/แยกแยะ) | การรวมชุดผลลัพธ์อย่างสะอาด |
| ยูเนี่ยนทั้งหมด | เก็บข้อมูลซ้ำ | ได้เร็วขึ้น | การรวมหรือการโยกย้ายข้อมูล |
ตัวอย่าง:
SELECT City FROM Customers UNION SELECT City FROM Suppliers;
ชอบ UNION ALL เมื่อข้อมูลที่ซ้ำกันเป็นที่ยอมรับและประสิทธิภาพเป็นสิ่งสำคัญ
29) คุณทำงานกับข้อมูล JSON ใน T-SQL ได้อย่างไร
SQL Server รองรับฟังก์ชัน JSON ดั้งเดิมสำหรับการแยกวิเคราะห์และสร้างข้อมูล JSON
ตัวอย่าง:
DECLARE @json NVARCHAR(MAX) = '{"Name":"John","Age":30}';
SELECT JSON_VALUE(@json, '$.Name') AS Name;
ฟังก์ชั่นที่สำคัญ:
JSON_VALUE()→ แยกค่าสเกลาร์JSON_QUERY()→ แยกวัตถุ/อาร์เรย์OPENJSON()→ แยกวิเคราะห์ JSON เป็นแถวFOR JSON→ แปลงผลลัพธ์ของการค้นหาเป็นรูปแบบ JSON
มีประโยชน์สำหรับ API ระบบไฮบริด และการรวม NoSQL
30) คุณสามารถจัดการและเพิ่มประสิทธิภาพ TempDB ใน SQL Server ได้อย่างไร
TempDB เป็นฐานข้อมูลระบบที่สำคัญสำหรับการจัดเก็บและการกำหนดเวอร์ชันชั่วคราว การจัดการที่ผิดพลาดอาจทำให้เกิดปัญหาประสิทธิภาพการทำงานที่ร้ายแรงได้
เทคนิคการเพิ่มประสิทธิภาพ:
- วาง TempDB ไว้บนพื้นที่จัดเก็บข้อมูลความเร็วสูง (SSD)
- ปรับขนาดข้อมูลและไฟล์บันทึกล่วงหน้า
- ใช้ไฟล์ข้อมูลหลายไฟล์ (1 ไฟล์ต่อคอร์ CPU สูงสุด 8 คอร์)
- ตรวจสอบด้วย
sys.dm_db_file_space_usage. - ควรทำความสะอาดวัตถุชั่วคราวเป็นประจำ
ตัวอย่างแบบสอบถาม:
SELECT * FROM sys.dm_db_file_space_usage;
การจัดการ TempDB เชิงรุกช่วยหลีกเลี่ยงการแข่งขันบนหน้าการจัดสรรและปรับปรุงปริมาณงานฐานข้อมูลโดยรวม
31) คำแนะนำแบบสอบถามใน T-SQL คืออะไร และควรใช้เมื่อใด
คำแนะนำแบบสอบถามจะสั่งให้ตัวเพิ่มประสิทธิภาพ SQL Server เปลี่ยนแผนการดำเนินการปกติ
ควรใช้อย่างประหยัด — เฉพาะเมื่อคุณเข้าใจบริบทการกระจายและการดำเนินการข้อมูลอย่างถ่องแท้เท่านั้น
ตัวอย่าง:
SELECT * FROM Orders WITH (NOLOCK) WHERE CustomerID = 102;
คำแนะนำทั่วไป:
NOLOCK:อ่านโดยไม่ล็อค (อาจอ่านข้อมูลที่ยังไม่ได้ยืนยัน)FORCESEEK:ดัชนีกองกำลังค้นหาแทนการสแกนOPTIMIZE FOR:แนะนำค่าพารามิเตอร์สำหรับการสร้างแผนRECOMPILE:บังคับให้มีการคอมไพล์ใหม่สำหรับการดำเนินการแต่ละครั้ง
ข้อควรระวัง: การใช้คำแนะนำมากเกินไปอาจลดประสิทธิภาพลงเมื่อข้อมูลเพิ่มขึ้นหรือรูปแบบเปลี่ยนแปลง ควรใช้คำแนะนำเฉพาะเมื่อแผนของโปรแกรมเพิ่มประสิทธิภาพพิสูจน์ได้ว่าไม่มีประสิทธิภาพ
32) อธิบายแนวคิดของการแคชแผนการดำเนินการใน SQL Server
SQL Server แคชแผนการดำเนินการเพื่อหลีกเลี่ยงการคอมไพล์ใหม่สำหรับแบบสอบถามที่เกิดขึ้นซ้ำ
เมื่อทำการรันแบบสอบถามเดียวกันอีกครั้งโดยมีโครงสร้างเหมือนกัน ระบบจะนำแผนที่แคชไว้มาใช้ซ้ำ ซึ่งจะช่วยปรับปรุงประสิทธิภาพการทำงาน
ตัวอย่าง:
EXEC GetCustomerOrders @CustomerID = 101;
ประโยชน์ที่ได้รับ:
- ลดค่าใช้จ่าย CPU
- ปรับปรุงความสม่ำเสมอในเวลาตอบสนอง
ปัญหา:
- การดมกลิ่นพารามิเตอร์ อาจทำให้แผนการไม่มีประสิทธิภาพ
- แผนการแคชแบบพองตัวอาจใช้หน่วยความจำ
บรรเทา: ใช้ OPTION (RECOMPILE) or OPTIMIZE FOR UNKNOWN โดยที่พารามิเตอร์จะแตกต่างกันอย่างมาก
33) การดมกลิ่นพารามิเตอร์คืออะไร และสามารถส่งผลต่อประสิทธิภาพได้อย่างไร
การดมกลิ่นพารามิเตอร์จะเกิดขึ้นเมื่อ SQL Server ใช้ค่าพารามิเตอร์จากการดำเนินการแบบสอบถามครั้งแรกเพื่อสร้างแผนที่นำกลับมาใช้ใหม่ แม้ว่าจะไม่เหมาะสมสำหรับการดำเนินการในภายหลังก็ตาม
ตัวอย่างสถานการณ์:
- การดำเนินการครั้งแรก: ชุดข้อมูลขนาดเล็ก → แผนการค้นหาดัชนี
- การดำเนินการครั้งต่อไป: ชุดข้อมูลขนาดใหญ่ → นำแผนเดิมมาใช้ซ้ำ แต่ช้า
แนวทางแก้ไขปัญหา :
- ใช้
OPTION (RECOMPILE)เพื่อสร้างแผนใหม่ - ใช้ตัวแปรท้องถิ่นเพื่อปกปิดค่าพารามิเตอร์
- ใช้
OPTIMIZE FORorOPTIMIZE FOR UNKNOWN.
การดมกลิ่นพารามิเตอร์เป็นหนึ่งในสาเหตุหลักที่ทำให้ประสิทธิภาพการทำงานใน T-SQL ไม่สามารถคาดเดาได้
34) คุณตรวจสอบและวิเคราะห์ประสิทธิภาพการทำงานของแบบสอบถามใน SQL Server ได้อย่างไร
คุณสามารถใช้เครื่องมือและ DMV หลายอย่างเพื่อสร้างโปรไฟล์และปรับแต่งประสิทธิภาพการทำงาน:
- แผนการดำเนินการ:
Ctrl + Mใน SSMS หรือsys.dm_exec_query_plan. - DMV:
sys.dm_exec_query_stats– ซีพียู และระยะเวลาsys.dm_exec_sql_text– ข้อความ SQLsys.dm_exec_requests– การสอบถามที่ใช้งานอยู่
- การตรวจสอบประสิทธิภาพและเหตุการณ์ขยาย เพื่อการติดตามในระยะยาว
ตัวอย่าง:
SELECT TOP 5
total_worker_time / execution_count AS AvgCPU,
total_elapsed_time / execution_count AS AvgTime,
SUBSTRING(qt.text, 1, 100) AS QueryText
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY AvgTime DESC;
35) อธิบายบทบาทของสถิติในการเพิ่มประสิทธิภาพการค้นหา
สถิติจะอธิบายการกระจายข้อมูล (เช่น ค่าที่แตกต่างกัน ความหนาแน่น ฮิสโทแกรม) ที่ตัวเพิ่มประสิทธิภาพใช้ในการประมาณจำนวนคาร์ดินัลลิตี้
หากสถิติล้าสมัย SQL Server อาจเลือกแผนที่ไม่ดี
คำสั่งสำคัญ:
UPDATE STATISTICS Employees;sp_updatestats;- การตั้งค่าอัปเดตอัตโนมัติ: เปิดใช้งานตามค่าเริ่มต้น
ปฏิบัติที่ดีที่สุด:
- เก็บ
AUTO_UPDATE_STATISTICSเปิดการใช้งาน - สำหรับตารางขนาดใหญ่ ควรกำหนดเวลาการอัปเดตด้วยตนเอง
- ใช้
FULLSCANสำหรับดัชนีที่สำคัญ
สถิติที่ล้าสมัยเป็นตัวฆ่าประสิทธิภาพการทำงานอย่างเงียบๆ
36) ความแตกต่างระหว่างการค้นหาดัชนีและการสแกนดัชนีคืออะไร
| Operaการ | Descriptไอออน | ประสิทธิภาพ | ใช้กรณี |
|---|---|---|---|
| การค้นหาดัชนี | นำทางไปยังแถวที่ตรงกันโดยตรง | รวดเร็ว | การสอบถามแบบเลือกสรรอย่างเข้มงวด |
| การสแกนดัชนี | อ่านรายการดัชนีทั้งหมดตามลำดับ | ช้าลง | แบบสอบถามที่มีการเลือกต่ำ |
ตัวอย่าง:
SELECT * FROM Orders WHERE OrderID = 123; -- Seek SELECT * FROM Orders WHERE Status = 'Active'; -- May Scan
เคล็ดลับการเพิ่มประสิทธิภาพ: สร้างดัชนีที่กรองหรือครอบคลุมเพื่อเปลี่ยนการสแกนให้เป็นการค้นหา
37) อธิบายตารางพาร์ติชั่นและข้อดีของตารางเหล่านี้
การแบ่งพาร์ติชันจะแบ่งตารางขนาดใหญ่ให้เป็นชิ้นเล็กๆ ที่จัดการได้ (พาร์ติชัน) โดยมักจะอิงตามคอลัมน์ช่วง (เช่น วันที่)
ประโยชน์ที่ได้รับ:
- จัดการข้อมูลได้เร็วขึ้น (โหลด/ยกเลิกการโหลดตามพาร์ติชัน)
- ปรับปรุงประสิทธิภาพการค้นหาบนชุดข้อมูลขนาดใหญ่
- การประมวลผลแบบขนานสำหรับการสแกนแบบแบ่งพาร์ติชั่น
ตัวอย่าง:
CREATE PARTITION FUNCTION pfRange (DATETIME)
AS RANGE LEFT FOR VALUES ('2022-12-31', '2023-12-31');
ใช้กรณี: คลังข้อมูลที่สามารถจัดการข้อมูลนับพันล้านแถวโดยสามารถเก็บพาร์ติชันเก่าๆ ได้อย่างมีประสิทธิภาพ
38) CTE แบบเรียกซ้ำคืออะไร และมีข้อจำกัดอะไรบ้าง?
A นิพจน์ตารางทั่วไปแบบเรียกซ้ำ (CTE) อ้างอิงถึงตัวมันเอง โดยทั่วไปสำหรับข้อมูลลำดับชั้น เช่น แผนผังองค์กร หรือโครงสร้างแบบต้นไม้
ตัวอย่าง:
WITH EmployeeCTE AS (
SELECT EmpID, ManagerID, EmpName FROM Employees WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmpID, e.ManagerID, e.EmpName
FROM Employees e
INNER JOIN EmployeeCTE c ON e.ManagerID = c.EmpID
)
SELECT * FROM EmployeeCTE;
ข้อ จำกัด :
- ขีดจำกัดการเรียกซ้ำเริ่มต้น = ระดับ 100.
- อาจทำให้เกิดปัญหาด้านประสิทธิภาพได้หากความลึกของการเรียกซ้ำสูง
- ใช้
OPTION (MAXRECURSION n)เพื่อปรับขีดจำกัด
39) SQL Server จัดการข้อผิดพลาดภายในในธุรกรรมอย่างไร
เมื่อเกิดข้อผิดพลาดภายในธุรกรรม:
- ถ้ามัน รุนแรง (ระดับ > 20)การเชื่อมต่อจะสิ้นสุดลงทันที
- If ไม่รุนแรง, มันสามารถจับได้ด้วย
TRY...CATCH.
ตัวอย่าง:
BEGIN TRY
BEGIN TRANSACTION;
UPDATE Accounts SET Balance -= 500 WHERE ID = 1;
INSERT INTO AuditLog VALUES ('Debit');
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
PRINT ERROR_MESSAGE();
END CATCH;
ปฏิบัติที่ดีที่สุด: ควรห่อ DML ไว้ใน TRY…CATCH เสมอเพื่อป้องกันข้อผิดพลาด
40) เทคนิคการปรับแต่งประสิทธิภาพ T-SQL ขั้นสูงมีอะไรบ้าง
- หลีกเลี่ยง UDF สเกลาร์ ใน SELECT — ฟังก์ชันอินไลน์จะเร็วกว่า
- ใช้ดัชนีที่กรองแล้ว เพื่อลดขนาดดัชนี
- ใช้ประโยชน์จาก OLTP ในหน่วยความจำ (Hekaton) สำหรับระบบที่มีการทำงานพร้อมกันสูง
- การดำเนินการโหมดแบตช์ บนดัชนีคอลัมน์สโตร์สำหรับการวิเคราะห์
- กำจัดการแปลงโดยนัย โดยการจับคู่ชนิดข้อมูล
- ใช้ร้านค้าแบบสอบถาม เพื่อเปรียบเทียบแผนผังทางประวัติศาสตร์
ตัวอย่างในการตรวจจับการแปลงโดยนัย:
SELECT * FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_query_plan(plan_handle) WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE '%CONVERT_IMPLICIT%';
การปรับแต่งประสิทธิภาพเป็นกระบวนการต่อเนื่อง ไม่ใช่เหตุการณ์เพียงครั้งเดียว
41) คุณจะระบุแบบสอบถามที่ใช้ทรัพยากรมากที่สุดใน SQL Server ได้อย่างไร
คุณสามารถระบุแบบสอบถามที่มีต้นทุนสูงได้โดยใช้มุมมองการจัดการแบบไดนามิก (DMV) ที่บันทึกสถิติการดำเนินการตามประวัติ
ตัวอย่าง:
SELECT TOP 10
total_logical_reads / execution_count AS AvgReads,
total_worker_time / execution_count AS AvgCPU,
total_elapsed_time / execution_count AS AvgDuration,
SUBSTRING(qt.text, 1, 200) AS QueryText
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY AvgCPU DESC;
ตัวชี้วัดที่สำคัญ:
AvgCPU: เวลา CPU เฉลี่ยต่อการดำเนินการAvgReads: ความเข้มข้นของ I/OAvgDuration: ความหน่วงในการดำเนินการ
แนวทางนี้ช่วยให้ผู้ดูแลฐานข้อมูลสามารถแยกแบบสอบถามจำนวนมากออกได้ก่อนที่ผู้ใช้จะสังเกตเห็นว่าประสิทธิภาพลดลง
42) คุณจะตรวจจับและแก้ไขดัชนีที่หายไปใน SQL Server ได้อย่างไร
SQL Server ติดตามคำแนะนำดัชนีที่หายไปโดยอัตโนมัติผ่าน DMV
ตัวอย่าง:
SELECT
migs.user_seeks AS Seeks,
mid.statement AS TableName,
mid.equality_columns,
mid.inequality_columns,
mid.included_columns
FROM sys.dm_db_missing_index_details mid
JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
ORDER BY migs.user_seeks DESC;
ปฏิบัติที่ดีที่สุด:
- ให้ความสำคัญกับดัชนีการค้นหาสูงก่อน
- ตรวจสอบผ่านแผนการดำเนินการก่อนการสร้าง
- หลีกเลี่ยงการสร้างดัชนีมากเกินไป — จะทำให้การเขียนช้าลง
43) ความแตกต่างระหว่างการมิเรอร์ฐานข้อมูล การจำลองข้อมูล และการจัดส่งบันทึกคืออะไร
| ลักษณะ | จุดมุ่งหมาย | เรียลไทม์ | ล้มเหลว | ความซับซ้อน |
|---|---|---|---|---|
| มิเรอร์ | สำเนาฐานข้อมูลที่มีความพร้อมใช้งานสูง | ใช่ | อัตโนมัติ | กลาง |
| การทำซ้ำ | การกระจายข้อมูลระหว่างฐานข้อมูล | เป็นบางส่วน | ด้วยมือ | จุดสูง |
| การขนส่งท่อนซุง | กลยุทธ์ DR ที่ใช้การสำรองข้อมูล | ไม่ | ด้วยมือ | ต่ำ |
คำแนะนำการใช้งาน:
- การทำมิเรอร์ → ระบบความพร้อมใช้งานสูง OLTP
- การจำลอง → การรายงานแบบกระจาย
- การจัดส่งบันทึก → การตั้งค่าการกู้คืนจากภัยพิบัติ
44) คุณจะแก้ไขปัญหาการบล็อคใน SQL Server ได้อย่างไร
การบล็อคจะเกิดขึ้นเมื่อกระบวนการหนึ่งถือล็อคที่กระบวนการอื่นต้องการ
การระบุตัวบล็อก:
SELECT
blocking_session_id AS Blocker,
session_id AS Blocked,
wait_type,
wait_time,
wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
แนวทางแก้ไขปัญหา :
- ลดระยะเวลาการทำธุรกรรม
- ใช้การแยกสแนปช็อต
- ปรับแต่งแบบสอบถามเพื่อลดการล็อคให้เหลือน้อยที่สุด
- ระบุธุรกรรมเปิดที่ดำเนินมายาวนานด้วย
DBCC OPENTRAN.
45) Query Store ของ SQL Server ช่วยในการปรับแต่งประสิทธิภาพได้อย่างไร
Query Store จะบันทึกข้อความค้นหา แผน และสถิติรันไทม์ ซึ่งช่วยให้สามารถ การวิเคราะห์การถดถอยของแผน.
ช่วยระบุเมื่อแบบสอบถามช้าลงอย่างกะทันหันเนื่องจากการเปลี่ยนแปลงแผน
ตัวอย่าง:
SELECT q.query_id, p.plan_id, rs.avg_duration FROM sys.query_store_query q JOIN sys.query_store_plan p ON q.query_id = p.query_id JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id ORDER BY rs.avg_duration DESC;
ประโยชน์ที่ได้รับ:
- เปรียบเทียบแผนทางประวัติศาสตร์
- บังคับให้มีแผนที่ดีๆ
- ติดตามแนวโน้มประสิทธิภาพในช่วงเวลาต่างๆ
46) คุณสามารถป้องกันการแทรก SQL ในแอปพลิเคชัน T-SQL ได้อย่างไร
การป้องกันเบื้องต้น:
- ใช้ แบบสอบถามที่กำหนดพารามิเตอร์ ผ่านทาง
sp_executesql. - ตรวจสอบและฆ่าเชื้อข้อมูลอินพุตของผู้ใช้ทั้งหมด
- หลีกเลี่ยงการเรียงต่อกันของ SQL แบบไดนามิก
- จ้าง หลักการอภิสิทธิ์น้อยที่สุด สำหรับบัญชีฐานข้อมูล
ตัวอย่างการรักษาความปลอดภัย:
DECLARE @sql NVARCHAR(MAX); SET @sql = N'SELECT * FROM Employees WHERE Dept = @Dept'; EXEC sp_executesql @sql, N'@Dept NVARCHAR(50)', @Dept = 'HR';
แม้ว่าการฉีด SQL จะเป็นระดับแอปพลิเคชัน DBA จะต้องตรวจสอบกระบวนการจัดเก็บและบันทึก สำหรับการดำเนินการแบบไม่มีพารามิเตอร์
47) คุณใช้ Extended Events เพื่อตรวจสอบประสิทธิภาพเชิงลึกได้อย่างไร
Extended Events (XEvents) เป็นกรอบการทำงานการตรวจสอบประสิทธิภาพน้ำหนักเบา ซึ่งเป็นทางเลือกที่ทันสมัยสำหรับ SQL Trace
ตัวอย่าง:
CREATE EVENT SESSION TrackQueries ON SERVER ADD EVENT sqlserver.sql_statement_completed (WHERE duration > 1000) ADD TARGET package0.event_file (SET filename = 'C:\Temp\QueryMonitor.xel'); ALTER EVENT SESSION TrackQueries ON SERVER STATE = START;
ใช้กรณี:
- ตรวจสอบการสอบถาม CPU สูง
- จับภาพเดดล็อกหรือดัชนีที่หายไป
- จัดทำโปรไฟล์คำสั่งที่ดำเนินการยาวนานในการผลิตโดยมีค่าใช้จ่ายคงที่น้อยที่สุด
48) ดัชนีกรองคืออะไร และควรใช้เมื่อใด
ดัชนีที่กรองแล้วจะสร้างดัชนีเฉพาะชุดย่อยของแถวที่ตรงตามเงื่อนไขการกรองเท่านั้น ซึ่งจะช่วยปรับปรุงประสิทธิภาพการทำงานและลดพื้นที่จัดเก็บ
ตัวอย่าง:
CREATE INDEX IX_ActiveEmployees ON Employees (Department) WHERE Status = 'Active';
ประโยชน์ที่ได้รับ:
- ขนาดดัชนีเล็กลง
- การบำรุงรักษาที่รวดเร็วยิ่งขึ้น
- ปรับให้เหมาะสมสำหรับการค้นหาแบบเลือก
ดีที่สุดสำหรับ: คอลัมน์ที่มีการกระจายข้อมูลเบ้ (เช่น เรคคอร์ดที่ใช้งานอยู่และไม่ได้ใช้งาน)
49) คุณจะย้ายข้อมูลอย่างปลอดภัยระหว่างสภาพแวดล้อม SQL Server ได้อย่างไร
การโยกย้ายข้อมูลอย่างปลอดภัยต้องมีการวางแผน ความสม่ำเสมอ เวลาหยุดทำงาน และการย้อนกลับ.
ปฏิบัติที่ดีที่สุด:
- ใช้ การจำลองธุรกรรม or การจับข้อมูลการเปลี่ยนแปลง (CDC) เพื่อการซิงค์สด
- ปิดใช้งานข้อจำกัดและทริกเกอร์ชั่วคราว
- ใช้ BCP or SSIS สำหรับการถ่ายโอนข้อมูลจำนวนมาก
- ตรวจสอบจำนวนแถวและผลรวมตรวจสอบ
- ดำเนินการตรวจสอบความสมบูรณ์หลังการโยกย้ายเสมอ (
DBCC CHECKDB).
ตัวอย่าง:
bcp Database.dbo.Table out TableData.dat -n -S Server -T
การทดสอบสคริปต์การไมเกรชันในการจัดเตรียมเป็นสิ่งที่ไม่สามารถต่อรองได้
50) คุณจะระบุและแก้ไขปัญหาแบบสอบถามที่ไวต่อพารามิเตอร์ (PSQ) ได้อย่างไร
แบบสอบถามที่ไวต่อพารามิเตอร์จะทำงานไม่สม่ำเสมอเมื่อพิจารณาจากค่าพารามิเตอร์ ซึ่งเป็นความท้าทายที่เกิดขึ้นบ่อยครั้งในโลกแห่งความเป็นจริง
การตรวจสอบ: ใช้ ร้านค้าแบบสอบถาม or sys.dm_exec_query_stats เพื่อระบุแผนหลายแผนสำหรับการสอบถามหนึ่งครั้ง
กลยุทธ์การแก้ไข:
- ใช้ ตัวเลือก (คอมไพล์ใหม่) สำหรับการดำเนินการแต่ละครั้ง
- ใช้ เพิ่มประสิทธิภาพสำหรับสิ่งที่ไม่รู้จัก เพื่อสร้างแผนทั่วไป
- สร้างบัญชีตัวแทน คู่มือการวางแผน เพื่อบังคับใช้เส้นทางการดำเนินการที่เหมาะสมที่สุด
- ใช้ คำแนะนำแบบสอบถาม เฉพาะในกรณีที่จำเป็นเท่านั้น
ปัญหาที่ละเอียดอ่อนต่อพารามิเตอร์ต้องมีการสร้างสมดุลระหว่างความเสถียรของแผนและความสามารถในการคาดการณ์ประสิทธิภาพ
🔍 คำถามสัมภาษณ์ T-SQL ยอดนิยมพร้อมสถานการณ์จริงและคำตอบเชิงกลยุทธ์
1) ความแตกต่างระหว่าง INNER JOIN และ LEFT JOIN ใน T-SQL คืออะไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความเข้าใจของคุณเกี่ยวกับการดำเนินการร่วมและวิธีจัดการความสัมพันธ์ของข้อมูลในแบบสอบถาม SQL
ตัวอย่างคำตอบ: An INNER JOIN ส่งคืนเฉพาะแถวที่มีค่าตรงกันในทั้งสองตาราง ในขณะที่ LEFT JOIN ส่งคืนแถวทั้งหมดจากตารางด้านซ้าย พร้อมกับแถวที่ตรงกันจากตารางด้านขวา หากไม่มีการจับคู่ ระบบจะส่งคืนค่า NULL สำหรับคอลัมน์จากตารางด้านขวา ความแตกต่างนี้สำคัญมากเมื่อทำงานกับความสัมพันธ์แบบบางส่วนหรือแบบเลือกได้ในฐานข้อมูล
2) คุณจะระบุและลบระเบียนซ้ำจากตารางใน T-SQL ได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการดูความสามารถของคุณในการใช้ฟังก์ชันหน้าต่างและ CTE เพื่อจัดการกับปัญหาคุณภาพข้อมูล
ตัวอย่างคำตอบ: ฉันจะใช้ Common Table Expression (CTE) ร่วมกับ ROW_NUMBER() ฟังก์ชันสำหรับระบุรายการที่ซ้ำกัน ตัวอย่างเช่น:
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) AS rn FROM MyTable ) DELETE FROM CTE WHERE rn > 1;
แนวทางนี้ช่วยลบข้อมูลที่ซ้ำกันในขณะที่ยังคงรักษาบันทึกเฉพาะหนึ่งรายการสำหรับแต่ละกลุ่ม
3) คุณสามารถอธิบายได้ไหมว่า CTE (Common Table Expression) คืออะไร และคุณจะใช้มันเมื่อใด
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังตรวจสอบความรู้ของคุณเกี่ยวกับการจัดโครงสร้างแบบสอบถามและชุดผลลัพธ์ชั่วคราว
ตัวอย่างคำตอบ: CTE คือชุดผลลัพธ์ชั่วคราวที่กำหนดไว้ภายในขอบเขตการดำเนินการของคิวรีเดี่ยว มีประโยชน์ในการทำให้การรวมและคิวรีย่อยที่ซับซ้อนง่ายขึ้น ปรับปรุงการอ่าน และทำให้คิวรีแบบเรียกซ้ำเป็นไปได้ ในบทบาทก่อนหน้า ฉันใช้ CTE บ่อยครั้งเพื่อแยกตรรกะการรวมหลายขั้นตอนออกเป็นส่วนประกอบที่บำรุงรักษาได้ง่ายขึ้น
4) คุณจัดการการปรับแต่งประสิทธิภาพในแบบสอบถาม T-SQL อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินประสบการณ์ของคุณในการเพิ่มประสิทธิภาพการค้นหาและการแก้ไขปัญหาประสิทธิภาพ
ตัวอย่างคำตอบ: ผมเริ่มต้นด้วยการตรวจสอบแผนการดำเนินการเพื่อระบุการดำเนินการที่ล่าช้า เช่น การสแกนตารางหรือการ join ที่มีค่าใช้จ่ายสูง จากนั้นผมจะตรวจหาดัชนีที่หายไป ซับเควรีที่ซ้ำซ้อน หรือการ join ที่ไม่มีประสิทธิภาพ นอกจากนี้ ผมยังวิเคราะห์สถิติและใช้กลยุทธ์การทำดัชนี เช่น การครอบคลุมดัชนีหรือดัชนีที่กรองแล้ว เพื่อเพิ่มประสิทธิภาพการทำงาน สุดท้าย ผมตรวจสอบตรรกะของคิวรีเพื่อให้แน่ใจว่าใช้ประโยชน์จากการดำเนินการแบบ set-based แทนการประมวลผลแบบแถวต่อแถว
5) อธิบายช่วงเวลาที่คุณต้องดีบักคิวรีที่ทำงานช้าในระบบการผลิต คุณได้ดำเนินการตามขั้นตอนใดบ้าง
สิ่งที่คาดหวังจากผู้สมัคร: คำถามเชิงพฤติกรรมนี้จะประเมินทักษะการแก้ปัญหาและการสื่อสารในโลกแห่งความเป็นจริงของคุณ
ตัวอย่างคำตอบ: ก่อนหน้านี้ คิวรีรายงานใช้เวลาดำเนินการนานกว่า 20 นาที ผมได้วิเคราะห์แผนการดำเนินการและพบว่ามีการรวมข้อมูลหนึ่งรายการขาดดัชนีในคอลัมน์คีย์ต่างประเทศ หลังจากสร้างดัชนีและอัปเดตสถิติแล้ว รันไทม์ของคิวรีลดลงเหลือต่ำกว่า 30 วินาที ผมยังได้บันทึกการแก้ไขและแชร์กับทีมเพื่อป้องกันปัญหาที่คล้ายกันในอนาคตอีกด้วย
6) ตารางชั่วคราวและตัวแปรตารางคืออะไร และแตกต่างกันอย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังทดสอบความเข้าใจของคุณเกี่ยวกับตัวเลือกการจัดเก็บข้อมูลชั่วคราวใน T-SQL
ตัวอย่างคำตอบ: โต๊ะชั่วคราว (#TempTable) ถูกสร้างขึ้นในฐานข้อมูล tempdb และรองรับดัชนี ข้อจำกัด และสถิติ ตัวแปรตาราง (@TableVar) ถูกเก็บไว้ในหน่วยความจำและมีการรองรับสถิติที่จำกัด ทำให้เหมาะสำหรับชุดข้อมูลขนาดเล็ก ตารางชั่วคราวเหมาะสำหรับชุดข้อมูลขนาดใหญ่หรือซับซ้อน ในขณะที่ตัวแปรตารางมีประสิทธิภาพมากกว่าสำหรับข้อมูลขนาดเล็กที่มีอายุสั้น
7) คุณจะจัดการกับการจัดการข้อผิดพลาดและธุรกรรมใน T-SQL อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังตรวจสอบความเข้าใจของคุณเกี่ยวกับความสมบูรณ์ของธุรกรรมและการจัดการข้อยกเว้น
ตัวอย่างคำตอบ: ฉันใช้ BEGIN TRANSACTION, COMMITและ ROLLBACK คำสั่งเพื่อให้แน่ใจว่าข้อมูลมีความสอดคล้องกัน ฉันยังรวม TRY...CATCH บล็อกเพื่อจัดการข้อผิดพลาดอย่างราบรื่น ตัวอย่างเช่น:
BEGIN TRY
BEGIN TRANSACTION
-- SQL operations here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT ERROR_MESSAGE()
END CATCH
แนวทางนี้จะป้องกันการอัปเดตข้อมูลบางส่วนเมื่อเกิดข้อผิดพลาด
8) คุณใช้ฟังก์ชันหน้าต่างใน T-SQL อย่างไร และคุณสามารถให้ตัวอย่างได้หรือไม่?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความสามารถของคุณในการซักถามเชิงวิเคราะห์ขั้นสูง
ตัวอย่างคำตอบ: ฟังก์ชันหน้าต่างช่วยให้สามารถคำนวณชุดแถวที่เกี่ยวข้องกับแถวปัจจุบันได้โดยไม่ยุบข้อมูล ตัวอย่างเช่น:
SELECT EmployeeID, Salary, RANK() OVER (ORDER BY Salary DESC) AS SalaryRank FROM Employees;
สิ่งนี้จะกำหนดหมายเลขอันดับให้กับพนักงานตามเงินเดือน ช่วยให้วิเคราะห์แนวโน้มประสิทธิภาพการทำงานได้ง่าย
9) เล่าให้ฉันฟังเกี่ยวกับโครงการ T-SQL ที่ซับซ้อนที่คุณทำงานด้วย และวิธีที่คุณรับมือกับความท้าทายของโครงการดังกล่าว
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังมองหาความลึกซึ้งในด้านประสบการณ์ การแก้ปัญหา และการทำงานเป็นทีม
ตัวอย่างคำตอบ: ในบทบาทล่าสุด ผมได้สร้าง ETL pipeline ของคลังข้อมูลโดยใช้กระบวนการจัดเก็บแบบ T-SQL ความท้าทายคือการจัดการข้อมูลปริมาณมากอย่างมีประสิทธิภาพ ผมปรับแต่งคิวรีด้วยตารางแบบแบ่งพาร์ติชัน โหลดแบบเพิ่ม และการประมวลผลแบบแบตช์ นอกจากนี้ ผมยังประสานงานกับทีม BI เพื่อให้มั่นใจว่าการออกแบบ schema สอดคล้องกันและปรับปรุงความเร็วในการรายงานมากกว่า 40%
10) คุณจะจัดการกับสถานการณ์ที่กระบวนการจัดเก็บที่คุณเขียนทำให้เกิดการหยุดชะงักในการผลิตอย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังทดสอบการจัดการวิกฤตและความตระหนักทางเทคนิคของคุณ
ตัวอย่างคำตอบ: ก่อนอื่นฉันจะระบุจุดตายโดยใช้ SQL Server sys.dm_tran_locks และกราฟเดดล็อก จากนั้นผมจะวิเคราะห์ลำดับการเข้าถึงทรัพยากรและปรับโครงสร้างกระบวนการเพื่อให้ได้ล็อกตามลำดับที่สอดคล้องกัน ในงานก่อนหน้านี้ ผมได้นำตรรกะการลองใหม่มาใช้กับธุรกรรมที่ได้รับผลกระทบ และกำหนดเวลาการตรวจสอบอย่างสม่ำเสมอเพื่อตรวจจับรูปแบบที่คล้ายคลึงกันตั้งแต่เนิ่นๆ
