Интерпретация XML-кода Showplan для SQL Server


15

Я только что развернул на своем сайте функцию http://sqlfiddle.com, которая позволяет пользователям просматривать необработанные планы выполнения своих запросов. В случае PostgreSQL, MySQL и (в некоторой степени) Oracle рассмотрение исходного плана выполнения выглядит понятным. Однако, если вы посмотрите на выходные данные плана выполнения для SQL Server (сгенерированные с помощью SET SHOWPLAN_XML ON), есть достаточно большой объем XML, который можно просмотреть, даже для относительно простых запросов. Вот пример (взят из плана выполнения последнего запроса для этой «скрипки»: 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>

Моя цель с этой функцией состояла в том, чтобы предоставить пользователю что-то значимое для анализа производительности их запросов (скажем, для сравнения с другими возможными подходами к реализации запросов). Тем не менее, я теперь обеспокоен тем, что я предоставляю СЛИШКОМ МНОГО данных пользователю. Мне нужно найти способ сделать это полезным.

Одна из моих идей заключалась в том, чтобы создать простой механизм для загрузки выходных данных в виде файла .sqlplan, чтобы они могли открыть его с помощью SSMS и посмотреть на него в графическом виде. Я бы предпочел не полагаться на пользователей, имеющих такие внешние инструменты, если есть другой доступный вариант.

У меня была еще одна идея - использовать какое-то XSLT-преобразование, которое могло бы вытащить и красиво представить самые важные фрагменты. Это звучит как тонна работы, и, похоже, нет хорошей документации о том, как бы я это начал. Кто-нибудь знает о существующих шаблонах XSLT, которые работают с этой схемой?

Есть еще мысли?

Обновить

Хорошо, я только что взглянул на вкладку «План выполнения» для запроса на http://data.stackexchange.com/ . Как я могу получить это ?! Это замечательно! Я надеюсь, что это не какая-то внутренняя библиотека для обмена стеками, которую они создали сами. Кто-нибудь знает?

Обновление 2

Я только что развернул потрясающее представление HTML + CSS + JS для XML showplan с использованием XSLT из этого проекта: http://code.google.com/p/html-query-plan/ (вы можете увидеть его сейчас, если Вы посещаете оригинальную ссылку, выше).

Я подожду и посмотрю, появится ли автор этого проекта ( /dba//users/5996/justin ), чтобы ответить на этот вопрос, поэтому я могу дать ему должную оценку. Если я не увижу его через некоторое время, то я с радостью отдаю должное Мартину или, если не получится, просто отвечу сам. Спасибо, Джастин и Мартин!

Ответы:


9

Сначала позвольте мне сказать - фантастически выглядящий сайт :)

Это именно то, для чего я написал XSLT - я рад, что другие находят это полезным!

Я должен признаться, это то, что я написал некоторое время назад, а затем отошел на второй план, есть некоторые улучшения, которые я планировал сделать некоторое время назад, и я надеюсь вскоре приступить к их реализации!

Некоторые ссылки:

Дайте мне знать, если у вас есть предложения по улучшению!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.