Harbor

So sánh database quan hệ: Oracle, PostgreSQL, SQL Server, MySQL

Bốn database quan hệ phổ biến nhất khác nhau ở mô hình giấy phép, hệ sinh thái, ngôn ngữ thủ tục và cách xử lý đồng thời. Bài này so sánh ở mức khái niệm, giải thích MVCC với lock-based, clustered với covering index, quy trình tune query, cách chọn cho team Việt Nam và lúc một node không còn đủ.

15 phút đọcHạ tầng theo quy mô

Mô hình quan hệ cho bạn những gì

Trước khi so sánh sản phẩm, cần rõ cái chung của cả bốn: mô hình quan hệ. Đây là nền tảng toán học dựa trên lý thuyết tập hợp và logic vị từ. Một bảng tương ứng với một quan hệ, mỗi dòng là một phát biểu đúng về dữ liệu.1

Bốn thứ bạn nhận được khi chọn database quan hệ:

  • ACID. Transaction là đơn vị công việc nguyên tử: hoặc mọi thay đổi xảy ra, hoặc không thay đổi nào. Dữ liệu đã commit phải sống sót sau sự cố.2 Grokking mô tả ACID là một abstraction đủ mạnh để giấu nhiều bất thường (dirty read, lost update, write skew, phantom read) sau một thao tác abort đơn giản.3
  • SQL. Ngôn ngữ khai báo: bạn nói muốn lấy gì, engine tự chọn cách lấy.4 Chuẩn ANSI/ISO có từ 1986 nên kỹ năng SQL chuyển giữa các sản phẩm khá dễ, dù mỗi hãng có phần mở rộng riêng.
  • Constraint. Khoá chính, unique, khoá ngoại, check, default là một phần định nghĩa bảng. Sách gọi đây là toàn vẹn dữ liệu khai báo (declarative), khác với toàn vẹn bằng code như stored procedure hay trigger.5
  • Join. Dữ liệu chuẩn hoá thành nhiều bảng, nối lại bằng khoá ngoại khi truy vấn. Grokking gọi đây là cơ chế giảm dư thừa (normalization).67

Cái giá là impedance mismatch: bảng phẳng không khớp với object lồng nhau trong code ứng dụng.6 Đây là lý do một số bài toán chọn NoSQL thay vì SQL. Với dữ liệu có quan hệ, cần transaction và query linh hoạt, database quan hệ vẫn là lựa chọn mặc định. Xem Mô hình dữ liệu và Chọn database.

Lưu ý: Chữ "Consistency" của ACID nghĩa là dữ liệu tuân thủ mọi constraint sau transaction.2 Nó khác chữ "Consistency" trong CAP.

Bảng so sánh bốn hệ

Thư viện có sách về SQL Server và PostgreSQL. Oracle và MySQL/MariaDB không có sách, nên các ô của hai cột này chỉ nêu khái niệm đã phổ biến, không có phiên bản, giá hay con số benchmark.89

