Щойно я розгорнув функцію на своєму веб-сайті 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="
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 ), щоб відповісти на це питання, тож я можу дати йому належну належну заслугу. Якщо через деякий час я не побачу, як він з'явиться, я із задоволенням віддам заслугу Мартіну, або, навіть якщо цього не вдалося, я просто відповім на це сам. Дякую Джастіну та Мартіну!