Ngân hàng đề — Microsoft Azure Data Engineer
Tìm thấy 228 câu.
FactPurchase will have 1 million rows of data added daily and will contain three years of data.
Transact-SQL queries similar to the following query will be executed daily.
SELECT -
SupplierKey, StockItemKey, IsOrderFinalized, COUNT(*)
FROM FactPurchase -
WHERE DateKey >= 20210101 -
AND DateKey <= 20210131 -
GROUP By SupplierKey, StockItemKey, IsOrderFinalized
Which table distribution will minimize query times?
- A replicated
- B hash-distributed on PurchaseKey
- C round-robin
- D hash-distributed on IsOrderFinalized
Xem giải thích
🧩 Giải thích nội dung câu hỏi một cách chi tiết
Câu hỏi tập trung vào việc thiết kế phân phối bảng (table distribution) cho bảng FactPurchase trong Azure Synapse Analytics dedicated SQL pool (trước đây gọi là SQL Data Warehouse). Đây là một bảng fact điển hình trong data warehouse, lưu trữ dữ liệu mua hàng từ nhà cung cấp cho cửa hàng bán lẻ.
-
Thông tin về bảng từ hình ảnh đính kèm 📸:
Bảng chứa các cột sau (dựa trên schema chính xác từ hình):- PurchaseKey: bigint, NOT NULL (khóa chính hoặc khóa duy nhất, cardinality cao, tăng dần theo thời gian).
- DateKey: int, NOT NULL (khóa ngoại tham chiếu đến dimension Date, dùng để filter theo ngày/tháng).
- SupplierKey: int, NOT NULL (khóa ngoại đến dimension Supplier).
- StockItemKey: int, NOT NULL (khóa ngoại đến dimension StockItem).
- PurchaseOrderID: int, NULLABLE.
- OrderedQuantity: int, NOT NULL.
- OrderedOuters: int, NOT NULL.
- ReceivedOuters: nvarchar(50), NOT NULL.
- IsOrderFinalized: nvarchar(50), NOT NULL (có thể là bit hoặc flag trạng thái đơn hàng, cardinality thấp ~2 giá trị: finalized/chưa).
📊 Quy mô dữ liệu: Thêm 1 triệu rows hàng ngày, giữ 3 năm dữ liệu → Tổng ~1.1 tỷ rows (rất lớn, cần phân phối tối ưu để tránh skew và data movement).
-
Query điển hình chạy hàng ngày 🔍:
SELECT SupplierKey, StockItemKey, IsOrderFinalized, COUNT(*) FROM FactPurchase WHERE DateKey >= 20210101 AND DateKey <= 20210131 -- Filter ~1 tháng (~30 triệu rows) GROUP BY SupplierKey, StockItemKey, IsOrderFinalizedQuery này thực hiện aggregation (COUNT và GROUP BY) trên subset dữ liệu gần đây (filter hẹp trên DateKey), không có JOIN với bảng khác. Mục tiêu: Minimize query times (giảm thời gian thực thi bằng cách giảm data shuffle/movement giữa các distribution).
-
Ngữ cảnh kỹ thuật 🛠️: Trong Azure Synapse dedicated SQL pool, bảng được phân phối (distributed) qua 4 options: Hash-distributed (trên 1 cột), Round-robin, Replicated, hoặc Undistributed (không dùng cho fact lớn). Phân phối quyết định cách dữ liệu được chia đều trên các compute nodes (DWU). Tối ưu cho GROUP BY và filter cần co-location (dữ liệu cùng group ở cùng distribution) để tránh shuffle network.
✅ Đáp án đúng: hash-distributed on PurchaseKey
Lý do lựa chọn 🏆:
- PurchaseKey là cột bigint duy nhất/high cardinality (giả sử ~1 tỷ giá trị unique, tăng dần theo thời gian), hash distribution trên cột này đảm bảo phân phối đều hoàn hảo (even distribution), tránh skew dữ liệu.
- Với query GROUP BY trên SupplierKey, StockItemKey, IsOrderFinalized, dù vẫn cần shuffle (vì không distribute trực tiếp trên GROUP BY cols), nhưng dữ liệu even giúp parallel processing nhanh hơn, đặc biệt với filter DateKey hẹp (~30M rows).
- Best practice (Azure 2024-2026): Đối với fact table lớn không có FK phổ biến trong JOIN/GROUP (SupplierKey/StockItemKey có thể skew nếu ít supplier/items), dùng hash trên unique surrogate key như PurchaseKey để even dist và hỗ trợ insert nhanh (1M rows/ngày). Tránh skew từ low-card cols như IsOrderFinalized.
- Kết quả: Giảm query time tối đa so với các option khác, vì replicated không khả thi (quá lớn), round-robin shuffle nhiều, hash low-card skew nặng.
📋 Giải thích tất cả các phương án
-
❌ replicated
Sai vì: Replicated sao chép toàn bộ bảng lên mọi compute node (dữ liệu x N nodes). Với 1.1B rows, kích thước storage khổng lồ (hàng PB), chi phí cao, và query chậm do I/O lớn. Chỉ dùng cho dimension nhỏ (<2GB compressed). Không phù hợp fact table lớn → query time rất lâu. -
✅ hash-distributed on PurchaseKey
Đúng vì: Như giải thích trên. High cardinality (unique key) → even distribution, skew = 0%. Hỗ trợ insert daily nhanh, aggregation trên subset DateKey hiệu quả dù shuffle nhẹ. Tối ưu nhất cho workload này (xem docs Microsoft). -
❌ round-robin
Sai vì: Phân phối ngẫu nhiên đều (không dựa cột). Dễ skew nếu insert batch lớn, và GROUP BY luôn yêu cầu full data shuffle qua network (chậm với 30M rows). Tốt cho ad-hoc query nhưng kém cho aggregation lặp lại → query time cao hơn hash. -
❌ hash-distributed on IsOrderFinalized
Sai vì: IsOrderFinalized có low cardinality (~2 giá trị: 'Yes'/'No' hoặc bit 0/1) → data skew nghiêm trọng (50% dữ liệu tập trung 1-2 distributions). Một node overload, các node khác idle → query time chậm gấp nhiều lần, bottleneck I/O/CPU.
📘 Tài liệu tham khảo (Cập nhật mới nhất Azure Synapse 2026)
- Azure Synapse Analytics: Choose the right table distribution ✅ (Best practices: Hash on high-card for large facts).
- Table distribution examples 🛠️ (Fact tables: Avoid low-card, use unique key).
- Hash distribution details 📊 (Even dist với high-card bigint keys).
Hy vọng phân tích giúp bạn nắm vững! 🚀 Nếu cần code T-SQL ví dụ, hỏi thêm nhé!
You need to recommend an authentication mechanism to ensure that the solution can access the source data.
What should you recommend?
- A a managed identity
- B anonymous public read access
- C a shared key
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào việc thiết kế giải pháp Azure Synapse để cung cấp giao diện truy vấn (query interface) cho dữ liệu lưu trữ trong Azure Storage account. Đặc biệt, tài khoản lưu trữ này chỉ có thể truy cập từ một virtual network (VNet), nghĩa là nó được cấu hình private endpoint hoặc VNet service endpoint, không cho phép truy cập công khai từ internet.
Nhiệm vụ là khuyến nghị cơ chế xác thực (authentication mechanism) để đảm bảo Azure Synapse có thể truy cập nguồn dữ liệu một cách an toàn và hiệu quả. 🛠️ Đây là tình huống thực tế trong kiến trúc Azure, nơi Synapse workspace thường được triển khai với managed VNet để tuân thủ bảo mật zero-trust, và cần phương thức auth không yêu cầu chia sẻ bí mật (secrets).
📘 Kiến thức cập nhật: Theo tài liệu Microsoft Azure mới nhất (phiên bản 2024-2026), Azure Synapse Analytics hỗ trợ truy cập dữ liệu từ private storage qua Managed Identity kết hợp Azure RBAC (Role-Based Access Control), đặc biệt với Azure Data Lake Storage Gen2 hoặc Blob Storage. Không có thay đổi lớn dự kiến đến 2026 (xem Microsoft Docs: Authenticate Synapse to Azure Storage và Storage private access).
✅ Đáp án đúng: a managed identity
Lý do lựa chọn:
Managed Identity (danh tính được quản lý) là cơ chế xác thực tốt nhất và được khuyến nghị cho các dịch vụ Azure như Synapse truy cập Storage account private (chỉ từ VNet). Synapse workspace có thể sử dụng system-assigned managed identity hoặc user-assigned managed identity, sau đó cấp quyền RBAC (như Storage Blob Data Contributor) trực tiếp trên Storage account. Điều này không yêu cầu lưu trữ key/secret, tự động xoay vòng credentials, và hoàn toàn tương thích với VNet integration của Synapse (qua managed private endpoints). 🔒 Nó đảm bảo truy cập an toàn từ môi trường private mà không expose public endpoint.
Ví dụ triển khai: Trong Synapse Studio, enable MI và grant role qua IAM blade của Storage.
📋 Giải thích tất cả các phương án
-
a managed identity ✅ Đúng
Như đã phân tích ở trên, đây là phương pháp chuẩn bảo mật cao nhất cho Synapse truy cập private Storage. Hỗ trợ đầy đủ trong Synapse Pipelines, Notebooks và SQL Pools. Không có rủi ro leak credentials, phù hợp với nguyên tắc least privilege và zero-trust. 🛡️ (Tham khảo: Synapse Managed Identity docs). -
anonymous public read access ❌ Sai
Phương án này cho phép truy cập đọc công khai không xác thực, nhưng Storage account trong câu hỏi chỉ accessible từ VNet (private), nên không thể bật public access. Nếu bật, sẽ vi phạm yêu cầu bảo mật và expose dữ liệu ra internet – hoàn toàn không phù hợp với thiết kế private network. 🚫 Synapse cũng không recommend anonymous cho production data. -
a shared key ❌ Sai
Shared key (Access Key) là phương thức auth truyền thống bằng cách sử dụng Storage Account Key, có thể dùng trong Synapse linked services. Tuy nhiên, nó không an toàn cho môi trường private cao vì key có thể bị leak nếu lưu trong config, và không tự động xoay vòng. Microsoft khuyến nghị chuyển sang Managed Identity hoặc SAS token thay thế. Với VNet-only access, shared key vẫn cần private endpoint nhưng kém hơn MI về bảo mật tổng thể. 🔑 (Tham khảo: Storage auth options).
You run PDW_SHOWSPACEUSED('dbo.FactInternetSales'); and get the results shown in the following table.
Which statement accurately describes the dbo.FactInternetSales table?
- A All distributions contain data.
- B The table contains less than 10,000 rows.
- C The table uses round-robin distribution.
- D The table is skewed.
Xem giải thích
🧩 Giải thích nội dung câu hỏi
Câu hỏi tập trung vào việc phân tích kết quả lệnh PDW_SHOWSPACEUSED('dbo.FactInternetSales') trong Azure Synapse Analytics dedicated SQL pool (trước đây gọi là SQL Data Warehouse). Lệnh này hiển thị thông tin chi tiết về không gian lưu trữ và phân bố dữ liệu của bảng dbo.FactInternetSales trên các distributions (đơn vị phân bố dữ liệu cơ bản trong Synapse).
📊 Phân tích hình ảnh bảng kết quả (dựa trên dữ liệu được cung cấp):
- Cột chính:
- ROWS: Số lượng hàng dữ liệu thực tế trong từng distribution.
- RESERVED_SPACE, DATA_SPACE, INDEX_SPACE, UNUSED_SPACE: Các chỉ số không gian lưu trữ (KB).
- PDW_NODE_ID: ID nút (tất cả là 1, nghĩa là chạy trên một compute node).
- DISTRIBUTION_ID: ID distribution từ 1 đến 60 (bảng có 60 distributions, phù hợp với pool Gen2 DW100c+ có 60 distributions).
- Quan sát nổi bật:
- Tổng cộng 60 distributions (ID 1-60).
- Một số distribution có ROWS = 0 (ví dụ: ID 8: 0 rows, ID 56: 0 rows, ID 57: 0 rows).
- Phân bố không đều: Distribution ID 7 có 5995 rows (cao nhất), ID 50: 1550 rows, ID 1: 694 rows, trong khi nhiều cái chỉ vài trăm hoặc 0.
- Tổng ROWS (tính sơ bộ từ dữ liệu): Khoảng >50.000 rows (ví dụ: 5995 + 1550 + 1437 + ... vượt xa 10.000).
- Mục tiêu: Xác định đặc tính chính xác của bảng dựa trên dữ liệu này. Trong Synapse (cập nhật đến 2026), data skew xảy ra khi dữ liệu tập trung không đều trên distributions, dẫn đến hiệu suất kém (hotspots).
🛠️ Kiến thức nền: Dedicated SQL pools tự động phân bố dữ liệu qua hash, round-robin hoặc replicate. Lệnh PDW_SHOWSPACEUSED giúp detect skew (theo docs Microsoft 2024-2026).
✅ Đáp án đúng: The table is skewed
Lý do lựa chọn:
- Bảng thể hiện data skew rõ rệt vì số ROWS phân bố không đều trên 60 distributions: Một số có hàng nghìn rows (như ID 7: 5995), nhiều cái chỉ vài trăm hoặc 0 rows (ID 8, 56, 57).
- Skew >20-30% giữa max/min rows là dấu hiệu skew (theo best practices Synapse), ở đây max/min = 5995/0 = ∞, xác nhận skewed.
- Điều này làm query chậm do compute không cân bằng (hot distributions overload).
📋 Giải thích tất cả các phương án
-
❌ All distributions contain data
Sai vì: Không phải tất cả distributions đều có dữ liệu. Nhiều distribution có ROWS = 0 (ví dụ: ID 8: 0, ID 56: 0, ID 57: 0 rows). Nếu tất cả chứa data, không có distribution rỗng. -
❌ The table contains less than 10,000 rows
Sai vì: Tổng ROWS vượt xa 10.000. Chỉ riêng ID 7 (5995) + ID 50 (1550) + ID 52 (1437) + ... đã >10k. Tổng ước tính ~50k+ rows từ 60 distributions. -
❌ The table uses round-robin distribution
Sai vì: Round-robin phân bố đều rows ngẫu nhiên qua distributions (gần bằng nhau). Ở đây, ROWS không đều (5995 vs 0), chứng tỏ hash hoặc replicated với skew do key phân bố kém (không phải round-robin). -
✅ The table is skewed
Đúng vì: Data skewed do phân bố không đều (max 5995 rows ở ID 7, min 0 rows ở nhiều ID). Synapse detect skew qua PDW_SHOWSPACEUSED khi variance > threshold (docs xác nhận).
📘 Tài liệu tham khảo
- Microsoft Docs: PDW_SHOWSPACEUSED (Synapse SQL) (cập nhật 2025).
- Data Skew in Synapse Dedicated Pools (best practices 2026: Skew nếu max rows > 2x average).
- Azure Synapse Monitoring Space Usage.
🧠 Lời khuyên: Để fix skew, dùng CREATE TABLE WITH (DISTRIBUTION = HASH(column_with_high_cardinality)) hoặc round-robin cho staging. Kiểm tra bằng DBCC PDW_SHOWSPACEUSED!
You need to recommend a solution to grant permissions to a specific application for a limited time period.
What should you include in the recommendation?
- A role assignments
- B shared access signatures (SAS)
- C Azure Active Directory (Azure AD) identities
- D account keys
Xem giải thích
🧩 Phân tích chi tiết câu hỏi trắc nghiệm
✅ Nội dung câu hỏi được giải thích rõ ràng:
Câu hỏi tập trung vào việc phát triển một ứng dụng sử dụng Azure Data Lake Storage Gen2 (ADLS Gen2), một dịch vụ lưu trữ dữ liệu lớn phân cấp phân tích trên Azure. Yêu cầu là recommend một giải pháp để cấp quyền truy cập (permissions) cho một ứng dụng cụ thể trong một khoảng thời gian hạn chế (limited time period).
🛠️ Vấn đề cốt lõi: Cần cơ chế cấp quyền tạm thời, có thời hạn, an toàn cho ứng dụng cụ thể mà không ảnh hưởng toàn bộ tài nguyên hoặc người dùng khác. Đây là tình huống phổ biến trong phát triển ứng dụng đám mây, nơi tránh cấp quyền vĩnh viễn để giảm rủi ro bảo mật (principle of least privilege).
📘 ADLS Gen2 hỗ trợ nhiều mô hình kiểm soát truy cập như RBAC (Role-Based Access Control), ACL (Access Control Lists), SAS (Shared Access Signatures), và account keys. Giải pháp phải phù hợp với thời gian giới hạn và dành cho ứng dụng cụ thể.
🟢 Đáp án đúng và lý do lựa chọn:
Đáp án đúng là shared access signatures (SAS).
✅ Lý do: SAS là token được tạo ra với thời hạn hết hạn (expiry time) cụ thể (ví dụ: 1 giờ, 1 ngày), cho phép cấp quyền chi tiết (read, write, list, etc.) cho một ứng dụng cụ thể mà không cần chia sẻ khóa tài khoản hoặc gán vai trò lâu dài. SAS có thể giới hạn theo IP, protocol (HTTPS only), và resource cụ thể trong ADLS Gen2. Đây là giải pháp tối ưu cho quyền tạm thời, hỗ trợ cập nhật đến năm 2026 với các tính năng mới như User Delegation SAS (dùng Azure AD để tăng bảo mật). Phù hợp hoàn hảo với yêu cầu "limited time period" cho "specific application".
📋 Giải thích tất cả các phương án (đúng và sai)
-
❌ role assignments
Phương án này sai vì role assignments thuộc RBAC (Azure Role-Based Access Control), dùng để gán vai trò (như Storage Blob Data Contributor) cho principal (user/group/service principal) ở mức scope container/file system. 🛑 Chúng không hỗ trợ thời hạn tạm thời (lâu dài cho đến khi xóa), không phù hợp cho "limited time period". Dùng cho quản lý quyền vĩnh viễn, không lý tưởng cho ứng dụng tạm thời. -
✅ shared access signatures (SAS)
Phương án này đúng như đã giải thích ở trên. 🟢 SAS cung cấp URI token với quyền granular, thời gian hết hạn chính xác, và có thể revoke bằng cách thay đổi key. Hỗ trợ hai loại: Service SAS (dùng account key) và User Delegation SAS (dùng OAuth token từ Azure AD, an toàn hơn từ năm 2021+). -
❌ Azure Active Directory (Azure AD) identities
Phương án này sai vì Azure AD identities (như service principals hoặc managed identities) chỉ là danh tính xác thực, không phải cơ chế cấp quyền tạm thời. 🛑 Chúng kết hợp với RBAC để cấp quyền lâu dài, không có tính năng "limited time period" tích hợp. Dùng cho xác thực liên tục, không phù hợp yêu cầu. -
❌ account keys
Phương án này sai vì account keys là khóa truy cập toàn bộ storage account (hai key tự regenerate). 🛑 Chúng cấp quyền không giới hạn thời gian hoặc scope (full control), rủi ro cao nếu chia sẻ với ứng dụng. Không hỗ trợ "limited time" hoặc specific resource, vi phạm best practices bảo mật Azure (recommend dùng SAS thay thế).
📘 Tài liệu tham khảo (cập nhật mới nhất đến 2026)
- Microsoft Docs chính thức: Use shared access signatures (SAS) for Azure Storage (cập nhật 2025, hỗ trợ ADLS Gen2 đầy đủ).
- Azure Storage Security Guide: Authorize access to data in Azure Storage (nhấn mạnh SAS cho temp access).
- Best Practices ADLS Gen2: Access control model in Azure Data Lake Storage Gen2 (2026 preview: Tích hợp hơn với Entra ID, formerly Azure AD).
- 🛡️ Kiểm tra thực tế: Sử dụng Azure Portal > Storage Account > Shared access signature để tạo SAS với expiry time.
Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần ví dụ code (Python SDK), hãy hỏi thêm.
You need to recommend a solution that maximizes query performance.
What should you include in the recommendation?
- A In the tables use a hash distribution of ArrivalDateTime and ReportDateTime.
- B In the tables use a hash distribution of ArrivalAirportID and AirportID.
- C In each table, create an IDENTITY column.
- D In each table, create a column as a composite of the other two columns in the table.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi thuộc chủ đề Azure Synapse Analytics (trước đây là Azure SQL Data Warehouse), tập trung vào việc tối ưu hóa hiệu suất truy vấn (query performance) cho hai bảng fact lớn: Flight và Weather. Các truy vấn sẽ chủ yếu dựa trên join giữa các cột sau (dựa trên hình ảnh đính kèm):
- Bảng Flight: Các cột tham gia join là ArrivalAirportID (ID sân bay đến) và ArrivalDateTime (thời gian đến).
- Bảng Weather: Các cột tham gia join là AirportID (ID sân bay) và ReportDateTime (thời gian báo cáo thời tiết).
📸 Phân tích hình ảnh: Hình ảnh là một bảng đơn giản với hai hàng cho mỗi bảng fact:
- Flight: ArrivalAirportID và ArrivalDateTime.
- Weather: AirportID và ReportDateTime.
Điều này ngụ ý các truy vấn sẽ join Flight.ArrivalAirportID = Weather.AirportID và Flight.ArrivalDateTime = Weather.ReportDateTime (hoặc tương tự, vì date/time thường join để khớp dữ liệu thời gian thực). Mục tiêu là recommend giải pháp tối ưu phân phối dữ liệu (distribution) để dữ liệu được co-located (nằm cùng node), giảm data movement khi join, từ đó maximize query performance trong môi trường distributed data warehouse.
🛠️ Ngữ cảnh kỹ thuật: Trong Azure Synapse, bảng được phân phối theo các loại như Hash, Round-robin, Replicated. Hash distribution trên join keys là best practice để tránh shuffle dữ liệu lớn (data skew/movement), đặc biệt với fact tables lớn (theo docs cập nhật 2024-2026).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: In the tables use a hash distribution of ArrivalAirportID and AirportID.
Lý do (🧩 Phân tích sâu):
- Khi sử dụng hash distribution trên ArrivalAirportID (cho bảng Flight) và AirportID (cho bảng Weather), dữ liệu sẽ được phân bổ đều theo hash value của các cột join chính này. Kết quả: Các hàng khớp join sẽ co-located trên cùng compute node, loại bỏ nhu cầu data movement (shuffle/ broadcast) giữa các node – yếu tố lớn nhất làm chậm truy vấn fact-to-fact join.
- Hình ảnh xác nhận đây là join keys chính (AirportID), thường có high cardinality (nhiều giá trị unique như ID sân bay), phù hợp hash để tránh skew.
- Theo best practice Azure Synapse (cập nhật 2026): Ưu tiên hash trên equi-join columns với kích thước bảng > 2GB và join thường xuyên. Điều này giảm query time lên đến 90% so với round-robin.
- 📘 Nguồn: Azure Synapse - Table Distribution & Design Guidance for Distributing Tables.
📋 Phân tích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn một, giữ nguyên văn bản gốc tiếng Anh. Mỗi phân tích dùng emoji để nổi bật, giải thích tại sao đúng/sai dựa trên nguyên tắc Synapse Analytics mới nhất (2026).
-
In the tables use a hash distribution of ArrivalDateTime and ReportDateTime.
❌ Sai. Lý do: DateTime columns thường có low cardinality (ít giá trị unique, ví dụ ngày/tháng lặp lại nhiều), dẫn đến data skew nghiêm trọng (một số node overload với dữ liệu hot date như cuối tuần). Join trên date không hiệu quả bằng ID (high cardinality). Hình ảnh cho thấy date là phụ, không phải primary join key. Best practice: Tránh hash trên date nếu có ID tốt hơn. -
In the tables use a hash distribution of ArrivalAirportID and AirportID.
✅ Đúng (như đã giải thích ở trên). Đây là lựa chọn tối ưu, khớp chính xác join keys từ hình ảnh, đảm bảo colocation và performance cao nhất cho fact-fact joins. -
In each table, create an IDENTITY column.
❌ Sai. Lý do: IDENTITY chỉ tạo surrogate key tự tăng (auto-increment) cho primary key, hữu ích cho dimension tables hoặc tránh duplicates, nhưng không ảnh hưởng đến distribution. Nó không giải quyết data movement khi join trên AirportID/DateTime. Trong Synapse, IDENTITY không thay đổi hash strategy, chỉ thêm overhead lưu trữ. -
In each table, create a column as a composite of the other two columns in the table.
❌ Sai. Lý do: Tạo composite column (ví dụ CONCAT(ArrivalAirportID, ArrivalDateTime)) để làm distribution key nghe có vẻ "thông minh", nhưng thực tế gây skew cao (hash của composite dễ trùng nếu date/airport pattern lặp), tăng complexity ETL, và không được recommend. Synapse ưu tiên single high-cardinality column cho hash (không composite). Hình ảnh không cần composite vì đã có join keys riêng biệt.
🛠️ Khuyến nghị bổ sung từ Azure Data Engineer
- Test thực tế: Sử dụng EXPLAIN hoặc Query Store trong Synapse để verify data movement = 0 sau khi implement hash trên AirportID.
- Alternative nếu skew: Chuyển sang Replicated cho Weather nếu nhỏ hơn Flight (<2GB).
- 📘 Nguồn bổ sung: Synapse Performance Tuning 2026 & Hash Distribution Examples.
Hy vọng phân tích này giúp bạn nắm vững! 🚀
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You have an Azure Storage account that contains 100 GB of files. The files contain rows of text and numerical values. 75% of the rows contain description data that has an average length of 1.1 MB.
You plan to copy the data from the storage account to an enterprise data warehouse in Azure Synapse Analytics.
You need to prepare the files to ensure that the data copies quickly.
Solution: You convert the files to compressed delimited text files.
Does this meet the goal?
- A Yes
- B No
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi thuộc dạng series questions trong kỳ thi chứng chỉ Microsoft (như DP-203: Data Engineering on Microsoft Azure), nơi mỗi câu đưa ra một scenario giống nhau nhưng solution khác nhau. Người dùng không thể quay lại câu hỏi sau khi trả lời, nên cần chọn chính xác ngay lần đầu.
Scenario cụ thể:
- Bạn có một Azure Storage account chứa 100 GB files, với dữ liệu dạng rows of text và numerical values.
- 75% rows chứa description data có độ dài trung bình 1.1 MB (rất lớn, vượt quá giới hạn thông thường).
- Mục tiêu (goal): Copy dữ liệu từ Storage sang Azure Synapse Analytics (enterprise data warehouse, cụ thể là dedicated SQL pool).
- Yêu cầu chuẩn bị files để data copies quickly (sao chép dữ liệu nhanh chóng, ngụ ý hiệu suất cao, parallelism tốt, giảm I/O).
Solution đề xuất: Convert files sang compressed delimited text files (files text phân cách bằng delimiter như CSV, và nén bằng gzip/bzip2).
Câu hỏi: Does this meet the goal? (Giải pháp này có đạt mục tiêu không?)
Lưu ý từ Azure Data Engineer perspective 🛠️:
Để copy nhanh vào Synapse, thường dùng COPY command hoặc PolyBase từ Azure Blob/Data Lake Storage. Best practices (cập nhật 2025-2026):
- Files nên nhỏ (128-256 MB/file), nhiều files cho parallelism.
- Compressed (gzip, parquet) giảm transfer time.
- Columnar formats như Parquet/ORC tốt hơn delimited text cho compression và query perf.
- Vấn đề then chốt: Synapse dedicated SQL pool có row size limit = 1,048,576 bytes (~1 MB uncompressed). Description 1.1 MB (>1 MB) sẽ fail khi insert vì exceed limit sau decompress.
✅ Đáp án đúng: No
Lý do lựa chọn 📘:
Giải pháp KHÔNG đạt mục tiêu vì:
- Compressed delimited text files chỉ cải thiện tốc độ transfer (do nén giảm kích thước), nhưng KHÔNG giải quyết vấn đề row size limit của Synapse (~1 MB/row uncompressed).
- Khi COPY/PolyBase, Synapse decompress files và parse từng row → field description 1.1 MB vẫn exceed limit → load thất bại, không copy được chứ đừng nói "quickly".
- Với 75% rows lớn, parallelism bị ảnh hưởng nặng, dẫn đến timeout hoặc error.
- Theo docs Azure Synapse 2026, cần split/chunk large fields hoặc dùng external tables với compression columnar (Parquet) để bypass một phần, nhưng delimited text không tối ưu cho rows siêu rộng.
🔍 Giải thích tất cả các phương án
-
Yes ❌ SAI:
Phương án này KHÔNG đúng vì dù compressed delimited text giúp giảm I/O (tốc độ đọc nhanh hơn uncompressed ~30-50%), nhưng row size 1.1 MB vượt giới hạn Synapse. Load sẽ fail với error kiểu "Row size exceeded the maximum allowed size". Không đạt "copies quickly" vì không copy được thành công. -
No ✅ ĐÚNG:
Phương án này hoàn toàn chính xác vì solution đề xuất chỉ cải thiện partial (compression tốt cho text, parallelism nếu split files), nhưng bỏ qua row size limit – nguyên nhân chính cản trở copy nhanh. Các solution khác trong series có thể là: dùng Parquet (columnar compression tốt hơn), split rows, hoặc external tables.
📚 Tài liệu tham khảo (cập nhật mới nhất 2026)
- Azure Synapse limits: Row-size limits – Xác nhận 1 MB/row.
- COPY best practices: Load data efficiently – Khuyến nghị compressed columnar > delimited cho large/wide data.
- PolyBase perf tuning: Optimize performance – Nhấn mạnh split large rows/files.
- Exam context: Typical DP-203 Q&A từ Microsoft Learn (2025 updates).
Khuyến nghị từ Azure Data Engineer 🚀: Để fix, convert sang Parquet compressed + split large descriptions thành multiple columns/files nhỏ hơn 1 MB/row!
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You have an Azure Storage account that contains 100 GB of files. The files contain rows of text and numerical values. 75% of the rows contain description data that has an average length of 1.1 MB.
You plan to copy the data from the storage account to an enterprise data warehouse in Azure Synapse Analytics.
You need to prepare the files to ensure that the data copies quickly.
Solution: You copy the files to a table that has a columnstore index.
Does this meet the goal?
- A Yes
- B No
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi thuộc dạng case study trong kỳ thi chứng chỉ (như AZ-305 hoặc DP-203), nơi có một tình huống cụ thể và nhiều giải pháp được đề xuất riêng lẻ. Tình huống ở đây:
- Bạn có một Azure Storage account chứa 100 GB files, các file gồm rows of text và numerical values.
- 75% rows chứa description data với độ dài trung bình 1.1 MB (dữ liệu văn bản lớn, dạng LOB - Large Object).
- Mục tiêu: Copy dữ liệu từ storage vào enterprise data warehouse trên Azure Synapse Analytics (cụ thể là Dedicated SQL Pool) một cách nhanh chóng.
- Giải pháp đề xuất: Copy các files trực tiếp vào một table có columnstore index.
- Câu hỏi: Giải pháp này có đạt mục tiêu (copy nhanh) không?
Mục tiêu chính là chuẩn bị files để quá trình copy/load data từ blob storage vào Synapse diễn ra nhanh (optimize performance). Theo best practices của Azure Synapse (cập nhật đến 2026), việc load data nhanh yêu cầu:
- Files nên ở định dạng columnar/compressed như Parquet, ORC.
- Tránh large text fields (LOB > 1MB) vì gây chậm khi load và query.
- Sử dụng COPY INTO hoặc PolyBase với files được partition và compressed.
🛠️ Vấn đề cốt lõi: Files gốc là text/raw với large LOBs, columnstore index phù hợp cho numerical/analytical data nhưng không tối ưu cho large text, dẫn đến load chậm và compression kém.
✅ Đáp án đúng: No
Lý do lựa chọn:
Giải pháp không đạt mục tiêu vì việc copy trực tiếp files raw (với 75% rows chứa text dài 1.1MB) vào table columnstore sẽ chậm đáng kể. Columnstore index trong Synapse Dedicated SQL Pool (phiên bản mới nhất 2026) compress tốt với dữ liệu numerical/repetitive, nhưng kém hiệu quả với LOBs lớn (>8KB strings lưu off-row, gây fragmentation và I/O cao). Để copy nhanh, cần pre-process files thành Parquet/compressed, loại bỏ/split large texts trước. Giải pháp này chỉ tạo table columnstore mà không optimize files/source, vi phạm best practices load data (theo Microsoft Docs: ưu tiên columnar format cho >1TB data).
📋 Giải thích tất cả các phương án
-
Yes ❌ SAI
Phương án này sai vì giả định copy vào columnstore sẽ tự động nhanh, nhưng thực tế columnstore không handle tốt large LOBs (text 1.1MB/row). Trong Synapse, load raw text files lớn sẽ gây:- Compression ratio thấp (~1.5-2x thay vì 10x+ cho numerical).
- Query/load chậm do dictionary encoding thất bại với unique long strings.
- Không prepare "files" đúng cách (vẫn raw, chưa columnar). Theo docs Synapse 2026, columnstore chỉ khuyến nghị sau khi clean/normalize data.
-
No ✅ ĐÚNG
Phương án đúng vì giải pháp không meet goal. Cần các bước chuẩn bị khác như:- Convert files sang Parquet/ORC với compression (Snappy/ZSTD).
- Split large descriptions thành multiple columns hoặc external storage.
- Sử dụng serverless SQL pool preprocess, rồi COPY INTO dedicated pool.
Best practice: Load qua T-SQL COPY vớiFILE_FORMAT = Parquet, partition theo ngày/size (<1GB/file).
📘 Tài liệu tham khảo
- Azure Synapse Analytics: Load data best practices (cập nhật 2025-2026: nhấn mạnh columnar formats).
- Columnstore index limitations for LOBs (Azure SQL/Synapse áp dụng tương tự).
- Synapse COPY command optimization (khuyến cáo tránh raw CSV với LOBs >100GB).
🧩 Lưu ý: Trong series questions này, các giải pháp đúng thường là dùng Data Factory pipeline với Parquet conversion hoặc external tables.
You need to ensure that users in a specific role only see the last four digits of a phone number when querying the Phone column.
What should you include in the solution?
- A table partitions
- B a default value
- C row-level security (RLS)
- D column encryption
- E dynamic data masking
Xem giải thích
🧩 Phân tích chi tiết câu hỏi
Câu hỏi tập trung vào Azure Synapse Analytics dedicated SQL pool (một dịch vụ phân tích dữ liệu mạnh mẽ của Microsoft Azure, hỗ trợ SQL pools dành riêng cho workload lớn). Trong đó, có bảng Contacts chứa cột Phone lưu trữ số điện thoại.
Yêu cầu cụ thể: Đảm bảo rằng users thuộc một role nhất định chỉ nhìn thấy 4 chữ số cuối cùng của số điện thoại khi truy vấn cột Phone (ví dụ: 123-456-**** thay vì số đầy đủ). Điều này nhằm bảo vệ dữ liệu nhạy cảm (như PII - Personally Identifiable Information) mà không ảnh hưởng đến người dùng khác.
📘 Bối cảnh: Đây là tính năng bảo mật dữ liệu động, không thay đổi dữ liệu gốc mà chỉ "che giấu" (mask) khi hiển thị cho user phù hợp. Kiến thức dựa trên phiên bản Azure Synapse Analytics cập nhật đến 2026 (tính năng Dynamic Data Masking vẫn là chuẩn mực, hỗ trợ các hàm mask như partial để hiển thị prefix/suffix).
✅ Đáp án đúng: dynamic data masking
Lý do chọn:
Dynamic Data Masking (DDM) là giải pháp lý tưởng trong Azure Synapse Analytics dedicated SQL pool. Nó cho phép mask dữ liệu động dựa trên role/user/group mà không thay đổi dữ liệu gốc.
- Sử dụng hàm mask
partial(prefix, padding, suffix), ví dụ:partial('XXX-XXX-####', 8, 4)để chỉ hiển thị 4 chữ số cuối. - Áp dụng qua T-SQL:
ALTER TABLE Contacts ALTER COLUMN Phone ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XXX-####",4)'). - Chỉ ảnh hưởng đến users không có quyền
UNMASK, phù hợp chính xác với yêu cầu "users in a specific role".
🛠️ Ưu điểm: Không cần code ứng dụng, hiệu suất cao, tích hợp native với SQL pools.
📘 Nguồn tham khảo: Microsoft Docs - Dynamic data masking in Azure Synapse Analytics (cập nhật 2025-2026, hỗ trợ Synapse Gen2).
❌ Giải thích tất cả các phương án
-
table partitions:
❌ Sai: Table partitions dùng để phân vùng dữ liệu theo range/hash nhằm tối ưu hiệu suất query và quản lý dữ liệu lớn (scale-out), không liên quan đến việc che giấu/mask nội dung cột. Nó không kiểm soát hiển thị dữ liệu cho role cụ thể. -
a default value:
❌ Sai: Default value chỉ gán giá trị mặc định cho cột khi insert/update nếu không chỉ định (ví dụ:DEFAULT '000-000-0000'). Nó thay đổi dữ liệu thực tế, không phải mask động, và không phân biệt theo role/user. -
row-level security (RLS):
❌ Sai: RLS dùng để lọc hàng (rows) dựa trên predicate function (ví dụ: user chỉ thấy rows của chính mình). Nó kiểm soát truy cập theo hàng, không mask nội dung cột (user vẫn thấy đầy đủ dữ liệu nếu truy cập được row). -
column encryption:
❌ Sai: Column encryption (như Always Encrypted) mã hóa dữ liệu cột ở mức client-side để bảo vệ khỏi admin/DBA. Nó làm dữ liệu không đọc được trực tiếp (phải decrypt), không hỗ trợ mask một phần như "last 4 digits" mà không thay đổi dữ liệu gốc.
🧩 Kết luận: Dynamic Data Masking là lựa chọn tối ưu nhất cho Azure Synapse, cân bằng bảo mật và usability. Nếu triển khai thực tế, hãy test với db_owner để bypass mask! 🚀
✑ Wrangling data flow
✑ Notebook
✑ Copy
✑ Jar
Which two Azure services should you use to debug the activities? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point
- A Azure Synapse Analytics
- B Azure HDInsight
- C Azure Machine Learning
- D Azure Data Factory
- E Azure Databricks
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi này thuộc chủ đề Azure Data Factory (ADF), tập trung vào việc debug (gỡ lỗi) các hoạt động (activities) trong pipeline ADF. Cụ thể:
-
Bạn đang quản lý nhiều pipeline ADF chứa hỗn hợp các loại hoạt động sau:
- Wrangling data flow: Hoạt động xử lý dữ liệu linh hoạt (data wrangling) bằng giao diện kéo-thả, thường dùng để biến đổi dữ liệu mà không cần code.
- Notebook: Hoạt động chạy notebook (như Databricks notebook) để thực thi code Python/Scala/R.
- Copy: Hoạt động sao chép dữ liệu từ nguồn sang đích (copy activity), phổ biến nhất trong ADF.
- Jar: Hoạt động chạy file JAR (Spark job) trên cluster như Databricks.
-
Yêu cầu chọn 2 dịch vụ Azure để debug các hoạt động này. Đây là câu hỏi multi-select (mỗi lựa chọn đúng đáng 1 điểm), nghĩa là cần chọn đúng hai dịch vụ hỗ trợ gỡ lỗi toàn bộ hoặc phần lớn các hoạt động trên.
Mục tiêu debug bao gồm: chạy thử pipeline từng activity, xem log thời gian thực, kiểm tra dữ liệu input/output, và khắc phục lỗi mà không ảnh hưởng production. 📊🛠️
✅ Đáp án đúng và lý do lựa chọn
Hai đáp án đúng là:
Azure Data Factory và Azure Databricks.
Lý do chi tiết (dựa trên tài liệu Azure cập nhật đến 2025-2026):
- Azure Data Factory là dịch vụ cốt lõi để debug trực tiếp các pipeline và activities như Wrangling data flow, Copy (qua Debug mode trong ADF Studio). Bạn có thể chạy debug từng activity riêng lẻ, xem dữ liệu mẫu (sampling), log chi tiết, và theo dõi execution plan mà không cần triển khai full pipeline.
- Azure Databricks cần thiết để debug Notebook và Jar activities, vì chúng chạy trên cluster Databricks. ADF tích hợp sâu với Databricks, cho phép debug qua Databricks workspace (chạy notebook interactive, xem Spark UI, log cluster). Không có Databricks, bạn không thể gỡ lỗi chi tiết các activity này.
✅ Kết hợp cả hai tạo giải pháp hoàn chỉnh: ADF xử lý debug tổng thể, Databricks chuyên sâu cho compute-intensive activities. (Nguồn: Azure Data Factory Debug documentation & ADF-Databricks integration, cập nhật Q1/2026).
📋 Giải thích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn một, giữ nguyên văn bản gốc tiếng Anh. Tôi đánh dấu ✅ đúng hoặc ❌ sai, kèm lý do bằng tiếng Việt rõ ràng dựa trên chức năng thực tế của từng dịch vụ (không hỗ trợ debug đầy đủ cho mix activities này).
-
Azure Synapse Analytics ❌
Sai: Synapse là nền tảng analytics tích hợp (workspace với pipelines, Spark pools, SQL), nhưng không dùng để debug ADF pipelines. Synapse có công cụ debug riêng (cho Synapse pipelines/data flows), không tương thích trực tiếp với ADF activities như Wrangling hay Jar. Nếu migrate sang Synapse thì mới dùng, nhưng câu hỏi là về ADF hiện tại. 🛑 -
Azure HDInsight ❌
Sai: HDInsight là dịch vụ managed Hadoop/Spark/Hive, hỗ trợ chạy Jar/Spark jobs nhưng không tích hợp native với ADF để debug Notebook/Jar activities. ADF hỗ trợ HDInsight cho một số activities cũ, nhưng đã deprecated dần (ưu tiên Databricks). Không debug Wrangling/Copy trực tiếp, và kém linh hoạt hơn Databricks. 📉 (Nguồn: HDInsight deprecation notice). -
Azure Machine Learning ❌
Sai: Azure ML dùng để build/train/deploy models ML, hỗ trợ notebooks qua designer/studio, nhưng không debug ADF pipelines. Notebook trong ADF là Databricks notebook, không phải ML notebook. Không hỗ trợ Wrangling/Copy/Jar của ADF. Chỉ dùng nếu pipeline liên quan ML experiments. 🚫 -
Azure Data Factory ✅
Đúng: Là dịch vụ chính để debug toàn bộ pipeline. ADF Studio cung cấp Debug button cho từng activity (Wrangling, Copy trực tiếp; Notebook/Jar qua linked service). Xem Input/Output schema, data preview, error diagnostics thời gian thực. Bắt buộc cho mọi ADF pipeline. 🛠️🔍 -
Azure Databricks ✅
Đúng: Cần thiết cho debug Notebook và Jar activities. ADF submit jobs đến Databricks cluster; debug qua Databricks UI (Spark History Server, notebook runs, cluster metrics). Hỗ trợ interactive debugging với Delta Lake, Unity Catalog (cập nhật 2026). Không có nó, các activity compute-heavy sẽ không debug được. ⚡ (Nguồn: Databricks on ADF).
🏆 Kết luận & Lời khuyên
Giải pháp tối ưu: Sử dụng ADF Studio cho debug tổng quát + Databricks workspace cho chi tiết Notebook/Jar. Test trên dev environment trước khi production! Nếu gặp lỗi cụ thể, kiểm tra Activity Runs trong ADF Monitor.
📘 Tài liệu tham khảo chính (cập nhật 2026):
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You have an Azure Storage account that contains 100 GB of files. The files contain rows of text and numerical values. 75% of the rows contain description data that has an average length of 1.1 MB.
You plan to copy the data from the storage account to an enterprise data warehouse in Azure Synapse Analytics.
You need to prepare the files to ensure that the data copies quickly.
Solution: You modify the files to ensure that each row is more than 1 MB.
Does this meet the goal?
- A Yes
- B No
Xem giải thích
🧩 Phân tích chi tiết câu hỏi trắc nghiệm
📘 Nội dung câu hỏi:
Câu hỏi thuộc dạng series (một chuỗi câu hỏi có tình huống giống nhau), nơi mỗi câu đưa ra một giải pháp riêng để đạt mục tiêu. Bạn KHÔNG thể quay lại câu hỏi sau khi trả lời.
Tình huống: Bạn có một Azure Storage account chứa 100 GB files, với các hàng (rows) chứa dữ liệu text và số. 75% rows chứa dữ liệu mô tả (description data) có độ dài trung bình 1.1 MB.
Mục tiêu: Copy dữ liệu từ storage account vào enterprise data warehouse trong Azure Synapse Analytics một cách nhanh chóng.
Giải pháp đề xuất: Modify the files to ensure that each row is more than 1 MB (Sửa đổi files để đảm bảo mỗi row > 1 MB).
Câu hỏi: Does this meet the goal? (Giải pháp này có đạt mục tiêu không?).
🛠️ Vấn đề cốt lõi: Để copy dữ liệu nhanh vào Synapse Analytics (sử dụng PolyBase hoặc COPY command từ Azure Blob Storage), cần tối ưu hóa kích thước file và row theo best practices của Microsoft. Rows quá lớn (>1 MB) sẽ gây chậm hoặc lỗi load.
✅ Đáp án đúng: No
Lý do lựa chọn: Giải pháp này KHÔNG đạt mục tiêu vì nó làm tăng kích thước row lên >1 MB, trái ngược hoàn toàn với khuyến nghị của Azure Synapse. Theo tài liệu mới nhất (cập nhật đến 2026), PolyBase/COPY trong Synapse xử lý dữ liệu theo lô 1 MB/block, nên rows >1 MB gây thất bại load, chậm performance hoặc lỗi (ví dụ: row không thể fit vào buffer). Thay vào đó, cần split rows lớn thành nhỏ hơn <1 MB và ưu tiên files lớn (>1 GB) để copy nhanh. Giải pháp này làm tình hình tệ hơn, không giúp copy nhanh mà còn cản trở.
📚 Tài liệu tham khảo:
- Azure Synapse Analytics - Best practices for loading data (cập nhật 2025-2026): "Avoid rows larger than 1 MB. Split large rows into multiple rows."
- PolyBase guide: Rows >1 MB gây "query failure".
🔍 Giải thích tất cả các phương án (giữ nguyên text gốc bằng tiếng Anh):
-
Yes ❌ [SAI]
Lý do sai: Chọn "Yes" nghĩa là đồng ý giải pháp đạt mục tiêu, nhưng thực tế KHÔNG. Việc làm rows >1 MB vi phạm best practices của Synapse, dẫn đến load chậm/error (PolyBase buffer chỉ 1 MB/row). 75% rows đã trung bình 1.1 MB, sửa thành >1 MB toàn bộ sẽ làm tăng vấn đề, không tối ưu copy nhanh (thậm chí fail hoàn toàn). -
No ✅ [ĐÚNG]
Lý do đúng: Giải pháp KHÔNG phù hợp vì Azure Synapse yêu cầu rows <1 MB để load hiệu quả. Cần giải pháp ngược lại: split rows lớn (dùng Azure Data Factory hoặc script), kết hợp files >1 GB. Điều này đảm bảo parallel load nhanh từ Blob Storage vào dedicated SQL pool.
💡 Lời khuyên từ Azure Data Engineer: Để copy nhanh thực sự, dùng Azure Data Factory (ADF) với PolyBase/COPY, optimize bằng: files 1-10 GB, rows <1 MB, columnar format (Parquet/ORC), và staging ở cool/hot tier. Test với COPY INTO command! 🚀