Tiêu chíOracle DatabasePostgreSQLMicrosoft SQL ServerMySQL / MariaDB
Mô hình giấy phép và chi phíThương mại, tính phí theo licence và option; chi phí thường cao nhất trong bốn hệ8Mã nguồn mở, không phí licence; trả tiền cho vận hành hoặc dịch vụ managed10Thương mại, chia theo edition; sách ghi rõ một số công cụ chỉ có ở Enterprise Edition11Mã nguồn mở, MariaDB là nhánh fork; có bản thương mại đi kèm hỗ trợ9
Hệ sinh thái và công cụBộ công cụ doanh nghiệp rất rộng, nhiều tính năng cho dữ liệu lớn và bảo mật8Extension phong phú (contrib: fuzzy match, trigram, cube...)12SSMS, Extended Events, DMV, Profiler, tích hợp chặt với .NET và hệ Microsoft1314Hầu hết framework web có driver sẵn; cộng đồng lớn9
Điểm mạnhĐộ tin cậy và tính năng ở quy mô lớn8Tuân thủ chuẩn ANSI SQL cao, transaction mạnh, index đa dạng15T-SQL mạnh, tooling tuning chi tiết, row versioning tuỳ chọn16Đơn giản, nhanh với đọc nhiều, dễ bắt đầu9
Dùng điển hìnhNgân hàng, viễn thông, hệ thống lõi doanh nghiệp17Startup, web, sản phẩm SaaS17Ứng dụng doanh nghiệp .NET, hệ thống legacy Microsoft17Web, CMS, thương mại điện tử cỡ vừa17
Replication và HA (mức khái niệm)Có các cơ chế standby và cluster riêng8WAL shipping bất đồng bộ hoặc đồng bộ, logical replication18Có replication là một thành phần cài đặt;19 cơ chế HA chi tiết thì chưa có sách20Có replication primary-replica phổ biến9
Ngôn ngữ thủ tụcPL/SQL8PL/pgSQL và vài ngôn ngữ khác21T-SQL, stored procedure, function, trigger22Stored procedure theo cú pháp riêng9
JSONCó hỗ trợ kiểu JSON8Có kiểu JSONB có thể đánh index10Thư viện chỉ có bản 2012, trong đó JSON chỉ xuất hiện ở vai trò định dạng thông điệp, chưa có sách về kiểu JSON20Có kiểu JSON9
Chi phí vận hànhCần DBA chuyên trách ở quy mô lớn8Phải tự lo vacuum, pooling, failover nếu không dùng managed10DBA cần quen công cụ Windows; tuning có phương pháp rõ ràng23Vận hành đơn giản ở quy mô nhỏ, phức tạp khi cần HA nhiều tầng9

Hai hàng đáng nhớ nhất khi phỏng vấn là giấy phép và ngôn ngữ thủ tục. Giấy phép quyết định tổng chi phí sở hữu. Ngôn ngữ thủ tục quyết định bạn đặt bao nhiêu logic trong database. Stored procedure có lợi: gom logic một chỗ, cấp quyền theo procedure thay vì theo bảng, tái dùng execution plan và giảm round trip mạng.22 Nhưng logic nằm trong database khó scale ngang hơn logic ở tầng ứng dụng (nhận định của khoá học).17

Ví dụ một procedure T-SQL đơn giản:

CREATE PROCEDURE Sales.GetCustomerOrders
  @custid INT, @fromdate DATE, @todate DATE
AS
BEGIN
  SELECT orderid, orderdate, custid
  FROM Sales.Orders
  WHERE custid = @custid
    AND orderdate >= @fromdate AND orderdate < @todate;
END;

Cú pháp tương tự là CREATE FUNCTION ... LANGUAGE plpgsql ở PostgreSQL, nơi sách minh hoạ bằng một hàm ghi log khi event bị cập nhật.21

Isolation và MVCC: khoá hay phiên bản

Mọi database quan hệ phải trả lời cùng một câu hỏi: khi một transaction đang sửa dòng, transaction khác đọc dòng đó thì thấy gì? Có hai họ cơ chế.

  • Lock-based (bi quan). Người đọc xin shared lock, người ghi xin exclusive lock. Nếu dữ liệu đang ở trạng thái chưa nhất quán, người đọc phải đợi.24
  • Row versioning, hay MVCC (lạc quan). Người đọc không khoá và không đợi. Nếu bản hiện tại không phải bản nó được phép thấy, nó nhận bản cũ đã commit.24

SQL Server hỗ trợ cả hai: bốn mức dựa trên khoá (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) và hai mức dựa trên row versioning (SNAPSHOT, READ COMMITTED SNAPSHOT).16 Bảng dưới là tóm tắt của sách:

MứcUncommitted readNon-repeatable readLost updatePhantom readPhát hiện update conflictDùng row versioning
READ UNCOMMITTEDCóCóCóCóKhôngKhông
READ COMMITTEDKhôngCóCóCóKhôngKhông
READ COMMITTED SNAPSHOTKhôngCóCóCóKhôngCó
REPEATABLE READKhôngKhôngKhôngCóKhôngKhông
SERIALIZABLEKhôngKhôngKhôngKhôngKhôngKhông
SNAPSHOTKhôngKhôngKhôngKhôngCóCó

