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