воскресенье, 22 мая 2016 г.

Cache: Смотрим план SQL запроса

В Cache5 появилась утилита показа плана выполнения запроса ShowPlan^%apiSQL.
USER>zn "samples"
SAMPLES>s %msql="_SYSTEM"
SAMPLES>s sql=1
SAMPLES>s sql(1)="select * from Sample.Person"
SAMPLES>d ShowPlan^%apiSQL(.sql,1)
SAMPLES>w
%msql="_SYSTEM"
%plan=9
%plan(1)="<plan>"
%plan(2)="<sql>"
%plan(3)="select * from Sample.Person"
%plan(4)="</sql>"
%plan(5)="<cost value="5047000"/>"
%plan(6)="Read master map Sample.Person.IDKEY, looping on ID."
%plan(7)="For each row:"
%plan(8)="    Output the row."
%plan(9)="</plan>"
Для интеграции в SQL Manager сделан специальный класс - наследник %CSP.Page для показа плана выполнения непосредственно в одном из окон SQL Manager, %SQL.Manager.ShowPlan. Для просмотра плана выполнения нужно ввести текст запроса и нажать кнопку показать план. В нижней части вместо результата выполнения появится html - страница с планом.

Мне показалось полезным иметь возможность видеть отдельно результат выполнения и план запроса. Для этого нужно запустить два SQL Manager. Но, поскольку показ плана выполняет CSP страница, её функциональность можно интегрировать в небольшую самодельную страничку, разместив управляющие элементы по своему вкусу.

В результате получилось три файла:
  1. Контейнер для двух фреймов - в верхнем вводить текст запроса, в нижнем показывать план выполнения.
  2. Верхний фрейм, для ввода текста запроса и выбора области.
  3. Нижний фрейм, фактически переходник на метод класса ##class(%SQL.Manager.ShowPlan).ShowPlan()
Корневым файлом является ViewPlan.html:
<HTML>
<HEAD>
<TITLE>View SQL Plan</TITLE>
</HEAD>
<FRAMESET ROWS="115,*">
 <FRAME SRC="ViewPlanTop.csp" NAME="select">
 <FRAME SRC="" NAME="viewplan">
</FRAMESET>
</HTML>
Верхний фрейм на CSP, ViewPlanTop.csp:
<HTML>
<HEAD>
<TITLE>Enter SQL Select Here</TITLE>

<script>
function NSChange()
{
  document.location.href=
    "ViewPlanTop.csp?namespace="+encodeURIComponent(document.forms.selectform.namespace.value)+
    "&sql="+encodeURIComponent(document.forms.selectform.sql.value);
  return;
}
</script>
</HEAD>

<BODY>
<form name=selectform target="viewplan" method="post" action="ShowPlan.csp">
<textarea name=sql rows=3 cols=80><server>
 w %request.Get("sql")
</server></textarea>
<table>
<tr>
<td>
Namespace:
</td>
<td>
<SELECT NAME="namespace" onchange="NSChange();">
<server>
 n i,nslist,namespace
 s namespace=%request.Get("namespace")
 f i=1:1:$ZU(90,0) s nslist($ZU(90,2,0,i))=""
 s i="" f  s i=$o(nslist(i)) q:i=""  d
 . i i=namespace w "<option selected value="_i_">"_i_"</option>"
 . e  w "<option value="_i_">"_i_"</option>"
</server>
</SELECT>
</td>
<td>
<input type=submit value="Show Plan">
</td>
</tr>
</table>
</form>
</BODY>
</HTML>
И нижний фрейм на CSP, файл ShowPlan.csp:
<HTML>
<HEAD>
<TITLE>Show Plan</TITLE>
</HEAD>

<BODY>

<server>
 n username,namespace,savenamespace
 s savenamespace=$zu(5)
 s namespace=%request.Get("namespace",1)
 zn namespace
 s %msql="_SYSTEM"
 d ##class(%SQL.Manager.ShowPlan).ShowPlan(%request.Get("sql",1))
 zn savenamespace
</server>

</BODY>
</HTML>
Утилита ShowPlan^%apiSQL форматирует план запроса в XML, поэтому могут быть дополнительно использованы анализаторы фрагментов плана для их показа различным способом.

Комментариев нет:

Отправить комментарий