Nguồn của bảng: T-SQL Fundamentals, Table 9-3.25 Điểm hay bị hiểu sai: SNAPSHOT cho kết quả logic gần SERIALIZABLE nhưng không dùng shared lock, còn READ COMMITTED SNAPSHOT gần READ COMMITTED nhưng người đọc không bị chặn.26 Cái giá của row versioning là mọi UPDATE và DELETE phải copy bản cũ sang tempdb, nên ghi chậm hơn một chút còn đọc thường nhanh hơn.26

Về mặc định của từng sản phẩm: SQL Server on-premises mặc định READ COMMITTED dựa trên khoá, còn bản cloud SQL Database mặc định READ COMMITTED SNAPSHOT.16 PostgreSQL, Oracle và InnoDB của MySQL đều dùng đa phiên bản cho đọc; mức mặc định cụ thể của từng hệ khác nhau và thư viện chưa có sách kiểm chứng.1089

Đang vẽ sơ đồ…

Lý thuyết · MVCC và lock-based: Lock-based: transaction muốn đọc phải xin shared lock; transaction đang ghi giữ exclusive lock; hai loại này xung đột nên người đọc đợi tới khi người ghi commit hoặc rollback. Tính nhất quán đạt được vì không ai thấy trạng thái dở. MVCC: mỗi lần ghi tạo một phiên bản mới của dòng và giữ bản cũ; mỗi transaction (hoặc mỗi câu lệnh) có một mốc thời gian đọc và chỉ thấy phiên bản commit trước mốc đó. Ví dụ số: dòng balance = 100. T1 chạy UPDATE balance = 70 nhưng chưa commit. T2 bắt đầu và đọc. Lock-based: T2 đợi, sau khi T1 commit mới thấy 70. MVCC: T2 thấy 100 ngay, vì 70 chưa commit. Nếu T2 dùng mức SNAPSHOT, nó tiếp tục thấy 100 cả khi T1 đã commit rồi, vì mốc đọc nằm ở lúc T2 bắt đầu; còn với READ COMMITTED SNAPSHOT thì câu lệnh tiếp theo của T2 sẽ thấy 70.26 Khi hai transaction cùng ghi một dòng, SNAPSHOT huỷ transaction đến sau với lỗi update conflict, còn REPEATABLE READ và SERIALIZABLE (lock-based) xử lý bằng deadlock.27 Đánh đổi chung: MVCC giảm chặn giữa đọc và ghi nhưng tốn bộ nhớ hoặc dung lượng cho các phiên bản cũ và cần dọn chúng.

Với bài toán tranh chấp như đặt vé, mức isolation mặc định thường chưa đủ, bạn cần thêm khoá dòng hoặc update có điều kiện. Xem Tranh chấp tài nguyên và phần transaction trong PostgreSQL.

Index: clustered, non-clustered và covering

Phần này dùng thuật ngữ của SQL Server, nhưng khái niệm áp dụng cho cả bốn hệ (cách hiện thực mỗi hệ khác nhau, thư viện chỉ có sách cho SQL Server).9

  • Heap. Bảng mới tạo là một heap: dòng được thêm theo thứ tự đến, không có thứ tự nào khác.28
  • Clustered index. Dữ liệu của bảng được sắp xếp và lưu theo khoá của index. Index này chính là bảng, nên mỗi bảng chỉ có một clustered index. Khoá thường chọn theo đường truy cập hay dùng nhất, thường là khoá chính.29
  • Non-clustered index. Là cấu trúc riêng, sắp xếp theo các cột được chọn, mỗi dòng trỏ về vị trí dữ liệu trong clustered index hoặc heap. Một bảng có thể có nhiều non-clustered index.30 Mỗi index thêm vào làm chậm ghi và tốn bộ nhớ, nên đừng tạo vô tội vạ.30
  • Lookup. Khi query cần cột không có trong non-clustered index, engine phải theo con trỏ về dòng gốc. Đó là key lookup (với clustered index) hoặc RID lookup (với heap). Mỗi lookup tốn thêm một lần đọc trang dữ liệu.31
  • Covering index. Nếu mọi cột query cần đều nằm trong index, engine không cần chạm vào trang dữ liệu. Có thể đạt được bằng cách thêm cột vào mệnh đề INCLUDE: các cột này nằm trong index nhưng không được sắp xếp.3231
