Phân tích cú pháp XML chậm


8

Tôi hiện đang cố gắng điều chỉnh một quy trình được lưu trữ có vấn đề và tôi nhận thấy rằng phần lớn chi phí liên quan đến việc chạy nó đến từ việc phân tích cú pháp phân tích một số XML vào bảng tạm thời. Đây là SQL trong câu hỏi:

CREATE TABLE #ChangeSet 
(
    RemarkTypeID TINYINT NOT NULL PRIMARY KEY,
    RemarkText VARCHAR(2500) NOT NULL,
    ListingID INT NOT NULL
)
INSERT INTO #ChangeSet
    (RemarkTypeID, 
    RemarkText,
    ListingID)
SELECT
    T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID,
    T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText,
    @ListingID
FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c)

Ngoài ra, do đó bạn có một số ý tưởng về cấu trúc của XML được phân tích cú pháp:

  <Remarks>
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" />
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211768" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="3" RemarkText="aaaell Maintained 3Bd 1.5Ba Semi-Detached Home In Cambridge Gardens. Garage W As Converted Into A Nice Family Room The Outside Is Maintence Free. Includes All Appliances,Security System,Storage Shed,Ceiling Fans And New Carpet.This Home Is Very Well Pricded. Seller Will Consider Fha Or Va Along With Conventional Finacing. This Is A Great Buy." />
 </Remarks>

Có bất cứ điều gì tôi có thể làm để cải thiện hiệu suất phân tích các nút XML này và thiết lập bảng tạm thời này không?


Là xml được thông qua như là một tham số?
Mr.Brownstone

3
XML của bạn lớn đến mức nào, có bao nhiêu nút "Yêu cầu" và tốc độ của nó như thế nào? Chi phí cho một truy vấn XML là vô ích và không cho bạn biết gì về hiệu suất thực tế.
Mikael Eriksson

Câu trả lời:


5

Bạn có thể thử OPENXML. Bây giờ tôi thường không khuyến nghị OPENXMLvì nó có một số vấn đề về bộ nhớ nổi tiếng (về cơ bản, nó có thể chiếm 1/8 bộ đệm của bạn tùy thuộc vào kích thước của XML) (liên kết thêm TODO). Tuy nhiên, theo truyền thuyết, nó nhanh hơn đối với các phần lớn hơn của XML, do đó, nó đáng để thử trong môi trường dev / test và nếu bạn biết các vấn đề về bộ nhớ và bạn có được hiệu năng, bạn phải quyết định xem bạn cần gì nhất. Một cái gì đó như thế này:

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @RemarksXml

INSERT INTO #ChangeSet
SELECT RemarkTypeID, RemarkText, @ListingID
FROM OPENXML( @handle, '/Remarks[1]/Remark', 1 ) 
WITH ( 
    RemarkTypeID    TINYINT,
    RemarkText      VARCHAR(2500)
    )

EXEC sp_xml_removedocument @handle

Nhớ luôn gọi sp_xml_removedocument. Tôi đoán XML thực của bạn lớn hơn nhiều, bạn có thể cho chúng tôi biết ý tưởng của Remarknó sẽ có bao nhiêu phần tử và kích thước tính bằng KB / MB không. Tôi sẽ quay lại bài viết sau và thiết lập một thử nghiệm để so sánh hiệu suất dựa trên số liệu thống kê của bạn.

CẬP NHẬT: Theo tập lệnh mẫu của bạn, XML của bạn chỉ có thể có tối đa 256 Remarkphần tử với độ dài tối đa 2500. Đã tạo một số XML mẫu để đáp ứng các tiêu chí này và đã kiểm tra nó, có rất ít hiệu năng giữa hai kỹ thuật và cả hai kết thúc trong giây phụ. Trong trường hợp này tôi sẽ chọn kiểu dữ liệu và phương thức XML. Bạn có thể cung cấp các thông tin khác yêu cầu xin vui lòng?


3
SQL Server sử dụng MSXML và DOM để xử lý các tài liệu bạn tải thông qua sp_xml_preparedocument. Nó giới hạn bộ nhớ ảo MSXML có thể sử dụng để xử lý DOM xuống còn một phần tám bộ nhớ vật lý trên máy hoặc 500MB, tùy theo mức nào ít hơn .
Paul White 9

4

Có hai điều chính bạn có thể làm để cải thiện hiệu suất phân tích cú pháp xml:

  • Tạo biến xml / cột được gõ , có nghĩa là khai báo một lược đồ xsd trên đó. Điều này sẽ buộc xác thực xml, việc này sẽ mất một ít thời gian, nhưng tốc độ phân tích cú pháp sẽ được cải thiện.
  • Lập chỉ mục một cột xml (không áp dụng cho các biến xml). Bạn có thể lập chỉ mục các cột xml theo một số cách khác nhau, tùy thuộc vào yêu cầu của bạn. Điều này có thể mang lại cho bạn hiệu suất tuyệt vời cho các truy vấn và tra cứu phức tạp hơn trong các đốm màu xml.
  • Nếu truy vấn của bạn là một phần của truy vấn lớn hơn nhiều, tôi dường như nhớ rằng các thao tác xml không song song, do đó bạn có thể làm một cách khôn ngoan để phá một truy vấn lớn và thực hiện phân tích xml trong một truy vấn riêng biệt từ phần còn lại của công việc.

3
Tôi đếm ba điều, mặc dù. :-)
Aaron Bertrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.