Giải thích XML Showplan XML của SQL Server


15

Tôi vừa giới thiệu một tính năng trên trang web của mình http://sqlfiddle.com cho phép người dùng xem các kế hoạch thực hiện thô cho các truy vấn của họ. Trong trường hợp của PostgreSQL, MySQL và (ở một mức độ nào đó) Oracle, nhìn vào đầu ra kế hoạch thực hiện thô có vẻ dễ hiểu. Tuy nhiên, nếu bạn nhìn vào đầu ra kế hoạch thực hiện cho SQL Server (được tạo bằng SET SHOWPLAN_XML ON), có một lượng lớn XML đơn giản để lội qua, ngay cả đối với các truy vấn tương đối đơn giản. Đây là một ví dụ (được lấy từ kế hoạch thực hiện của truy vấn cuối cùng cho 'fiddle' này: http://sqlfiddle.com/#!3/1fa93/1 ):

<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0">
    <BatchSequence>
        <Batch>
            <Statements>
                <StmtSimple StatementText="&#xa;select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96">
                    <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/>
                    <QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72">
                        <RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="3" EstimateIO="0.003125" EstimateCPU="0.0001603" AvgRowSize="42" EstimatedTotalSubtreeCost="0.0032853" TableCardinality="3" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
                            <OutputList>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="id"/>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="type"/>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="details"/>
                            </OutputList>
                            <IndexScan Ordered="0" ForcedIndex="0" ForceScan="0" NoExpandHint="0">
                                <DefinedValues>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="id"/>
                                    </DefinedValue>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="type"/>
                                    </DefinedValue>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="details"/>
                                    </DefinedValue>
                                </DefinedValues>
                                <Object Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Index="[PK__supportC__3213E83F7F60ED59]" IndexKind="Clustered"/>
                            </IndexScan>
                        </RelOp>
                    </QueryPlan>
                </StmtSimple>
            </Statements>
        </Batch>
    </BatchSequence>
</ShowPlanXML>

Mục tiêu của tôi với chức năng này là cung cấp cho người dùng một cái gì đó có ý nghĩa để phân tích hiệu suất truy vấn của họ (giả sử, để so sánh với các phương pháp triển khai truy vấn có thể khác). Tuy nhiên, hiện tại tôi lo ngại rằng tôi đang cung cấp dữ liệu QUÁ NHIỀU cho người dùng. Tôi cần tìm một cách để làm cho điều này hữu ích.

Một ý tưởng tôi đã có là xây dựng một cơ chế dễ dàng để tải xuống đầu ra dưới dạng tệp .sqlplan, để họ có thể mở nó bằng SSMS và xem xét nó bằng đồ họa ở đó. Tuy nhiên, tôi không cần phải phụ thuộc vào người dùng có sẵn các công cụ bên ngoài như vậy, nếu có sẵn một tùy chọn hợp lý khác.

Một ý tưởng khác mà tôi có là sử dụng một số loại biến đổi XSLT có thể rút ra và trình bày độc đáo các bit quan trọng nhất. Tuy nhiên, điều này nghe có vẻ như rất nhiều công việc và dường như không có tài liệu hay nào về cách tôi thậm chí sẽ bắt đầu điều đó. Có ai biết các mẫu XSLT hiện có hoạt động với lược đồ này không?

Còn suy nghĩ nào khác không?

Cập nhật

Được rồi, tôi chỉ xem tab "Kế hoạch thực hiện" cho một truy vấn trên http://data.stackexchange.com/ . Làm thế nào để tôi có được điều đó?! Điều đó thật tuyệt vời! Tôi hy vọng đó không phải là một thư viện chỉ dành cho nội bộ mà họ xây dựng trong nhà. Có ai biết không?

Cập nhật 2

Tôi vừa giới thiệu chế độ xem HTML + CSS + JS tuyệt vời của XML showplan bằng XSLT từ dự án này: http://code.google.com.vn/p/html-query-plan/ (bạn có thể thấy ngay bây giờ nếu bạn truy cập liên kết ban đầu, ở trên).

Tôi sẽ chờ xem liệu tác giả của dự án này ( /dba//users/5996/justin ) xuất hiện để trả lời câu hỏi này, vì vậy tôi có thể cung cấp cho anh ta khoản tín dụng đúng hạn của mình. Nếu sau một thời gian tôi không thấy anh ấy xuất hiện, thì tôi sẽ vui vẻ cấp tín dụng cho Martin hoặc, thậm chí là không, tôi sẽ tự trả lời. Cảm ơn Justin và Martin!

Câu trả lời:


9

Đầu tiên hãy để tôi nói - trang web tìm kiếm tuyệt vời :)

Loại điều này chính xác là những gì tôi đã viết XSLT cho - Tôi rất vui vì những người khác đang thấy nó hữu ích!

Tôi phải thú nhận điều gì đó mà tôi đã viết cách đây một thời gian và sau đó được theo dõi bên lề, có một số cải tiến mà tôi đã dự định thực hiện trong một thời gian bây giờ mà tôi hy vọng sẽ sớm thực hiện được!

Một số liên kết:

Hãy cho tôi biết nếu bạn có bất kỳ đề xuất cải tiến!

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.