-- Query hay chạy
SELECT orderdate, custid FROM Sales.Orders WHERE custid = 42;

-- Covering index: custid để tìm, orderdate nằm sẵn trong index
CREATE NONCLUSTERED INDEX ix_orders_cust
  ON Sales.Orders (custid) INCLUDE (orderdate);

Sách khuyên clustered index hợp với tập kết quả lớn vì trang lá của nó chính là trang dữ liệu, không cần lookup; còn kết quả nhỏ thì non-clustered index là lựa chọn tốt.31 Cột có selectivity cao (nhiều giá trị khác nhau) mới đáng đánh index.33 Với PostgreSQL, cùng ý tưởng nhưng khác tên: bảng không có clustered index tự duy trì, và INCLUDE được nhắc ở bài PostgreSQL là tính năng sản phẩm.10 Chi tiết thiết kế index ở Database index.

Quy trình tune một query chậm

Sách SQL Server Query Performance Tuning trình bày một vòng lặp rõ ràng. Nguyên tắc chung dùng được cho cả bốn hệ, còn công cụ thì khác nhau.23

Đang vẽ sơ đồ…
  1. Tìm query đắt nhất. Ghi các query bằng Extended Events, nhóm theo số logical read. Query đọc nhiều nhất thường là thủ phạm gây áp lực bộ nhớ. DMV sys.dm_exec_query_stats cho thông tin nhanh về query đang chạy.34 Đừng tune theo cảm giác "chậm": phải so với một mốc cụ thể.23
  2. Xem execution plan. Plan mô tả chiến lược xử lý của optimizer. Có plan ước lượng (estimated, không cần chạy query) và plan thực tế (actual, thêm số liệu lúc chạy).35 Optimizer không tìm plan hoàn hảo mà tìm plan "đủ tốt", nên đôi khi plan kém.35
  3. Đếm reads. SET STATISTICS IO ON cho biết số lần đọc theo từng bảng, giúp tập trung vào bảng đọc nhiều nhất.36
  4. Kiểm tra statistics. Optimizer của SQL Server dựa trên chi phí và dùng statistics về phân bố dữ liệu để ước lượng số dòng và chọn index, kiểu join.37 Statistics cũ dẫn tới plan sai. Hãy chắc rằng cơ chế tự cập nhật statistics đang hoạt động; khi cần, tự quản lý bằng tay.37
  5. Sửa rồi đo lại. Thêm hoặc đổi index (ví dụ covering index ở trên), viết lại query, rồi so lại số reads và thời gian.

Plan được cache và dùng lại để khỏi tối ưu lại mỗi lần;38 stored procedure dùng lại plan theo mặc định.22 Công cụ tương đương ở PostgreSQL và MySQL (EXPLAIN, thống kê query chậm) là kiến thức sản phẩm, chưa có sách trong thư viện.109

Mẹo: Khi phỏng vấn gặp câu "query chậm thì bạn làm gì", trả lời theo trình tự: đo, xem plan, kiểm tra index và statistics, rồi mới sửa. Nói "thêm index" ngay thường bị hỏi vặn.

Chọn database cho team Việt Nam

Phần này là hướng dẫn của khoá học, dựa trên bối cảnh phổ biến ở thị trường Việt Nam, không phải số liệu từ sách.17

Đang vẽ sơ đồ…
Bối cảnhGợi ýLý do (course guidance)
Enterprise, legacy .NET, team đã quen Visual Studio và SSMSSQL ServerTích hợp .NET, tooling tuning đầy đủ, nhân sự quen công cụ17
Ngân hàng, viễn thông, hệ thống lõi có yêu cầu pháp lý hoặc hợp đồng với vendorOracleThường là chuẩn có sẵn của ngành, đội DBA đã có; cân nhắc chi phí licence17
Startup, web, SaaS mớiPostgreSQL hoặc MySQLKhông tốn licence, nhiều dịch vụ managed, tuyển người dễ17
Cần tìm kiếm full-text vừa phải, geospatial, extensionPostgreSQLtsvector, GIN, contrib, PostGIS12
Web đọc nhiều, team đã quen LAMPMySQL hoặc MariaDBDễ bắt đầu, tài liệu tiếng Việt nhiều17

