GetGroupRight("perfmon"); if ($RIGHT == "D") $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); $APPLICATION->SetTitle(GetMessage("PERFMON_EXPLAIN_TITLE")); $ID = intval($ID); $sTableID = "tbl_perfmon_explain"; $lAdmin = new CAdminList($sTableID); if ($DBType == "mysql") { $arHeader = array( array( "id" => "select_type", "content" => GetMessage("PERFMON_EXPLAIN_F_SELECT_TYPE"), "align" => "left", "default" => true, ), array( "id" => "table", "content" => GetMessage("PERFMON_EXPLAIN_F_TABLE"), "align" => "left", "default" => true, ), array( "id" => "type", "content" => GetMessage("PERFMON_EXPLAIN_F_TYPE"), "align" => "left", "default" => true, ), array( "id" => "possible_keys", "content" => GetMessage("PERFMON_EXPLAIN_F_POSSIBLE_KEYS"), "align" => "left", "default" => true, ), array( "id" => "key", "content" => GetMessage("PERFMON_EXPLAIN_F_KEY"), "align" => "left", "default" => true, ), array( "id" => "key_len", "content" => GetMessage("PERFMON_EXPLAIN_F_KEY_LEN"), "align" => "right", "default" => true, ), array( "id" => "ref", "content" => GetMessage("PERFMON_EXPLAIN_F_REF"), "align" => "left", "default" => true, ), array( "id" => "rows", "content" => GetMessage("PERFMON_EXPLAIN_F_ROWS"), "align" => "right", "default" => true, ), array( "id" => "Extra", "content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"), "align" => "left", "default" => true, ), ); } elseif ($DBType == "oracle") { $arHeader = array( array( "id" => "OPERATION", "content" => GetMessage("PERFMON_EXPLAIN_F_OPERATION"), "align" => "left", "default" => true, ), array( "id" => "OBJECT_NAME", "content" => GetMessage("PERFMON_EXPLAIN_F_OBJECT_NAME"), "align" => "left", "default" => true, ), array( "id" => "OBJECT_TYPE", "content" => GetMessage("PERFMON_EXPLAIN_F_OBJECT_TYPE"), "align" => "left", "default" => true, ), array( "id" => "OPTIONS", "content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"), "align" => "left", "default" => true, ), array( "id" => "CARDINALITY", "content" => GetMessage("PERFMON_EXPLAIN_F_ROWS"), "align" => "right", "default" => true, ), array( "id" => "COST", "content" => GetMessage("PERFMON_EXPLAIN_F_COST"), "align" => "right", "default" => true, ), ); } else { $arHeader = array(); } $lAdmin->AddHeaders($arHeader); $arPlan = false; $cData = new CPerfomanceSQL; $rsSQL = $cData->GetList(array("ID", "SQL_TEXT"), array("=ID" => $ID), array(), false); $arSQL = $rsSQL->Fetch(); $strSQL = CPerfQuery::transform2select($arSQL["SQL_TEXT"]); if ($strSQL) { if ($DBType == "mysql") { $rsData = $DB->Query("explain ".$strSQL, true); } elseif ($DBType == "oracle") { $rsData = $DB->Query("explain plan for ".$strSQL, true); if ($rsData) { $rsData = $DB->Query("select * from plan_table order by ID"); $arPlan = $rsData->Fetch(); } } else { $rsData = false; } } else { $rsData = false; } if ($rsData) { $SQL_TEXT = CPerfomanceSQL::Format($strSQL); $lAdmin->BeginPrologContent(); if (class_exists("geshi")) { $obGeSHi = new GeSHi(CSqlFormat::reformatSql($SQL_TEXT), 'sql'); echo $obGeSHi->parse_code(); } else { echo "

".str_replace( array(" ", "\t", "\n"), array(" ", "   ", "
"), htmlspecialcharsbx(CSqlFormat::reformatSql($SQL_TEXT)) )."

"; } if ($arPlan["OPTIMIZER"]) { echo "

".GetMessage("PERFMON_EXPLAIN_F_OPTIMIZER").": ".$arPlan["OPTIMIZER"]."

"; echo "

".GetMessage("PERFMON_EXPLAIN_F_COST").": ".$arPlan["POSITION"]."

"; } $lAdmin->EndPrologContent(); } else { $rsData = new CDBResult; $rsData->InitFromArray(array()); $lAdmin->BeginPrologContent(); $message = new CAdminMessage(array( "MESSAGE" => GetMessage("PERFMON_EXPLAIN_SQL_ERROR"), "TYPE" => "ERROR", )); echo $message->Show(); $lAdmin->EndPrologContent(); } $Comment = ""; $rsData = new CAdminResult($rsData, $sTableID); $rsData->NavStart(); while ($arRes = $rsData->GetNext(true, "f_")) { if (array_key_exists("DEPTH", $arRes)) $arRes["OPERATION"] = str_repeat("  ", $arRes["DEPTH"]).$arRes["OPERATION"]; if (array_key_exists("select_type", $arRes)) $arRes["select_type"] = $arRes["id"]." ".$arRes["select_type"]; $row = $lAdmin->AddRow($arRes["ID"], $arRes); if (array_key_exists("Comment", $arRes)) $Comment .= $arRes["Comment"]."\n"; } if ($Comment) { $lAdmin->BeginEpilogContent(); $message = new CAdminMessage(array( "MESSAGE" => $Comment, "TYPE" => "OK", )); echo $message->Show(); $lAdmin->EndEpilogContent(); } $lAdmin->AddFooter(array()); $lAdmin->CheckListMode(); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_popup_admin.php"); $lAdmin->DisplayList(); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_popup_admin.php"); ?>