1. Trang chủ
  2. » Tất cả

Bai thuc hanh query tuning

8 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Bài thực hành Tối ưu truy vấn I Mục đích Nội dung Tìm hiểu dữ liệu mẫu Adventure Works, sử dụng index, xem xét hiệu năng thực thi câu truy vấn II Giới thiệu chung 1 Dữ liệu mẫu Adventure Work a Downlo[.]

Bài thực hành Tối ưu truy vấn I Mục đích Nội dung: Tìm hiểu liệu mẫu Adventure Works, sử dụng index, xem xét hiệu thực thi câu truy vấn II Giới thiệu chung Dữ liệu mẫu Adventure Work a Download hướng dẫn cài đặt liệu mẫu AdventureWor Link: https://github.com/Microsoft/sql-serversamples/blob/master/samples/databases/adventure-works/README.md Thực hiện: Trong file nén tải có file instawdb.sql file script chứa lệnh để tạo CSDL AdventureWorks Trong file có biến mơi trường SqlSamplesDatabasePath để trỏ tới thư mục thời Giá trị biến dùng để đưa vào câu lệnh nạp liệu hàng loạt (bulk load) code file script instawdb.sql (dữ liệu nguồn để nạp vào hệ thống lấy từ file csv kèm file nén ban đầu) Một điểm lưu ý quan trọng file script instawdb.sql cần phải thực thi chế độ SQLCMD MODE bên môi trường SQL Server Management Studio Các bước cài đặt:  Tải file zip  Giải nén tồn vào thư mục, ví dụ C:\AdventureWorks2017  Mở file script, ví dụ C:\AdventureWorks2017\instawdb.sql SQL Server Management Studio  Cập nhật giá trị biến mơi trường cho phù hợp, ví dụ thành C:\AdventureWorks2017\  Trên công cụ, chọn Queyr -> SQLCMD Mode  Thực thi file script b Tìm hiểu qua liệu mẫu Address Table AddressType Table AWBuildVersion Table BillOfMaterials Table Contact Table ContactCreditCard Table ContactType Table CountryRegion Table CountryRegionCurrency Table CreditCard Table Culture Table Currency Table CurrencyRate Table Customer Table CustomerAddress Table DatabaseLog Table Department Table Document Table Employee Table EmployeeAddress Table EmployeeDepartmentHistory Table EmployeePayHistory Table ErrorLog Table Illustration Table Individual Table JobCandidate Table Location Table Product Table ProductCategory Table ProductCostHistory Table ProductDescription Table ProductModelIllustration Table ProductModelProductDescriptionCulture Table ProductPhoto Table ProductProductPhoto Table ProductReview Table ProductSubcategory Table ProductVendor Table PurchaseOrderDetail Table PurchaseOrderHeader Table SalesOrderDetail Table SalesOrderHeader Table SalesOrderHeaderSalesReason Table SalesPerson Table SalesPersonQuotaHistory Table SalesReason Table SalesTaxRate Table SalesTerritory Table SalesTerritoryHistory Table ScrapReason Table Shift Table ShipMethod Table ShoppingCartItem Table SpecialOffer Table SpecialOfferProduct Table StateProvince Table Store Table StoreContact Table TransactionHistory Table TransactionHistoryArchive Table UnitMeasure Table Vendor Table ProductDocument Table ProductInventory Table ProductListPriceHistory Table ProductModel Table VendorAddress Table VendorContact Table WorkOrder Table WorkOrderRouting Table Sử dụng Index Index phương tiện mạnh để tăng hiệu thực câu lệnh Ví dụ sử dụng bảng Sale.Customer để tạo hai bảng Sale.Customer_noIndex Sale.Customer_Index, đồng thời tạo index trường CustomerID cho bảng Sale.Customer_Index: Code: SELECT * INTO Sales.Customer_NoIndex FROM Sales.Customer SELECT * INTO Sales.Customer_Index FROM Sales.Customer GO CREATE INDEX Idx_Customer_Index_CustomerID Sales.Customer_Index(CustomerID) ON Nay ta có hai câu lệnh SELECT sau để truy vấn hai bảng: Code: #1 SELECT CustomerID, AccountNumber FROM Sales.Customer_NoIndex WHERE CustomerID = 11001 #2 SELECT CustomerID, AccountNumber FROM Sales.Customer_Index WHERE CustomerID = 11001 Hai câu lệnh cho kết quả, khác biệt câu lệnh thứ hai truy vấn bảng Sales.Customer_Index có index trường cần tìm (CustomerID) Ta xem hai câu lệnh thực cách nhìn vào kế hoạch thực thi (execution plan) chúng Khi bắt đầu thực câu lệnh, SQL Server lên kế hoạch gồm bước tiến hành để thực thi câu lệnh đó, gọi kế hoạch thực thi.Trên hàng công cụ bạn bấm vào nút “Include Actual Execution Plan” Khi đó, lần chạy câu lệnh hệ thống vừa thực câu lệnh vừa đồng thời trả lại kế hoạch thực thi mà dùng để thực câu lệnh Bơi đen câu lệnh thứ thực nó, tab “Execution plan” kế hoạch thực thi này: Như hệ thống thực thi câu lệnh cách duyệt qua bảng (table scan) tìm ghi thỏa mãn yêu cầu tìm kiếm Thao tác duyệt bảng có nghĩa hệ thống cần phải đọc ghi từ đầu đến cuối để tìm kết Trong trường hợp này, phải đọc tồn 19820 ghi tìm ghi có CustomerID=11011 Đây thao tác chậm phải xử lý tất ghi bảng Nên nhớ hệ thống không dừng lại tìm ghi có CustomerID=11011, khơng biết liệu cịn ghi khác có giá trị CustomerID tương tự hay khơng, để chắn trả lại kết đầy đủ hệ thống phải tiếp tục đọc ghi cịn lại Ta nhận xét thấy chi phí thao tác duyệt bảng tăng tuyến tính với số lượng ghi bảng (độ phức tạp O(n)) Thực câu lệnh thứ hai, lần kế hoạch thực thi sau: Lần không thấy thao tác table scan nữa, mà thay vào index seek RID lookup Index seek hệ thống nhảy đến node index chứa khóa thỏa mãn u cầu tìm kiếm Index cấu trúc liệu có dạng B-tree, nên thích hợp với thao tác tìm kiếm theo kiểu key=value, cần vài phép so sánh hệ thống định vị node chứa khóa cần tìm Node chứa khóa (trường index, giá trị CustomerID) RID ID ghi tương ứng bảng (đây giá trị nội dùng bên hệ thống, ta không truy cập giá trị này) Vì bước dùng RID để nhảy đến ghi tương ứng bảng (RID lookup) để lấy trường liệu cần thiết Với index seek, độ phức tạp giảm xuống thành O(logn), bước tiến vượt bậc so với table scan Ta so sánh chi phí hai câu lệnh cách thực hai nhau: Ta thấy câu lệnh thứ chiếm tới 95% tổng chi phí, câu lệnh thứ hai chiếm có 5% Nói cách khác, trường hợp index trường CustomerID giúp cho câu lệnh thực nhanh lên đến 19 lần Index giúp cho lượng liệu hệ thống cần phải xử lý để tìm kết giảm xuống đến mức tối thiểu, điều tạo bước nhảy tốc độ Từ ta rút học quan trọng: Các trường thường dùng mệnh đề WHERE ứng cử viên cần tạo index Các tiêu chí xem xét hiệu câu truy vấn Trước nghĩ đến việc tăng tốc câu truy vấn ta phải xem xét hiệu (Performance) Có tiêu chí để xem xét là: Query Cost (Chi phí câu truy vấn), Page Reads (Số lượng trang đọc) Execution Time (Thời gian thực thi câu truy vấn) * Query Cost Thông số thấp, câu truy vấn chạy nhanh Thơng thường ta thấy thông số cách thực thi câu truy vấn thông qua SQL management Studio, chọn Include Actual Execution Plan, rê chuột vào Execution Plan, ta thấy xuất thơng số hình sau: * Page Reads: Chính số lượng trang liệu truy cập SQL Server thực thi câu truy vấn Sử dụng hàm: SET STATISTICS IO { ON | OFF } Ví dụ: USE AdventureWorks; GO SET STATISTICS IO ON; GO SELECT * FROM Production.ProductCostHistory WHERE StandardCost < 500.00; GO SET STATISTICS IO OFF; GO Kết trả về: (269 row(s) affected) Table 'ProductCostHistory' Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads (1 row(s) affected) Chú giải: Output item Table Meaning Tên bảng Scan count Số lần quét(scan) bảng(chỉ mục) thực thi logical reads Số trang đọc từ cache liệu physical reads Số trang đọc từ ổ đĩa read-ahead reads lob reads Số trang đặt vào cache dành cho câu truy vấn logical Số trang text, ntext, image, hay kiểu liệu lớn (varchar(max), nvarchar(max), varbinary(max)) đọc từ cache liệu lob physical Số trang text, ntext, image, hay kiểu liệu lớn (varchar(max), reads nvarchar(max), varbinary(max)) đọc từ ổ đĩa lob read- Số trang text, ntext, image, hay kiểu liệu lớn (varchar(max), ahead reads nvarchar(max), varbinary(max)) đặt vào cache cho truy vấn * Query Execution Time: Tiêu chí cho ta biết thời gian thực thi câu truy vấn, chịu tác động blocking(locks) tranh giành tài nguyên máy chủ Sử dụng hàm: SET STATISTICS TIME { ON | OFF } Ví dụ: SET STATISTICS TIME ON GO SELECT * FROM Production.ProductCostHistory WHERE StandardCost < 500.00; GO SET STATISTICS TIME OFF; GO Kết quả: SQL Server parse and compile time: CPU time = ms, elapsed time = ms SQL Server parse and compile time: CPU time = ms, elapsed time = ms (269 row(s) affected) (1 row(s) affected) SQL Server Execution Times: CPU time = ms, elapsed time = 135 ms SQL Server parse and compile time: CPU time = ms, elapsed time = ms III Bài tập thực hành Sử dụng liệu mẫu thực thi câu truy vấn sau: Hiển thị Title, FirstName, MiddleName, LastName từ bảng Person.Person Hiển thị Title, FirstName, LastName chuỗi nối nhằm dễ đọc cung cấp tiêu đề cho cột tên (PersonName) Hiển thị chi tiết địa tất nhân viên bảng Person.Address Liệt kê tên thành phố từ bảng Person.Address bỏ phần lặp lại Hiển thị chi tiết 10 bảng ghi bảng Person.Address Hiển thị trung bình tỷ giá (Rate) từ bảng HumanResources.EmployeePayHistory Hiển thị tổng số nhân viên từ bảng HumanResources.Employee Đưa danh sách khách hàng có 10 đơn hàng Đưa danh sách mặt hàng chưa đặt hàng 10 Sử dụng tool Execution Plan để giải thích bước xử lý câu truy vấn 11 Sử dụng index bảng đấy, xem xét hiệu thực thi câu truy vấn bảng 12 Sử dụng câu truy vấn 10, viết đến câu lệnh SQL, đánh giá hiệu thực thi câu lệnh SQL ... để xem xét là: Query Cost (Chi phí câu truy vấn), Page Reads (Số lượng trang đọc) Execution Time (Thời gian thực thi câu truy vấn) * Query Cost Thông số thấp, câu truy vấn chạy nhanh Thơng thường... lệnh thứ hai chiếm có 5% Nói cách khác, trường hợp index trường CustomerID giúp cho câu lệnh thực nhanh lên đến 19 lần Index giúp cho lượng liệu hệ thống cần phải xử lý để tìm kết giảm xuống đến... liệu lớn (varchar(max), ahead reads nvarchar(max), varbinary(max)) đặt vào cache cho truy vấn * Query Execution Time: Tiêu chí cho ta biết thời gian thực thi câu truy vấn, chịu tác động blocking(locks)

Ngày đăng: 27/02/2023, 23:11

Xem thêm:

w