Tôi có một bảng có nhiều tài liệu xml lớn.
Khi tôi chạy các biểu thức xpath để chọn dữ liệu từ các tài liệu đó, tôi gặp phải một vấn đề hiệu năng đặc biệt.
Truy vấn của tôi là
SELECT
p.n.value('.', 'int') AS PurchaseOrderID
,x.ProductID
FROM XmlLoadData x
CROSS APPLY x.PayLoad.nodes('declare namespace NS="http://schemas.datacontract.org/2004/07/XmlDbPerfTest";
/NS:ProductAndRelated[1]/NS:Product[1]/NS:PurchaseOrderDetails[1]/NS:PurchaseOrderDetail/NS:PurchaseOrderID[1]') p(n)
Truy vấn mất 2 phút 8 giây.
Khi tôi loại bỏ các [1]
phần của các nút đơn lẻ như thế này:
SELECT
p.n.value('.', 'int') AS PurchaseOrderID
,x.ProductID
FROM XmlLoadData x
CROSS APPLY x.PayLoad.nodes('declare namespace NS="http://schemas.datacontract.org/2004/07/XmlDbPerfTest";
/NS:ProductAndRelated/NS:Product/NS:PurchaseOrderDetails/NS:PurchaseOrderDetail/NS:PurchaseOrderID') p(n)
Thời gian thực hiện giảm xuống chỉ còn 18 giây.
Vì các [1]
nút xảy ra chỉ một lần trong mỗi nút cha trong các tài liệu, kết quả là như nhau ngoại trừ việc đặt hàng.
Kế hoạch thực hiện thực tế cho truy vấn đầu tiên (chậm) là
và truy vấn thứ hai (nhanh hơn) là
Truy vấn 1 toàn màn hình Truy vấn 2 toàn màn hình .
Theo như tôi có thể thấy truy vấn [1]
thực hiện giống như truy vấn mà không có, nhưng với việc thêm một số bước tính toán bổ sung để tìm mục đầu tiên.
Câu hỏi của tôi là tại sao truy vấn thứ hai nhanh hơn.
Tôi đã dự kiến việc thực hiện truy vấn [1]
sẽ bị hỏng sớm khi tìm thấy kết quả khớp và do đó giảm thời gian thực hiện thay vì ngược lại.
Có bất kỳ lý do tại sao việc thực thi không phá vỡ sớm [1]
và do đó làm giảm thời gian thực hiện.
Đây là bàn của tôi
CREATE TABLE [dbo].[XmlLoadData](
[ProductID] [int] NOT NULL,
[PayLoad] [xml] NOT NULL,
[Size] AS (len(CONVERT([nvarchar](max),[PayLoad],0))),
CONSTRAINT [PK_XmlLoadData] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Chỉnh sửa:
Số hiệu suất từ SQL Profiler:
Truy vấn 1:
CPU Reads Writes Duration
126251 1224892 0 129797
Truy vấn 2:
CPU Reads Writes Duration
50124 612499 0 16307