50 câu hỏi phỏng vấn T-SQL hàng đầu và câu trả lời (2026)

Bạn đang chuẩn bị cho buổi phỏng vấn T-SQL? Đã đến lúc bạn cần hiểu rõ hơn về cách thức hoạt động thực sự của cơ sở dữ liệu. Với Câu hỏi phỏng vấn T-SQLnhà tuyển dụng không chỉ đánh giá khả năng nhớ cú pháp mà còn cả khả năng thao tác dữ liệu, tối ưu hóa và cấu trúc logic của bạn.
Cơ hội trong lĩnh vực này tiếp tục mở rộng khi các doanh nghiệp phụ thuộc vào dữ liệu chuyên sâu. Các ứng viên có chuyên môn kỹ thuật vững chắc, kỹ năng phân tích và khả năng giải quyết vấn đề thực tế luôn nổi bật - dù là sinh viên mới ra trường hay chuyên gia với 5 đến 10 năm kinh nghiệm. Việc hiểu rõ các câu hỏi và câu trả lời ở cả cấp độ cơ bản và nâng cao giúp các trưởng nhóm, quản lý và kỹ thuật viên kỳ cựu xác định được bộ kỹ năng SQL vững chắc và kinh nghiệm ở cấp độ gốc.
Hướng dẫn của chúng tôi dựa trên những hiểu biết sâu sắc từ hơn 65 nhà quản lý tuyển dụng, hơn 40 nhà phát triển cấp cao và các chuyên gia dữ liệu trên khắp các ngành, đảm bảo bao quát từ logic SQL cơ bản đến các kỹ thuật tối ưu hóa nâng cao được các nhà lãnh đạo kỹ thuật trên toàn thế giới tin cậy. Đọc thêm ...
👉 Tải xuống PDF miễn phí: Câu hỏi và câu trả lời phỏng vấn T-SQL
Những câu hỏi và câu trả lời phỏng vấn T-SQL hàng đầu
1) T-SQL là gì và nó khác với SQL chuẩn như thế nào?
Transact-SQL (T-SQL) là Microsoftphần mở rộng độc quyền của ngôn ngữ SQL, chủ yếu được sử dụng với Microsoft SQL Server. Nó cải tiến SQL chuẩn bằng cách giới thiệu các tính năng lập trình thủ tục như biến, điều kiện, vòng lặp, xử lý lỗi và các hàm dựng sẵn. Trong khi SQL chuẩn tập trung vào thao tác dữ liệu (SELECT, INSERT, UPDATE, DELETE), T-SQL hỗ trợ các câu lệnh điều khiển luồng (IF…ELSE, WHILE), xử lý giao dịch và các hàm hệ thống cho phép các nhà phát triển viết các tập lệnh phức tạp.
| Yếu tố | SQL | t-sql |
|---|---|---|
| TINH THẦN TRÁCH NHIỆM | Tiêu chuẩn ANSI/ISO | Microsoft |
| Logic thủ tục | Giới hạn | Được hỗ trợ (biến, vòng lặp) |
| Xử lý lỗi | Thấp | TRY…CATCH được hỗ trợ |
| Cách dùng thông thường | Cơ sở dữ liệu chung | SQL server |
Ví dụ:
DECLARE @count INT = 5;
WHILE @count > 0
BEGIN
PRINT @count;
SET @count -= 1;
END;
2) Giải thích các loại liên kết khác nhau trong T-SQL bằng ví dụ.
Phép nối trong T-SQL kết hợp các hàng từ hai hoặc nhiều bảng dựa trên các cột có liên quan. Việc hiểu rõ kiểu của chúng rất quan trọng đối với các truy vấn dữ liệu quan hệ.
| Loại tham gia | Mô tả Chi tiết | Ví dụ cú pháp |
|---|---|---|
| INNER JOIN | Chỉ trả về các hàng khớp | SELECT * FROM A INNER JOIN B ON A.id = B.id; |
| LEFT JOIN | Tất cả từ bên trái + các trận đấu từ bên phải | SELECT * FROM A LEFT JOIN B ON A.id = B.id; |
| THAM GIA ĐÚNG | Tất cả từ bên phải + các trận đấu từ bên trái | SELECT * FROM A RIGHT JOIN B ON A.id = B.id; |
| THAM GIA ĐẦY ĐỦ | Kết hợp TRÁI + PHẢI | SELECT * FROM A FULL JOIN B ON A.id = B.id; |
| THAM GIA | Sản phẩm Descartes | SELECT * FROM A CROSS JOIN B; |
Ví dụ thực tế: Tham gia Orders và Customers để tìm ra khách hàng nào đã đặt hàng bằng cách sử dụng INNER JOIN.
3) Biểu thức bảng chung (CTE) là gì và ưu điểm của chúng là gì?
Biểu thức bảng chung (CTE) cung cấp một tập kết quả được đặt tên tạm thời có thể được tham chiếu trong SELECT, INSERT, UPDATE, hoặc là DELETE tuyên bố. Nó cải thiện khả năng đọc và đơn giản hóa các truy vấn đệ quy.
Ưu điểm:
- Cải thiện tính rõ ràng và khả năng bảo trì của truy vấn.
- Cho phép đệ quy (đối với dữ liệu phân cấp như sơ đồ tổ chức).
- Giúp tránh các truy vấn phụ lặp lại.
- Tăng tính mô-đun trong các tập lệnh lớn.
Ví dụ:
WITH EmployeeCTE AS (
SELECT EmpID, EmpName, ManagerID
FROM Employees
)
SELECT * FROM EmployeeCTE WHERE ManagerID IS NULL;
4) Bảng tạm thời và biến bảng trong T-SQL khác nhau như thế nào?
Cả hai đều được dùng để lưu trữ kết quả trung gian, nhưng hành vi và phạm vi của chúng khác nhau đáng kể.
| Tính năng | Bảng tạm thời (#Temp) |
Biến bảng (@TableVar) |
|---|---|---|
| được lưu trữ trong | TempDB | Bộ nhớ (với việc sử dụng TempDB hạn chế) |
| Phạm vi giao dịch | Theo dõi các giao dịch | Độc lập với các giao dịch |
| Chỉ số | Hỗ trợ | Giới hạn |
| HIỆU QUẢ | Tốt hơn cho các tập dữ liệu lớn | Tốt hơn cho các tập dữ liệu nhỏ |
Ví dụ:
DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50)); INSERT INTO @TableVar VALUES (1, 'Alice');
Sử dụng bảng tạm thời khi làm việc với các tập dữ liệu lớn hoặc yêu cầu lập chỉ mục.
5) Giải thích khái niệm giao dịch trong T-SQL và vòng đời của chúng.
Một giao dịch trong T-SQL đảm bảo rằng một chuỗi các thao tác được thực thi như một đơn vị logic duy nhất. Vòng đời bao gồm BẮT ĐẦU GIAO DỊCH, CAM KẾTvà QUAY LẠI.
| Traineeship | Mô tả Chi tiết |
|---|---|
| BẮT ĐẦU GIAO DỊCH | Bắt đầu giao dịch |
| CAM KẾT GIAO DỊCH | Lưu tất cả các thay đổi vĩnh viễn |
| GIAO DỊCH HOÀN LẠI | Hoàn tác tất cả các thao tác kể từ BEGIN cuối cùng |
Ví dụ:
BEGIN TRANSACTION; UPDATE Accounts SET Balance = Balance - 100 WHERE AccID = 1; UPDATE Accounts SET Balance = Balance + 100 WHERE AccID = 2; COMMIT TRANSACTION;
Nếu có lỗi xảy ra giữa chừng, ROLLBACK duy trì tính toàn vẹn của dữ liệu.
6) Sự khác biệt giữa các lệnh DELETE, TRUNCATE và DROP là gì?
| Lệnh | Chức năng | Rollback | Ảnh hưởng đến cấu trúc | Tốc độ |
|---|---|---|---|---|
| DELETE | Xóa các hàng cụ thể | Có | Không | Chậm hơn |
| CẮT CẮT | Xóa tất cả các hàng | Không (thường) | Không | NHANH CHÓNG |
| Thả | Xóa toàn bộ bảng | Không | Có | Nhanh nhất |
Ví dụ:
DELETE FROM Employees WHERE Department = 'HR'; TRUNCATE TABLE TempData; DROP TABLE OldLogs;
Sử dụng DELETE để loại bỏ có chọn lọc, TRUNCATE để xóa, và DROP để loại bỏ hoàn toàn bảng.
7) Xử lý lỗi trong T-SQL hoạt động như thế nào?
T-SQL cung cấp khả năng xử lý lỗi có cấu trúc thông qua TRY...CATCH khối, cho phép các nhà phát triển quản lý lỗi thời gian chạy một cách dễ dàng.
Ví dụ:
BEGIN TRY
INSERT INTO Employees VALUES (1, 'John');
END TRY
BEGIN CATCH
PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH;
Phương pháp này cô lập hoạt động bị lỗi và ngăn chặn giao dịch làm hỏng tính toàn vẹn của dữ liệu. Các nhà phát triển cũng có thể truy cập các chức năng hệ thống như ERROR_NUMBER() or ERROR_SEVERITY() để chẩn đoán.
8) Có những cách nào để tối ưu hóa hiệu suất truy vấn T-SQL?
Tối ưu hóa bao gồm việc tinh chỉnh thiết kế SQL, lập chỉ mục và chiến lược thực thi.
Các kỹ thuật chính:
- Sử dụng lập chỉ mục thích hợp trên các cột thường được truy vấn.
- Tránh
SELECT *— chỉ định rõ ràng các cột. - Sử dụng các hoạt động dựa trên tập hợp thay vì con trỏ.
- Phân tích kế hoạch thực hiện bằng SQL Server Management Studio.
- Sử dụng JOIN hiệu quả với điều kiện BẬT thích hợp.
- Giảm các truy vấn con lồng nhau; thích CTE hoặc bảng tạm thời.
Điều chỉnh hiệu suất trong T-SQL cũng bao gồm việc theo dõi số liệu thống kê thực hiện truy vấn bằng cách sử dụng SET STATISTICS IO ON.
9) Hàm cửa sổ là gì và khi nào bạn nên sử dụng chúng?
Các hàm cửa sổ thực hiện các phép tính trên một tập hợp các hàng liên quan đến hàng hiện tại, mà không gộp chúng thành một kết quả duy nhất. Chúng hữu ích cho việc xếp hạng, tính tổng liên tục và tính trung bình động.
Ví dụ:
SELECT
EmployeeID,
Salary,
RANK() OVER (ORDER BY Salary DESC) AS RankBySalary
FROM Employees;
Các chức năng chung bao gồm RANK(), ROW_NUMBER(), DENSE_RANK()và SUM() OVER().
Những điều này rất quan trọng đối với khối lượng công việc phân tích khi bạn cần cả dữ liệu tổng hợp và dữ liệu cấp hàng.
10) Giải thích sự khác biệt giữa chỉ mục cụm và không cụm.
| Tính năng | Clusterchỉ mục ed | KhôngClusterchỉ mục ed |
|---|---|---|
| Lưu trữ dữ liệu | Sắp xếp lại bàn theo cách vật lý | Cấu trúc riêng biệt |
| Số lượng mỗi bảng | Một | nhiều |
| HIỆU QUẢ | Nhanh hơn cho các truy vấn phạm vi | Nhanh hơn cho các tìm kiếm cụ thể |
| Ví dụ sử dụng | Khóa chính | Tìm kiếm thứ cấp |
Ví dụ:
CREATE CLUSTERED INDEX IX_EmployeeID ON Employees(EmployeeID); CREATE NONCLUSTERED INDEX IX_Dept ON Employees(Department);
Việc lựa chọn đúng loại chỉ mục ảnh hưởng trực tiếp đến tốc độ thực hiện truy vấn và hiệu quả lưu trữ.
11) Thủ tục được lưu trữ trong T-SQL là gì và tại sao chúng được sử dụng?
Thủ tục lưu trữ là tập hợp một hoặc nhiều câu lệnh SQL được biên dịch sẵn, được lưu trữ trên máy chủ. Chúng nâng cao hiệu suất, bảo mật và khả năng tái sử dụng bằng cách cho phép bạn đóng gói logic và thực thi nó nhiều lần mà không cần biên dịch lại. Thủ tục lưu trữ giúp giảm lưu lượng mạng và hỗ trợ các tham số cho việc thực thi động.
Ví dụ:
CREATE PROCEDURE GetEmployeeDetails @Dept NVARCHAR(50)
AS
BEGIN
SELECT EmpName, Position FROM Employees WHERE Department = @Dept;
END;
Lợi ích:
- Hiệu suất tốt hơn nhờ biên dịch trước.
- Cải thiện bảo mật thông qua việc thực hiện có kiểm soát.
- Bảo trì mã và mô-đun hóa dễ dàng hơn.
12) Giải thích sự khác biệt giữa thủ tục được lưu trữ và hàm trong T-SQL.
| Yếu tố | Thủ tục lưu trữ | Chức năng |
|---|---|---|
| Loại trả lại | Có thể trả về nhiều giá trị | Phải trả về một giá trị hoặc bảng duy nhất |
| Sử dụng trong SELECT | Không được phép | Được phép |
| Xử lý lỗi | TRY…CATCH được hỗ trợ | Giới hạn |
| Thực hiện | Được thực hiện thông qua EXEC |
Được sử dụng nội tuyến với SQL |
| Kiểm soát giao dịch | Hỗ trợ | Không được hỗ trợ |
Ví dụ:
- Thủ tục:
EXEC GetEmployeeDetails 'HR'; - Chức năng:
SELECT dbo.GetSalary(101);
Hàm lý tưởng cho việc tính toán; thủ tục tốt hơn cho logic kinh doanh và thao tác dữ liệu.
13) Trigger trong T-SQL là gì và có những loại trigger nào?
Trigger là một thủ tục lưu trữ đặc biệt, tự động thực thi để đáp ứng các sự kiện nhất định (INSERT, UPDATE, DELETE) trên một bảng hoặc dạng xem. Trigger được sử dụng để thực thi các quy tắc nghiệp vụ, kiểm tra các thay đổi hoặc duy trì tính toàn vẹn tham chiếu.
| Kiểu | Mô tả Chi tiết |
|---|---|
| SAU khi kích hoạt | Cháy sau khi sự kiện hoàn tất |
| THAY VÌ Kích hoạt | Thực hiện thay cho sự kiện kích hoạt |
Ví dụ:
CREATE TRIGGER trgAfterInsert
ON Employees
AFTER INSERT
AS
BEGIN
PRINT 'New employee record added!';
END;
Tránh lạm dụng các trình kích hoạt — chúng có thể ảnh hưởng đến hiệu suất và làm phức tạp quá trình gỡ lỗi.
14) Bạn xử lý giá trị NULL trong T-SQL như thế nào?
NULL biểu thị dữ liệu bị thiếu hoặc không xác định. T-SQL cung cấp một số hàm để xử lý dữ liệu này một cách hiệu quả:
ISNULL(expression, replacement)→ thay thế NULL bằng giá trị mặc định.COALESCE(expression1, expression2, ...)→ trả về giá trị đầu tiên không phải NULL.NULLIF(expression1, expression2)→ trả về NULL nếu các biểu thức bằng nhau.
Ví dụ:
SELECT ISNULL(Manager, 'No Manager') AS ManagerName FROM Employees;
Thực hành tốt nhất: Luôn tính đến giá trị NULL trong lệnh nối và điều kiện để tránh những kết quả không mong muốn.
15) Con trỏ trong T-SQL là gì và khi nào nên tránh sử dụng con trỏ?
Con trỏ cho phép xử lý kết quả truy vấn theo từng hàng — hữu ích cho logic phức tạp khi các phép toán dựa trên tập hợp không đủ. Tuy nhiên, con trỏ chậm và nặng về tài nguyên so với các giải pháp thay thế dựa trên tập hợp.
Ví dụ:
DECLARE emp_cursor CURSOR FOR SELECT EmpName FROM Employees; OPEN emp_cursor; FETCH NEXT FROM emp_cursor; -- process CLOSE emp_cursor; DEALLOCATE emp_cursor;
Nhược điểm:
- Tăng cường sử dụng bộ nhớ.
- Khả năng mở rộng kém.
- Hiệu suất giảm.
thay thế: Sử dụng phép nối bảng, truy vấn phụ hoặc hàm cửa sổ bất cứ khi nào có thể.
16) Giải thích câu lệnh MERGE và các trường hợp sử dụng của nó.
MERGE tuyên bố thực hiện CHÈN, CẬP NHẬTvà DELETE các thao tác trong một lệnh duy nhất — lý tưởng để đồng bộ hóa hai bảng.
Ví dụ cú pháp:
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;
Trường hợp sử dụng:
- Kho dữ liệu (đồng bộ hóa phân đoạn và bảng mục tiêu).
- Tải dữ liệu gia tăng.
- Duy trì bảng kiểm toán hoặc bảng kích thước.
17) Có những loại hàm do người dùng định nghĩa (UDF) nào trong T-SQL?
| Kiểu | Mô tả Chi tiết | Ví dụ |
|---|---|---|
| Vô hướng | Trả về một giá trị duy nhất | CREATE FUNCTION GetTax(@Salary DECIMAL) RETURNS DECIMAL |
| Bảng có giá trị nội tuyến | Trả về một bảng thông qua một SELECT |
RETURN SELECT * FROM Employees WHERE Dept = 'HR' |
| Bảng giá trị đa câu lệnh | Trả về một bảng sau nhiều câu lệnh | Hữu ích cho logic phức tạp |
Các hàm thúc đẩy việc tái sử dụng mã và cải thiện thiết kế truy vấn theo mô-đun.
Chúng phải mang tính xác định (trả về cùng một kết quả cho cùng một đầu vào) bất cứ khi nào có thể để tối ưu hóa hiệu suất.
18) Chuẩn hóa là gì và ưu điểm, nhược điểm của nó là gì?
Chuẩn hóa là quá trình sắp xếp dữ liệu trong cơ sở dữ liệu để giảm thiểu sự dư thừa và cải thiện tính toàn vẹn. Quá trình này bao gồm việc chia các bảng thành các thực thể nhỏ hơn, có liên quan với nhau.
| Dạng bình thường | Quy tắc | Ví dụ |
|---|---|---|
| 1NF | Loại bỏ các nhóm lặp lại | Phân tách dữ liệu được phân tách bằng dấu phẩy |
| 2NF | Xóa bỏ các phụ thuộc một phần | Đảm bảo sự phụ thuộc hoàn toàn vào khóa chính |
| 3NF | Xóa bỏ các phụ thuộc bắc cầu | Di chuyển các thuộc tính được dẫn xuất |
Ưu điểm:
- Giảm thiểu sự dư thừa.
- Đảm bảo tính nhất quán của dữ liệu.
- Đơn giản hóa việc bảo trì.
Nhược điểm:
- Các phép nối phức tạp.
- Những đánh đổi hiệu suất tiềm ẩn đối với các truy vấn phân tích.
19) Có những loại ràng buộc nào trong T-SQL?
Ràng buộc thực thi các quy tắc về tính toàn vẹn dữ liệu trong một bảng.
| Hạn chế | Mục đích | Ví dụ |
|---|---|---|
| KHÓA CHÍNH | Xác định duy nhất từng hàng | PRIMARY KEY (EmpID) |
| KHÓA NGOÀI | Liên kết hai bảng | FOREIGN KEY (DeptID) |
| UNIQUE | Đảm bảo các giá trị cột duy nhất | UNIQUE (Email) |
| KIỂM TRA | Xác thực phạm vi dữ liệu | CHECK (Age >= 18) |
| MẶC ĐỊNH | Cung cấp các giá trị mặc định | DEFAULT GETDATE() |
Các ràng buộc đảm bảo tính chính xác và độ tin cậy, giảm nhu cầu xác thực rộng rãi ở cấp độ ứng dụng.
20) Bạn quản lý quyền và bảo mật trong T-SQL như thế nào?
T-SQL quản lý bảo mật cơ sở dữ liệu thông qua đăng nhập, người dùng, vai trò và quyền.
Quyền có thể được cấp hoặc thu hồi ở cấp độ đối tượng hoặc lược đồ.
Ví dụ:
CREATE LOGIN John WITH PASSWORD = 'Strong@123'; CREATE USER John FOR LOGIN John; GRANT SELECT, INSERT ON Employees TO John;
Thực hành tốt nhất:
- Sử dụng vai trò thay vì cấp quyền trực tiếp cho người dùng.
- Tránh sử dụng
sahoặc tài khoản hệ thống cho các ứng dụng. - Kiểm tra quyền thường xuyên với
sys.database_permissions.
Quản lý quyền hợp lý đảm bảo nguyên tắc đặc quyền tối thiểu và tuân thủ các chính sách bảo mật.
21) Các mức độ cô lập giao dịch khác nhau trong T-SQL là gì?
Mức độ cô lập giao dịch xác định cách một giao dịch được cô lập khỏi các giao dịch khác — cân bằng nhất quán với đồng thời. SQL Server hỗ trợ những điều sau:
| Mức độ cô lập | Mô tả Chi tiết | Đọc bẩn | Đọc không lặp lại | Đọc ảo |
|---|---|---|---|---|
| ĐỌC KHÔNG CAM KẾT | Đọc dữ liệu chưa cam kết | Có | Có | Có |
| ĐỌC CAM KẾT | Mặc định; khóa ngăn chặn việc đọc bẩn | Không | Có | Có |
| ĐỌC LẶP LẠI | Ngăn chặn thay đổi dữ liệu cho đến khi cam kết | Không | Không | Có |
| Có thể tuần tự hóa | Cách ly hoàn toàn; khóa cao nhất | Không | Không | Không |
| TÓM TẮT | Sử dụng phiên bản, không khóa | Không | Không | Không |
Ví dụ:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; -- your code COMMIT;
Sử dụng TÓM TẮT cho các hệ thống có tính đồng thời cao để giảm thiểu tình trạng chặn mà không ảnh hưởng đến tính nhất quán.
22) Bế tắc trong SQL Server là gì và làm thế nào để ngăn chặn nó?
A bế tắc xảy ra khi hai giao dịch giữ khóa mà mỗi giao dịch đều cần, dẫn đến bế tắc. SQL Server tự động phát hiện và chấm dứt một giao dịch là nạn nhân của bế tắc.
Kịch bản ví dụ:
- Giao dịch A khóa Table1 rồi chờ Table2.
- Giao dịch B khóa Table2 rồi chờ Table1.
Kỹ thuật phòng ngừa:
- Truy cập tài nguyên theo cùng một thứ tự.
- Giữ giao dịch ngắn gọn.
- Sử dụng mức độ cô lập thích hợp.
- Tránh tương tác của người dùng trong giao dịch.
Sử dụng SQL Profiler hoặc Extended Events để theo dõi tình trạng bế tắc theo thời gian thực.
23) Giải thích sự khác biệt giữa điều khiển đồng thời bi quan và lạc quan.
| Kiểu | Mô tả Chi tiết | Cơ chế khóa | Trường hợp sử dụng |
|---|---|---|---|
| Bi quan | Khóa dữ liệu trong quá trình giao dịch | Khóa nặng | Môi trường xung đột cao |
| Lạc quan | Sử dụng phiên bản hàng, kiểm tra trước khi cam kết | Khóa tối thiểu | Khối lượng công việc đọc nhiều, ít xung đột |
Ví dụ:
- Bi quan: Mặc định
READ COMMITTEDkhóa. - Lạc quan:
SNAPSHOTcô lập với phiên bản hàng.
Tính đồng thời lạc quan giúp tăng cường hiệu suất cho các hệ thống có hoạt động đọc lớn và cập nhật không thường xuyên.
24) Làm thế nào để phân tích và tối ưu hóa truy vấn T-SQL chạy chậm?
- Kiểm tra kế hoạch thực hiện: Xác định các lần quét, chỉ mục bị thiếu và các hoạt động tốn kém.
- Sử dụng SET STATISTICS IO/TIME: Phân tích mức sử dụng I/O và CPU.
- Tránh con trỏ và vòng lặp: Thay thế bằng các phép toán dựa trên tập hợp.
- Tối ưu hóa chỉ mục: Thêm hoặc sắp xếp lại các chỉ mục bị phân mảnh.
- Đánh hơi tham số: Sử dụng
OPTION (RECOMPILE)để tạo ra những kế hoạch mới.
Ví dụ:
SET STATISTICS TIME ON; SELECT * FROM Orders WHERE CustomerID = 123;
Thường xuyên theo dõi các truy vấn chậm với Chế độ xem quản lý động (DMV) Lượt thích sys.dm_exec_query_stats là cách làm tốt nhất.
25) Dynamic SQL là gì và ưu điểm cũng như rủi ro của nó là gì?
SQL động cho phép bạn xây dựng các câu lệnh SQL một cách động khi chạy bằng cách sử dụng các biến.
Ví dụ:
DECLARE @sql NVARCHAR(MAX); SET @sql = 'SELECT * FROM Employees WHERE Dept = ''' + @Dept + ''''; EXEC(@sql);
Ưu điểm:
- Tính linh hoạt cho tên bảng biến hoặc bộ lọc.
- Có thể tái sử dụng cho nhiều lược đồ.
Nhược điểm:
- Dễ bị tổn thương SQL Injection nếu không được tham số hóa.
- Khó gỡ lỗi và bảo trì hơn.
Luôn luôn sử dụng sp_executesql với các thông số về an toàn.
26) Đối tượng tạm thời trong T-SQL là gì và chúng khác nhau như thế nào?
Các đối tượng tạm thời được lưu trữ trong TempDB và giúp quản lý dữ liệu trung gian.
| Loại đối tượng | Phạm vi | Ví dụ |
|---|---|---|
| Bảng nhiệt độ cục bộ | Phiên cụ thể | CREATE TABLE #TempTable |
| Bảng nhiệt độ toàn cầu | Hiển thị cho tất cả các phiên | CREATE TABLE ##TempGlobal |
| Biến bảng | Theo từng đợt | DECLARE @Temp TABLE (...) |
Thực hành tốt nhất:
- Ưu tiên sử dụng biến bảng cho các tập dữ liệu nhỏ hơn.
- Sử dụng bảng tạm thời cục bộ cho dữ liệu lớn hơn cần lập chỉ mục.
- Xóa bảng tạm thời một cách rõ ràng để giải phóng tài nguyên nhanh hơn.
27) Làm thế nào để sử dụng các hàm phân vùng cửa sổ trong T-SQL?
Phân vùng cho phép áp dụng các hàm cửa sổ cho các tập hợp dữ liệu cụ thể.
Ví dụ:
SELECT
Department,
EmpName,
Salary,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RankInDept
FROM Employees;
Lợi ích:
- Tính toán hiệu quả thứ hạng, tổng số và điểm trung bình cho mỗi nhóm.
- Loại bỏ nhu cầu tự nối hoặc truy vấn phụ.
Trường hợp sử dụng: Mức lương, bảng xếp hạng doanh số và phân tích xu hướng.
28) Sự khác biệt giữa UNION và UNION ALL trong T-SQL là gì?
| Khoản | Trùng lặp | HIỆU QUẢ | Trường hợp sử dụng |
|---|---|---|---|
| UNION | Xóa bỏ các bản sao | Chậm hơn (sử dụng sort/distinct) | Kết hợp các tập kết quả một cách gọn gàng |
| ĐOÀN KẾT TẤT CẢ | Giữ lại các bản sao | Nhanh hơn | Tổng hợp hoặc di chuyển dữ liệu |
Ví dụ:
SELECT City FROM Customers UNION SELECT City FROM Suppliers;
Thích hơn UNION ALL khi các bản sao được chấp nhận và hiệu suất là quan trọng.
29) Làm thế nào để làm việc với dữ liệu JSON trong T-SQL?
SQL Server hỗ trợ các hàm JSON gốc để phân tích và tạo dữ liệu JSON.
Ví dụ:
DECLARE @json NVARCHAR(MAX) = '{"Name":"John","Age":30}';
SELECT JSON_VALUE(@json, '$.Name') AS Name;
Chức năng chính:
JSON_VALUE()→ Trích xuất các giá trị vô hướng.JSON_QUERY()→ Trích xuất các đối tượng/mảng.OPENJSON()→ Phân tích cú pháp JSON thành các hàng.FOR JSON→ Chuyển đổi kết quả truy vấn sang định dạng JSON.
Hữu ích cho API, hệ thống lai và tích hợp NoSQL.
30) Làm thế nào để quản lý và tối ưu hóa TempDB trong SQL Server?
TempDB là cơ sở dữ liệu hệ thống quan trọng cho việc lưu trữ tạm thời và quản lý phiên bản. Việc quản lý không tốt có thể gây ra các vấn đề nghiêm trọng về hiệu suất.
Kỹ thuật tối ưu hóa:
- Đặt TempDB vào bộ nhớ nhanh (SSD).
- Định cỡ trước dữ liệu và tệp nhật ký.
- Sử dụng nhiều tệp dữ liệu (1 tệp cho mỗi lõi CPU, tối đa 8 tệp).
- Giám sát với
sys.dm_db_file_space_usage. - Thường xuyên vệ sinh các đồ vật tạm thời.
Truy vấn mẫu:
SELECT * FROM sys.dm_db_file_space_usage;
Quản lý TempDB chủ động giúp tránh tranh chấp trên các trang phân bổ và cải thiện thông lượng cơ sở dữ liệu tổng thể.
31) Gợi ý truy vấn trong T-SQL là gì và khi nào nên sử dụng chúng?
Gợi ý truy vấn hướng dẫn trình tối ưu hóa SQL Server thay đổi kế hoạch thực thi thông thường của nó.
Chúng chỉ nên được sử dụng một cách hạn chế — chỉ khi bạn hiểu đầy đủ về bối cảnh phân phối và thực thi dữ liệu.
Ví dụ:
SELECT * FROM Orders WITH (NOLOCK) WHERE CustomerID = 102;
Gợi ý chung:
NOLOCK:Đọc mà không cần khóa (có thể đọc dữ liệu chưa được xác nhận).FORCESEEK:Lực lượng tìm kiếm chỉ mục thay vì quét.OPTIMIZE FOR:Hướng dẫn các giá trị tham số để tạo kế hoạch.RECOMPILE:Buộc biên dịch lại cho mỗi lần thực thi.
Phạt cảnh cáo: Việc lạm dụng gợi ý có thể làm giảm hiệu suất khi dữ liệu tăng lên hoặc các mô hình thay đổi. Chỉ sử dụng chúng khi kế hoạch của trình tối ưu hóa được chứng minh là không hiệu quả.
32) Giải thích khái niệm về bộ nhớ đệm kế hoạch thực thi trong SQL Server.
SQL Server lưu trữ các kế hoạch thực thi để tránh phải biên dịch lại cho các truy vấn định kỳ.
Khi cùng một truy vấn được thực thi lại với cấu trúc giống hệt nhau, nó sẽ sử dụng lại kế hoạch đã lưu trong bộ nhớ đệm, giúp cải thiện hiệu suất.
Ví dụ:
EXEC GetCustomerOrders @CustomerID = 101;
Lợi ích:
- Giảm tải cho CPU.
- Cải thiện tính nhất quán trong thời gian phản hồi.
Vấn đề:
- Đánh hơi tham số có thể khiến kế hoạch không hiệu quả.
- Bộ nhớ đệm của kế hoạch có thể bị phình to.
Giảm nhẹ: Sử dụng OPTION (RECOMPILE) or OPTIMIZE FOR UNKNOWN nơi các thông số thay đổi rất nhiều.
33) Kiểm tra tham số là gì và nó có thể ảnh hưởng đến hiệu suất như thế nào?
Việc đánh hơi tham số xảy ra khi SQL Server sử dụng các giá trị tham số từ lần thực hiện truy vấn đầu tiên để tạo ra một kế hoạch sau đó được sử dụng lại — ngay cả khi nó không tối ưu cho những lần thực hiện sau.
Kịch bản ví dụ:
- Thực hiện lần đầu: tập dữ liệu nhỏ → kế hoạch tìm kiếm chỉ mục.
- Thực hiện tiếp theo: tập dữ liệu lớn → sử dụng lại cùng một kế hoạch, nhưng chậm.
Giải pháp:
- Sử dụng
OPTION (RECOMPILE)để tạo ra những kế hoạch mới. - Sử dụng biến cục bộ để che dấu giá trị tham số.
- Sử dụng
OPTIMIZE FORorOPTIMIZE FOR UNKNOWN.
Việc theo dõi tham số là một trong những nguyên nhân chính gây ra hiệu suất không thể đoán trước trong T-SQL.
34) Bạn theo dõi và phân tích hiệu suất truy vấn trong SQL Server như thế nào?
Bạn có thể sử dụng một số công cụ và DMV để lập hồ sơ và điều chỉnh hiệu suất:
- Kế hoạch thực hiện:
Ctrl + Mtrong SSMS hoặcsys.dm_exec_query_plan. - DMV:
sys.dm_exec_query_stats– CPU và thời lượng.sys.dm_exec_sql_text– Văn bản SQL.sys.dm_exec_requests– Truy vấn đang hoạt động.
- Giám sát hiệu suất & Sự kiện mở rộng để theo dõi lâu dài.
Ví dụ:
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) Giải thích vai trò của thống kê trong tối ưu hóa truy vấn.
Thống kê mô tả sự phân bổ dữ liệu (ví dụ: giá trị riêng biệt, mật độ, biểu đồ) mà trình tối ưu hóa sử dụng để ước tính số lượng.
Nếu số liệu thống kê đã lỗi thời, SQL Server có thể chọn những kế hoạch kém.
Các lệnh chính:
UPDATE STATISTICS Employees;sp_updatestats;- Cài đặt tự động cập nhật: được bật theo mặc định.
Thực hành tốt nhất:
- Giữ
AUTO_UPDATE_STATISTICSkích hoạt. - Đối với các bảng lớn, hãy lên lịch cập nhật thủ công.
- Sử dụng
FULLSCANcho các chỉ số quan trọng.
Thống kê lỗi thời là kẻ giết người thầm lặng của hiệu suất.
36) Sự khác biệt giữa tìm kiếm chỉ mục và quét chỉ mục là gì?
| Operasản xuất | Mô tả Chi tiết | HIỆU QUẢ | Trường hợp sử dụng |
|---|---|---|---|
| Tìm kiếm chỉ mục | Điều hướng trực tiếp đến các hàng phù hợp | NHANH CHÓNG | Các truy vấn có tính chọn lọc cao |
| Quét chỉ mục | Đọc tất cả các mục chỉ mục theo trình tự | Chậm hơn | Các truy vấn có tính chọn lọc thấp |
Ví dụ:
SELECT * FROM Orders WHERE OrderID = 123; -- Seek SELECT * FROM Orders WHERE Status = 'Active'; -- May Scan
Mẹo tối ưu hóa: Tạo chỉ mục được lọc hoặc bao phủ để chuyển các lần quét thành tìm kiếm.
37) Giải thích về bảng phân vùng và ưu điểm của chúng.
Phân vùng chia một bảng lớn thành các phần nhỏ hơn, dễ quản lý hơn (phân vùng), thường dựa trên cột phạm vi (như ngày).
Lợi ích:
- Quản lý dữ liệu nhanh hơn (tải/dỡ theo phân vùng).
- Cải thiện hiệu suất truy vấn trên các tập dữ liệu lớn.
- Xử lý song song cho các lần quét phân vùng.
Ví dụ:
CREATE PARTITION FUNCTION pfRange (DATETIME)
AS RANGE LEFT FOR VALUES ('2022-12-31', '2023-12-31');
Ca sử dụng: Kho dữ liệu xử lý hàng tỷ hàng, nơi các phân vùng cũ có thể được lưu trữ hiệu quả.
38) CTE đệ quy là gì và chúng có những hạn chế gì?
A Biểu thức bảng chung đệ quy (CTE) tham chiếu chính nó, thường dành cho dữ liệu phân cấp như biểu đồ tổ chức hoặc cấu trúc cây.
Ví dụ:
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;
Hạn chế:
- Giới hạn đệ quy mặc định = 100 mức.
- Có thể gây ra vấn đề về hiệu suất nếu độ sâu đệ quy cao.
- Sử dụng
OPTION (MAXRECURSION n)để điều chỉnh giới hạn.
39) SQL Server xử lý lỗi nội bộ trong các giao dịch như thế nào?
Khi xảy ra lỗi trong giao dịch:
- Nếu đó là nghiêm trọng (mức độ > 20), kết nối sẽ kết thúc ngay lập tức.
- If không nghiêm trọng, nó có thể được bắt bằng
TRY...CATCH.
Ví dụ:
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;
Thực hành tốt nhất: Luôn luôn gói DML trong TRY…CATCH để có khả năng phục hồi lỗi.
40) Một số kỹ thuật điều chỉnh hiệu suất T-SQL nâng cao là gì?
- Tránh các UDF vô hướng trong SELECT — các hàm nội tuyến nhanh hơn.
- Sử dụng chỉ mục đã lọc để giảm kích thước chỉ mục.
- Tận dụng OLTP trong bộ nhớ (Hekaton) cho các hệ thống có tính đồng thời cao.
- Thực hiện chế độ hàng loạt trên các chỉ mục columnstore để phân tích.
- Loại bỏ các chuyển đổi ngầm định bằng cách khớp các kiểu dữ liệu.
- Sử dụng kho lưu trữ truy vấn để so sánh các kế hoạch lịch sử.
Ví dụ để phát hiện chuyển đổi ngầm định:
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%';
Điều chỉnh hiệu suất là một quá trình liên tục chứ không phải là một sự kiện diễn ra một lần.
41) Làm thế nào để xác định các truy vấn tốn nhiều tài nguyên nhất trong SQL Server?
Bạn có thể xác định các truy vấn có chi phí cao bằng cách sử dụng Chế độ xem quản lý động (DMV) ghi lại số liệu thống kê thực hiện theo lịch sử.
Ví dụ:
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;
Số liệu chính:
AvgCPU: Thời gian CPU trung bình cho mỗi lần thực hiện.AvgReads: Cường độ I/O.AvgDuration: Độ trễ thực hiện.
Phương pháp này giúp DBA cô lập các truy vấn nặng trước khi người dùng nhận thấy hiệu suất bị suy giảm.
42) Làm thế nào để phát hiện và sửa các chỉ mục bị thiếu trong SQL Server?
SQL Server tự động theo dõi các đề xuất chỉ mục bị thiếu thông qua DMV.
Ví dụ:
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;
Thực hành tốt nhất:
- Ưu tiên các chỉ mục có lượt tìm kiếm cao trước.
- Xác minh thông qua kế hoạch thực hiện trước khi tạo.
- Tránh lập chỉ mục quá mức — điều này làm chậm tốc độ ghi.
43) Sự khác biệt giữa sao chép, sao chép cơ sở dữ liệu và vận chuyển nhật ký là gì?
| Tính năng | Mục đích | Thời gian thực | Failover | phức tạp |
|---|---|---|---|---|
| Phản chiếu | Bản sao cơ sở dữ liệu có tính khả dụng cao | Có | Tự động | Trung bình |
| Nhân rộng | Phân phối dữ liệu trên các cơ sở dữ liệu | Một phần | Hướng dẫn sử dụng | Cao |
| Ghi nhật ký vận chuyển | Chiến lược DR dựa trên sao lưu | Không | Hướng dẫn sử dụng | Thấp |
Hướng dẫn sử dụng:
- Phản chiếu → Hệ thống OLTP có tính khả dụng cao.
- Sao chép → Báo cáo phân tán.
- Vận chuyển gỗ → Thiết lập phục hồi sau thảm họa.
44) Làm thế nào để khắc phục sự cố chặn trong SQL Server?
Việc chặn xảy ra khi một tiến trình giữ khóa mà tiến trình khác cần.
Để xác định các tác nhân gây tắc nghẽn:
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;
Giải pháp:
- Giảm thời gian giao dịch.
- Sử dụng tính năng cô lập ảnh chụp nhanh.
- Điều chỉnh truy vấn để giảm thiểu tình trạng khóa.
- Xác định các giao dịch mở dài hạn với
DBCC OPENTRAN.
45) Query Store của SQL Server giúp điều chỉnh hiệu suất như thế nào?
Query Store ghi lại văn bản truy vấn, kế hoạch và số liệu thống kê thời gian chạy — cho phép phân tích hồi quy kế hoạch.
Nó giúp xác định thời điểm truy vấn đột nhiên trở nên chậm do thay đổi kế hoạch.
Ví dụ:
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;
Lợi ích:
- So sánh các kế hoạch lịch sử.
- Buộc phải có kế hoạch tốt.
- Theo dõi xu hướng hiệu suất theo thời gian.
46) Làm thế nào để ngăn chặn tấn công SQL injection trong các ứng dụng T-SQL?
Phòng thủ chính:
- Sử dụng truy vấn được tham số hóa thông qua
sp_executesql. - Xác thực và khử trùng tất cả thông tin đầu vào của người dùng.
- Tránh nối lệnh SQL động.
- Thuê nguyên tắc đặc quyền ít nhất dành cho tài khoản cơ sở dữ liệu.
Ví dụ bảo mật:
DECLARE @sql NVARCHAR(MAX); SET @sql = N'SELECT * FROM Employees WHERE Dept = @Dept'; EXEC sp_executesql @sql, N'@Dept NVARCHAR(50)', @Dept = 'HR';
Mặc dù SQL injection là cấp độ ứng dụng, DBA phải kiểm tra các thủ tục và nhật ký được lưu trữ để thực hiện không có tham số.
47) Bạn sử dụng Sự kiện mở rộng như thế nào để theo dõi hiệu suất sâu?
Extended Events (XEvents) là một khuôn khổ giám sát hiệu suất nhẹ — một giải pháp thay thế hiện đại cho SQL Trace.
Ví dụ:
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;
Trường hợp sử dụng:
- Theo dõi các truy vấn CPU cao.
- Ghi lại tình trạng bế tắc hoặc thiếu chỉ mục.
- Tạo hồ sơ các báo cáo dài hạn trong quá trình sản xuất với chi phí tối thiểu.
48) Chỉ mục được lọc là gì và khi nào nên sử dụng?
Chỉ mục được lọc chỉ lập chỉ mục một tập hợp con các hàng đáp ứng điều kiện lọc — cải thiện hiệu suất và giảm dung lượng lưu trữ.
Ví dụ:
CREATE INDEX IX_ActiveEmployees ON Employees (Department) WHERE Status = 'Active';
Lợi ích:
- Kích thước chỉ mục nhỏ hơn.
- Bảo trì nhanh hơn.
- Được tối ưu hóa cho các truy vấn có chọn lọc.
Tốt nhất cho: Các cột có phân phối dữ liệu không đồng đều (ví dụ: bản ghi đang hoạt động so với bản ghi không hoạt động).
49) Làm thế nào để di chuyển dữ liệu an toàn giữa các môi trường SQL Server?
Di chuyển dữ liệu an toàn liên quan đến việc lập kế hoạch cho tính nhất quán, thời gian chết và khôi phục.
Thực hành tốt nhất:
- Sử dụng sao chép giao dịch or thay đổi dữ liệu thu thập (CDC) để đồng bộ trực tiếp.
- Tắt tạm thời các ràng buộc và kích hoạt.
- Sử dụng BCP or SSIS để truyền dữ liệu số lượng lớn.
- Xác thực số lượng hàng và tổng kiểm tra.
- Luôn chạy kiểm tra tính toàn vẹn sau khi di chuyển (
DBCC CHECKDB).
Ví dụ:
bcp Database.dbo.Table out TableData.dat -n -S Server -T
Việc kiểm tra các tập lệnh di chuyển trong giai đoạn thử nghiệm là không thể thương lượng.
50) Làm thế nào để xác định và khắc phục các vấn đề truy vấn nhạy cảm với tham số (PSQ)?
Các truy vấn nhạy cảm với tham số thực hiện không nhất quán dựa trên các giá trị tham số — một thách thức thường gặp trong thế giới thực.
Phát hiện: Sử dụng Cửa hàng truy vấn or sys.dm_exec_query_stats để xác định nhiều kế hoạch cho một truy vấn.
Chiến lược sửa chữa:
- Sử dụng TÙY CHỌN (BIÊN BẢN) cho mỗi lần thực hiện.
- Sử dụng TỐI ƯU HÓA CHO KHÔNG BIẾT để tạo ra một kế hoạch chung.
- Tạo hướng dẫn lập kế hoạch để thực thi các lộ trình thực thi tối ưu.
- Sử dụng gợi ý truy vấn chỉ khi cần thiết.
Các vấn đề nhạy cảm với tham số đòi hỏi phải cân bằng giữa tính ổn định của kế hoạch và khả năng dự đoán hiệu suất.
🔍 Các câu hỏi phỏng vấn T-SQL hàng đầu với các tình huống thực tế và câu trả lời chiến lược
1) Sự khác biệt giữa INNER JOIN và LEFT JOIN trong T-SQL là gì?
Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá sự hiểu biết của bạn về các hoạt động liên kết và cách quản lý các mối quan hệ dữ liệu trong các truy vấn SQL.
Câu trả lời ví dụ: An INNER JOIN chỉ trả về các hàng có giá trị khớp nhau trong cả hai bảng, trong khi LEFT JOIN trả về tất cả các hàng từ bảng bên trái, cùng với các hàng khớp từ bảng bên phải. Nếu không có kết quả khớp, giá trị NULL sẽ được trả về cho các cột từ bảng bên phải. Sự khác biệt này rất quan trọng khi làm việc với các mối quan hệ một phần hoặc tùy chọn trong cơ sở dữ liệu.
2) Làm thế nào để xác định và loại bỏ các bản ghi trùng lặp khỏi một bảng trong T-SQL?
Mong đợi từ ứng viên: Người phỏng vấn muốn xem khả năng sử dụng các hàm cửa sổ và CTE của bạn để xử lý các vấn đề về chất lượng dữ liệu.
Câu trả lời ví dụ: Tôi sẽ sử dụng Biểu thức bảng chung (CTE) kết hợp với ROW_NUMBER() chức năng xác định các bản sao. Ví dụ:
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) AS rn FROM MyTable ) DELETE FROM CTE WHERE rn > 1;
Phương pháp này giúp loại bỏ các bản sao trong khi vẫn giữ lại một bản ghi duy nhất cho mỗi nhóm.
3) Bạn có thể giải thích CTE (Biểu thức bảng chung) là gì và khi nào bạn sẽ sử dụng nó không?
Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra kiến thức của bạn về cấu trúc truy vấn và tập kết quả tạm thời.
Câu trả lời ví dụ: CTE là một tập kết quả tạm thời được định nghĩa trong phạm vi thực thi của một truy vấn duy nhất. Nó hữu ích cho việc đơn giản hóa các phép nối và truy vấn con phức tạp, cải thiện khả năng đọc và cho phép thực hiện các truy vấn đệ quy. Trong vai trò trước đây của mình, tôi thường xuyên sử dụng CTE để chia nhỏ logic tổng hợp nhiều bước thành các thành phần dễ bảo trì hơn.
4) Bạn xử lý việc điều chỉnh hiệu suất trong các truy vấn T-SQL như thế nào?
Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá kinh nghiệm của bạn về tối ưu hóa truy vấn và khắc phục sự cố hiệu suất.
Câu trả lời ví dụ: Tôi bắt đầu bằng cách kiểm tra kế hoạch thực thi để xác định các thao tác chậm như quét bảng hoặc các phép nối tốn kém. Sau đó, tôi kiểm tra các chỉ mục bị thiếu, các truy vấn con dư thừa hoặc các phép nối không hiệu quả. Tôi cũng phân tích số liệu thống kê và sử dụng các chiến lược lập chỉ mục, chẳng hạn như bao phủ chỉ mục hoặc lọc chỉ mục, để cải thiện hiệu suất. Cuối cùng, tôi xem xét logic truy vấn để đảm bảo nó tận dụng các thao tác dựa trên tập hợp thay vì xử lý theo từng hàng.
5) Hãy mô tả một lần bạn phải gỡ lỗi một truy vấn chạy chậm trong môi trường production. Bạn đã thực hiện những bước nào?
Mong đợi từ ứng viên: Câu hỏi về hành vi này đánh giá kỹ năng giải quyết vấn đề thực tế và kỹ năng giao tiếp của bạn.
Câu trả lời ví dụ: Ở vị trí trước, một truy vấn báo cáo mất hơn 20 phút để thực thi. Tôi đã phân tích kế hoạch thực thi và phát hiện ra rằng một trong các phép nối bị thiếu chỉ mục trên cột khóa ngoại. Sau khi tạo chỉ mục và cập nhật số liệu thống kê, thời gian chạy truy vấn giảm xuống dưới 30 giây. Tôi cũng đã ghi lại bản sửa lỗi và chia sẻ với nhóm để ngăn ngừa các sự cố tương tự trong tương lai.
6) Bảng tạm thời và biến bảng là gì và chúng khác nhau như thế nào?
Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự hiểu biết của bạn về các tùy chọn lưu trữ dữ liệu tạm thời trong T-SQL.
Câu trả lời ví dụ: Bảng tạm thời (#TempTable) được tạo trong cơ sở dữ liệu tempdb và hỗ trợ các chỉ mục, ràng buộc và thống kê. Biến bảng (@TableVar) được lưu trữ trong bộ nhớ và có hỗ trợ thống kê hạn chế, khiến chúng phù hợp với các tập dữ liệu nhỏ hơn. Bảng tạm thời phù hợp hơn với các tập dữ liệu lớn hoặc phức tạp, trong khi biến bảng hiệu quả hơn với dữ liệu nhỏ, tồn tại trong thời gian ngắn.
7) Bạn sẽ xử lý lỗi và giao dịch trong T-SQL như thế nào?
Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự hiểu biết của bạn về tính toàn vẹn của giao dịch và cách xử lý ngoại lệ.
Câu trả lời ví dụ: tôi sử dụng BEGIN TRANSACTION, COMMITvà ROLLBACK các tuyên bố để đảm bảo tính nhất quán của dữ liệu. Tôi cũng bao gồm TRY...CATCH khối để xử lý lỗi một cách khéo léo. Ví dụ:
BEGIN TRY
BEGIN TRANSACTION
-- SQL operations here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT ERROR_MESSAGE()
END CATCH
Cách tiếp cận này ngăn chặn việc cập nhật dữ liệu một phần khi xảy ra lỗi.
8) Bạn sử dụng hàm cửa sổ trong T-SQL như thế nào và bạn có thể đưa ra ví dụ không?
Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá trình độ của bạn trong các câu hỏi phân tích nâng cao.
Câu trả lời ví dụ: Các hàm cửa sổ cho phép tính toán trên các tập hợp hàng liên quan đến hàng hiện tại mà không làm thu gọn dữ liệu. Ví dụ:
SELECT EmployeeID, Salary, RANK() OVER (ORDER BY Salary DESC) AS SalaryRank FROM Employees;
Tính năng này chỉ định số thứ hạng cho nhân viên dựa trên mức lương, giúp dễ dàng phân tích xu hướng hiệu suất.
9) Hãy kể cho tôi nghe về một dự án T-SQL phức tạp mà bạn đã từng tham gia và cách bạn giải quyết những thách thức của dự án đó.
Mong đợi từ ứng viên: Người phỏng vấn đang tìm kiếm kinh nghiệm sâu rộng, khả năng giải quyết vấn đề và làm việc nhóm.
Câu trả lời ví dụ: Trong vai trò gần đây nhất, tôi đã xây dựng một đường ống ETL kho dữ liệu sử dụng các thủ tục lưu trữ T-SQL. Thách thức đặt ra là xử lý khối lượng dữ liệu lớn một cách hiệu quả. Tôi đã tối ưu hóa các truy vấn với bảng phân vùng, tải gia tăng và xử lý hàng loạt. Tôi cũng phối hợp với nhóm BI để đảm bảo thiết kế lược đồ nhất quán và cải thiện tốc độ báo cáo hơn 40%.
10) Bạn sẽ xử lý thế nào trong trường hợp một thủ tục được lưu trữ do bạn viết gây ra tình trạng bế tắc trong quá trình sản xuất?
Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra khả năng quản lý khủng hoảng và nhận thức chuyên môn của bạn.
Câu trả lời ví dụ: Đầu tiên tôi sẽ xác định tình trạng bế tắc bằng cách sử dụng SQL Server sys.dm_tran_locks và đồ thị bế tắc. Sau đó, tôi sẽ phân tích thứ tự truy cập tài nguyên và tái cấu trúc quy trình để có được khóa theo một trình tự nhất quán. Trong công việc trước đây, tôi cũng đã triển khai logic thử lại cho các giao dịch bị ảnh hưởng và lên lịch giám sát thường xuyên để phát hiện sớm các mẫu tương tự.