Hai quy tắc cho dự án mới: chọn thứ team vận hành được, và đừng tự ràng buộc vào tính năng độc quyền khi chưa cần. Nếu logic nghiệp vụ nằm hết trong stored procedure PL/SQL hay T-SQL, việc đổi sản phẩm sau này rất tốn kém.17 Trong phỏng vấn system design, người ta thường chấp nhận "PostgreSQL hoặc MySQL" miễn là bạn nêu được lý do và con số tải.

Một node chịu được bao nhiêu

Dù chọn hệ nào, câu hỏi sizing là như nhau. Mốc từ sách: Grokking dùng khoảng 1.000 QPS cho một server MySQL, 10.000 QPS cho key-value store.39 Con số của khoá học (ước lượng, cần load test): một node 4 vCPU · 16 GB xử lý được vài nghìn truy vấn đơn giản có index mỗi giây khi dữ liệu nóng nằm trong RAM; query join nặng thì thấp hơn nhiều.40

MứcCấu hình ví dụĐọc đơn giản/giây (ước lượng)Ghi chú
Mốc sách1 server DBkhoảng 1.000 QPS (Grokking, MySQL)Dùng cho query thực tế có join39
Nhỏ2 vCPU · 8 GBvài trăm đến vài nghìnMVP, nội bộ40
Vừa4 vCPU · 16 GBvài nghìnSản phẩm vừa, thêm một replica đọc40
Lớn16 vCPU trở lên, nhiều RAMhàng chục nghìnGần trần của một node40

Ví dụ (giả định của khoá học): 500.000 DAU, mỗi người 40 request/ngày, 40% request chạm DB, mỗi request 2 query. Số query mỗi ngày là 500.000 × 40 × 40% × 2 = 16 triệu. Chia cho 86.400 giây ra khoảng 185 QPS trung bình; peak ×5 ≈ 925 QPS. Con số này nằm dưới mốc 1.000 QPS của Grokking, nên một primary cộng một replica đủ dùng.41 Hệ số peak ×5 là giả định. Xem Con số cần thuộc.

Cần nhắc: các con số trên áp dụng cho cả bốn hệ ở mức bậc độ lớn. Khác biệt thật giữa sản phẩm nằm ở cấu hình, schema, workload, nên phải đo.

Khi một node không còn đủ

Thứ tự xử lý từ rẻ tới đắt, giống với trong bài PostgreSQL:

  1. Thêm index đúng, tune query bằng quy trình ở trên.
  2. Cache đọc bằng Redis, xem Caching.
  3. Thêm read replica. Grokking nêu mô hình primary-secondary: mọi ghi đi qua primary; replication bất đồng bộ có thể làm secondary trả dữ liệu cũ.18 Xem Scale đọc.
  4. Nâng cấu hình máy (scale up). Building Microservices cũng nhận định với giới hạn ghi, máy to hơn thường là cách nhanh nhất.42
  5. Partition và tách bảng theo chức năng sang database riêng. Grokking mô tả sharding theo chiều dọc (tách bảng hoặc cột) và theo chiều ngang (tách dòng).43
  6. Shard ngang theo khoá như user_id, kèm nhược điểm: query xuyên shard, resharding.43 Xem Sharding và Scale ghi.
  7. Chuyển sang loại database khác cho đúng workload: Cassandra, DynamoDB cho ghi rất lớn, Elasticsearch cho tìm kiếm. Xem Chọn NoSQL.

Dấu hiệu cần sang bước 5 và 6: CPU primary cao kéo dài, working set không vừa RAM của máy lớn nhất bạn chấp nhận trả, hoặc backup và restore quá lâu (ngưỡng là giả định của khoá học).40 Chi tiết các bước ở Database scale.

Trong phỏng vấn: Hãy nói theo trình tự: "Tôi bắt đầu với một primary cộng replica, dùng PostgreSQL hoặc hệ team đang chạy. Ước lượng peak khoảng 900 QPS, nằm dưới mốc 1.000 QPS của Grokking, nên chưa cần shard.39 Khi ghi vượt trần primary tôi sẽ partition, rồi shard theo user." Đưa ra con số rồi đưa ra lộ trình, đừng bắt đầu bằng so sánh tên sản phẩm.

