Інтерпретація Showplan XML 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>

Моєю метою за допомогою цієї функції було надати користувачеві щось значуще для аналізу їхньої ефективності запитів (скажімо, порівняння з іншими можливими підходами до виконання запитів). Однак я зараз стурбований тим, що я надаю користувачеві TOO MUCH дані. Мені потрібно знайти спосіб зробити це корисним.

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

Ще одна ідея, яку я мав, використовувала якусь трансформацію XSLT, яка могла витягнути і добре представити найважливіші біти. Це звучить як багато роботи, і, здається, не існує жодної гарної документації про те, як я б це почав. Хтось знає про існуючі шаблони XSLT, які працюють з цією схемою?

Будь-які інші думки?

Оновлення

Гаразд, я просто переглянув вкладку "План виконання" для запиту на http://data.stackexchange.com/ . Як я можу це зробити ?! Це неймовірно! Я сподіваюся, що це не якась бібліотека, призначена лише для внутрішніх обставин, яку вони створили власноруч. Хтось знає?

Оновлення 2

Я тільки що розгорнув дивовижний перегляд HTML + CSS + JS для XML-шоу XML-програми XMLL із цього проекту: 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.