20 câu hỏi phỏng vấn SQL - Level Senior phần 1 ( từ câu 1 đến 5 )
1. Window functions trong SQL là gì và chúng được sử dụng như thế nào?
Window functions trong SQL là một nhóm các hàm mà bạn có thể áp dụng trên một "cửa sổ" (window) của dữ liệu, thường được xác định bởi một tập hợp các dòng liên quan đến mỗi dòng trong kết quả của truy vấn. Window functions thường sử dụng với các mệnh đề OVER để xác định phạm vi của cửa sổ.
Các window functions thường được sử dụng để thực hiện các tính toán so sánh giữa mỗi dòng và các dòng xung quanh nó, chẳng hạn như tính tổng tích lũy, tính hàng số dạng rank, tính tỷ lệ phần trăm, và nhiều tính toán khác.
Cú pháp cơ bản của window function như sau:
SELECT
column1,
column2,
window_function(column3) OVER (PARTITION BY partition_column ORDER BY order_column)
FROM
table_name;
- column1, column2: Các cột bạn muốn hiển thị trong kết quả.
- window_function(column3): Window function bạn muốn áp dụng cho cột cụ thể.
- PARTITION BY: Phân vùng dữ liệu thành các phạm vi riêng biệt (tùy chọn).
- ORDER BY: Sắp xếp cửa sổ dữ liệu theo một hoặc nhiều cột (tùy chọn). Ví dụ:
-- Tính tổng tích lũy mức lương cho mỗi phòng ban
SELECT
employee_id,
department_id,
salary,
SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS cumulative_salary
FROM
employees;
Trong ví dụ này, window function SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id)
tính tổng tích lũy của mức lương theo thứ tự mã số nhân viên (employee_id) cho mỗi phòng ban (department_id).
Các window functions phổ biến bao gồm ROW_NUMBER()
, RANK()
, DENSE_RANK()
, SUM()
, AVG()
, MIN()
, MAX()
, và nhiều hàm khác. Sử dụng chúng để thực hiện tính toán thông tin so sánh giữa các dòng trong một cửa sổ xác định.
2. Giải thích khái niệm về phân mảnh cơ sở dữ liệu (Database sharding).
Database sharding là một kỹ thuật trong quản lý cơ sở dữ liệu, nơi dữ liệu của một bảng lớn được phân chia thành nhiều phần nhỏ hơn được gọi là các "shard." Mỗi shard là một phần nhỏ của cơ sở dữ liệu và chứa một phạm vi dữ liệu cụ thể. Mục tiêu của database sharding là tăng cường khả năng mở rộng và hiệu suất của hệ thống cơ sở dữ liệu bằng cách phân chia dữ liệu và giao nhiệm vụ xử lý giữa các shard khác nhau.
Đặc điểm chính của database sharding:
- Phân chia dữ liệu:
- Dữ liệu của bảng lớn được chia thành các shard nhỏ hơn.
- Mỗi shard chứa một phạm vi dữ liệu cụ thể, có thể dựa trên giá trị của một cột (ví dụ: theo giá trị của khóa chính) hoặc theo một phương pháp phân chia khác.
- Phân chia trách nhiệm:
- Mỗi shard có trách nhiệm xử lý một phần của dữ liệu và thực hiện các truy vấn chỉ đối với dữ liệu trong phạm vi của mình.
- Có thể có các shard chịu trách nhiệm cho việc ghi dữ liệu, trong khi các shard khác chỉ xử lý đọc dữ liệu.
- Tăng cường khả năng mở rộng:
- Database sharding giúp tăng khả năng mở rộng của hệ thống bằng cách phân chia gánh nặng xử lý và lưu trữ cho nhiều shard khác nhau.
- Không giống như kiến trúc không sharded, khi lưu trữ toàn bộ dữ liệu trong một cơ sở dữ liệu, sharding cho phép mỗi shard có thể chạy độc lập với các shard khác.
- Hiệu suất cải thiện:
- Với database sharding, mỗi shard có thể có hiệu suất riêng của mình, giảm gánh nặng xử lý và cải thiện thời gian đáp ứng cho các truy vấn.
- Quản lý dữ liệu phân tán:
- Quản lý và duy trì cơ sở dữ liệu trên nhiều shard đòi hỏi quản lý phức tạp hơn, nhưng đồng thời giúp phân tán dữ liệu và giảm độ trễ khi truy xuất dữ liệu từ xa.
Thách thức và cân nhắc:
- Đồng bộ hóa dữ liệu:
- Cần cân nhắc đến cách đồng bộ hóa dữ liệu giữa các shard để đảm bảo tính nhất quán.
- Chọn phương pháp phân chia:
- Phương pháp phân chia dữ liệu cần được chọn cẩn thận để tránh tình trạng "hot spot" (một shard phải xử lý nhiều dữ liệu hơn so với các shard khác).
- Quản lý metadata:
- Metadata của các shard cần được quản lý một cách hiệu quả để theo dõi trạng thái và vị trí của dữ liệu phân chia.
Database sharding là một giải pháp phức tạp và thường được triển khai khi cần mở rộng quy mô cơ sở dữ liệu để đáp ứng yêu cầu tăng trưởng lớn.