Właśnie wdrożyłem funkcję na mojej stronie http://sqlfiddle.com, która pozwala użytkownikom przeglądać surowe plany wykonania swoich zapytań. W przypadku PostgreSQL, MySQL i (do pewnego stopnia) Oracle spojrzenie na wyjściowy plan wykonania wydaje się zrozumiałe. Jednak jeśli spojrzysz na dane wyjściowe planu wykonania dla SQL Server (wygenerowane przy pomocy SET SHOWPLAN_XML ON
), istnieje po prostu ogromna ilość XML do przejścia, nawet w przypadku stosunkowo prostych zapytań. Oto przykład (wzięty z planu wykonania ostatniego zapytania dla tego „skrzypka”: 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>
Moim celem z tą funkcją było dostarczenie użytkownikowi czegoś istotnego do analizy jego wydajności zapytania (powiedzmy, aby porównać z innymi możliwymi metodami implementacji zapytania). Obawiam się jednak, że dostarczam TU DUŻO danych dla użytkownika. Muszę znaleźć sposób, aby uczynić to użytecznym.
Jednym z moich pomysłów było zbudowanie łatwego mechanizmu pobierania danych wyjściowych w postaci pliku .sqlplan, aby mogli otworzyć je za pomocą SSMS i obejrzeć je tam graficznie. Wolałbym jednak nie polegać na tym, że użytkownicy dysponują takimi zewnętrznymi narzędziami, jeśli dostępna jest inna rozsądna opcja.
Innym pomysłem było użycie transformacji XSLT, która mogłaby wyciągnąć i ładnie przedstawić najważniejsze bity. Brzmi to jak mnóstwo pracy i wydaje się, że nie ma dobrej dokumentacji na temat tego, jak bym to zaczął. Czy ktoś wie o istniejących szablonach XSLT, które działają z tym schematem?
Jakieś inne myśli?
Aktualizacja
Ok, właśnie rzuciłem okiem na zakładkę „Plan wykonania” dla zapytania na http://data.stackexchange.com/ . Jak to zdobyć ?! To jest niesamowite! Mam nadzieję, że nie jest to jakaś biblioteka, która została zbudowana wewnętrznie tylko na wymianę. Ktoś wie?
Aktualizacja 2
Właśnie wdrożyłem niesamowity widok HTML + CSS + JS showplan XML za pomocą XSLT z tego projektu: http://code.google.com/p/html-query-plan/ (możesz to teraz zobaczyć, jeśli odwiedzasz oryginalny link powyżej).
Poczekam i zobaczę, czy autor tego projektu ( /dba//users/5996/justin ) pojawia się, aby odpowiedzieć na to pytanie, więc mogę przyznać mu należny mu kredyt. Jeśli po pewnym czasie nie zobaczę, jak pojawia się w sklepie, z przyjemnością podziękuję Martinowi, a jeśli to nie wystarczy, sam mu odpowiem. Dziękuję Justin i Martin!