Sai lầm hay gặp: Chọn database theo "độ hot" của sản phẩm thay vì theo workload và năng lực của team. Một primary cộng replica được tune tốt thường chịu được tải mà nhiều hệ thống không bao giờ vượt qua.

Nguồn trích dẫn

  1. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.1 Background to T-SQL Querying and Programming · mục "Set Theory", "Predicate Logic", "The Relational Model" (tr. 3–5). ↩

  2. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 Transactions and Concurrency · mục "Transactions" (định nghĩa atomicity, consistency, isolation, durability, tr. 298). ↩ ↩2

  3. Grokking Modern System Design · ch.9 Databases · mục "Relational databases" (ACID và các bất thường được giấu sau transaction abort). ↩

  4. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.1 · mục "SQL" (SQL là ngôn ngữ chuẩn ANSI/ISO, khai báo, tr. 3). ↩

  5. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.1 · mục "Defining Data Integrity" (declarative và procedural data integrity, primary key, unique, foreign key, check, default, tr. 22). ↩

  6. Grokking Modern System Design · ch.9 Databases · mục "Why relational databases?" (reduced redundancy, concurrency) và "Drawback: Impedance mismatch". ↩ ↩2

  7. Seven Databases in Seven Weeks (file .zip, tải về giải nén) · ch.2 PostgreSQL · Day 1, mục về join giữa các bảng (inner join, outer join; Day 1). ↩

  8. Chưa có nguồn trong thư viện: thư viện không có sách về Oracle Database; các ô về Oracle chỉ nêu khái niệm phổ biến, không có phiên bản, giá hay benchmark. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  9. Chưa có nguồn trong thư viện: thư viện không có sách về MySQL hoặc MariaDB (ngoài con số 1.000 QPS của Grokking); các ô về MySQL/MariaDB chỉ nêu khái niệm cơ bản, không có phiên bản, giá hay benchmark. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11

  10. Chưa có nguồn trong thư viện: thư viện không có sách riêng về nội bộ PostgreSQL (JSONB, MVCC, mức isolation mặc định, INCLUDE, EXPLAIN, vận hành); chỉ nêu khái niệm cơ bản, không có số liệu hay phiên bản. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  11. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · Introduction (một số công cụ chỉ có ở Enterprise Edition, được ghi chú trong sách). ↩

  12. Seven Databases in Seven Weeks (file .zip, tải về giải nén) · ch.2 PostgreSQL · Day 1 (gói contrib) và Day 3, mục về fuzzy matching bằng trigram và full-text search. ↩ ↩2

  13. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.3 SQL Query Performance Analysis · mục "Execution Plans" và phần tóm tắt (Extended Events, DMV sys.dm_exec_query_stats, Management Studio). ↩

  14. Beginning SQL Server 2012 for Developers (file .zip, tải về giải nén) · ch.1 Overview and Installation · mục chọn thành phần cài đặt (Database Engine Services, Replication, Full-Text Search, Data Quality Services). ↩

  15. Seven Databases in Seven Weeks (file .zip, tải về giải nén) · ch.2 PostgreSQL · phần mở đầu (PostgreSQL tuân thủ ANSI SQL cao, ACID, stored procedure, plug-in). ↩

  16. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 Transactions and Concurrency · mục "Isolation Levels" (bốn mức dựa trên khoá, hai mức dựa trên row versioning, mặc định của từng bản, tr. 309–310). ↩ ↩2 ↩3

  17. Hướng dẫn của khoá học (course guidance), tổng hợp từ bối cảnh thị trường phổ biến. Đây là nhận định, không phải số liệu từ sách; cần đối chiếu với tình hình công ty và nhân sự thực tế. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11

  18. Grokking Modern System Design · ch.9 Databases · mục "Replication", "Synchronous versus asynchronous replication", "Single leader or primary-secondary replication". ↩ ↩2

  19. Beginning SQL Server 2012 for Developers (file .zip, tải về giải nén) · ch.1 Overview and Installation · mục "SQL Server Replication" trong danh sách thành phần. ↩

  20. Chưa có nguồn trong thư viện: các sách SQL Server trong thư viện là bản 2012, không mô tả chi tiết cơ chế HA hiện đại (AlwaysOn, cluster) hay kiểu JSON; phần này chỉ nêu khái niệm. ↩ ↩2

  21. Seven Databases in Seven Weeks (file .zip, tải về giải nén) · ch.2 PostgreSQL · Day 2, mục "Stored Procedures" (PL/pgSQL và các ngôn ngữ khác, tr. 28). ↩ ↩2

  22. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.10 Programmable Objects · mục "Stored Procedures" (encapsulate logic, kiểm soát bảo mật, tái dùng plan, giảm traffic mạng, tr. 364–365). ↩ ↩2 ↩3

  23. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · Introduction (phương pháp đo và tune theo hệ thống, so sánh với một mốc cụ thể). ↩ ↩2 ↩3

  24. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 · mục "Transactions", đoạn Isolation (mô hình dựa trên khoá và mô hình dựa trên row versioning, tr. 298) và mục "Locks and Blocking". ↩ ↩2

  25. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 · mục "Summary of Isolation Levels", Table 9-3. ↩

  26. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 · mục "Isolation Levels Based on Row Versioning", "The SNAPSHOT Isolation Level" và "The READ COMMITTED SNAPSHOT Isolation Level" (tr. 316–321). ↩ ↩2 ↩3

  27. Microsoft SQL Server 2012 T-SQL Fundamentals (file .zip, tải về giải nén) · ch.9 · mục "The SNAPSHOT Isolation Level" (phát hiện update conflict, khác với REPEATABLE READ và SERIALIZABLE gây deadlock). ↩

  28. Expert Performance Indexing for SQL Server 2012 (file .zip, tải về giải nén) · ch.1 Index Fundamentals · mục "Heap Tables" (tr. 1–2). ↩

  29. Expert Performance Indexing for SQL Server 2012 (file .zip, tải về giải nén) · ch.1 Index Fundamentals · mục "Clustered Indexes" (tr. 2). ↩

  30. Expert Performance Indexing for SQL Server 2012 (file .zip, tải về giải nén) · ch.1 Index Fundamentals · mục "Nonclustered Indexes" (tr. 3–4; nhiều non-clustered index trên một bảng). ↩ ↩2

  31. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.4 Index Analysis · mục "Defining the Bookmark Lookup" (key lookup, RID lookup, covering index). ↩ ↩2 ↩3

  32. Expert Performance Indexing for SQL Server 2012 (file .zip, tải về giải nén) · ch.1 Index Fundamentals · mục "Included Columns" (tr. 6). ↩

  33. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.4 Index Analysis · mục về selectivity của cột khi chọn cột để đánh index. ↩

  34. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.2 System Performance Analysis · mục "Optimizing Application Workload" (tr. 27) và ch.3, phần tóm tắt (Extended Events, sys.dm_exec_query_stats). ↩

  35. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.3 SQL Query Performance Analysis · mục "Execution Plans" (estimated plan, actual plan, tr. 79). ↩ ↩2

  36. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.3 SQL Query Performance Analysis · mục "Statistics IO". ↩

  37. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.7 Statistics Analysis · mục "The Role of Statistics in Query Optimization" (tr. 175). ↩ ↩2

  38. SQL Server 2012 Query Performance Tuning (file .zip, tải về giải nén) · ch.9 Execution Plan Cache Analysis · mục "Execution Plan Generation" và "Execution Plan Caching" (tr. 241). ↩

  39. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · mục "Standard numbers to remember" (bảng Important Rates). ↩ ↩2 ↩3

  40. Quy tắc ước lượng của khoá học · Chọn server và PostgreSQL (bảng sizing; ước lượng, cần load test). ↩ ↩2 ↩3 ↩4 ↩5

  41. Grokking Modern System Design · ch.5 Back-of-the-envelope Calculations · mục "Requests estimation" và "Number of servers required". ↩

  42. Building Microservices (file .zip, tải về giải nén) · ch.11 Microservices at Scale · mục "Scaling for Writes" (tr. 223). ↩

  43. Grokking Modern System Design · ch.9 Databases · mục "Sharding", "Vertical sharding" và "Horizontal sharding", "Advantages" và "Disadvantages". ↩ ↩2