public static function GatherColumnStatOverall($table, $column) { $tab = new CPerfomanceTable(); $tab->Init($table); if ($tab->IsExists()) { $arStat = CPerfQueryStat::_get_stat($table, $column, null); if (!is_array($arStat)) { CPerfQueryStat::_gather_stat($table, $column, null, -1); $arStat = CPerfQueryStat::_get_stat($table, $column, null); } return $arStat; } else { return false; } }
function GetList($bFull = true) { global $DB; if ($bFull) { $rsTables = $DB->Query("show table status"); } else { $rsTables = $DB->Query("show tables from " . CPerfomanceTable::escapeTable($DB->DBName)); } return new CPerfomanceTableList($rsTables); }
function suggest_index($table_alias) { global $DB; $suggest_table = null; /** @var CPerfQueryTable $table */ foreach ($this->from->tables as $table) { if ($this->cmp($table->alias, $table_alias)) { $suggest_table = $table; } } if (!isset($suggest_table)) { return false; } $arTableJoins = $this->table_joins($table_alias); //Next read indexes already have $arSuggest = array(); if (!empty($arTableJoins)) { if (!$DB->TableExists($suggest_table->name)) { return false; } $table = new CPerfomanceTable(); $arIndexes = $table->GetIndexes($suggest_table->name); foreach ($arIndexes as $index_name => $arColumns) { $arIndexes[$index_name] = implode(",", $arColumns); } //Test our suggestion against existing indexes foreach ($arTableJoins as $i => $arColumns) { $index_found = ""; $arColumns = $this->_adjust_columns($arColumns); //Take all possible combinations of columns $arCombosToTest = $this->array_power_set($arColumns); foreach ($arCombosToTest as $arComboColumns) { if (!empty($arComboColumns)) { $index2test = implode(",", $arComboColumns); //Try to find out if index already exists foreach ($arIndexes as $index_name => $index_columns) { if (substr($index_columns, 0, strlen($index2test)) === $index2test) { if ($index_found === "" || count(explode(",", $index_found)) < count(explode(",", $index2test))) { $index_found = $index2test; } } } } } // if (!$index_found) { sort($arColumns); $arSuggest[] = $suggest_table->alias . ":" . $suggest_table->name . ":" . implode(",", $arColumns); } } } if (!empty($arSuggest)) { return $arSuggest; } else { return false; } }
// Id of the edited record $rsSuggest = CPerfomanceIndexSuggest::GetList(array("ID", "TABLE_NAME", "TABLE_ALIAS", "COLUMN_NAMES", "SQL_TEXT", "SQL_EXPLAIN", "SQL_TIME", "SQL_COUNT"), array("=ID" => $ID), array()); $arSuggest = $rsSuggest->Fetch(); if (!$arSuggest) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } $sql = CPerfomanceSQL::Format($arSuggest["SQL_TEXT"]); $sql = htmlspecialcharsEx($sql); $sql = preg_replace("/(" . preg_quote($arSuggest["TABLE_NAME"]) . "\\s+(?i:as\\s+)*" . $arSuggest["TABLE_ALIAS"] . ")\\s+/", "<b>\\1</b> ", $sql); foreach (explode(",", $arSuggest["COLUMN_NAMES"]) as $column_name) { $sql = str_replace($arSuggest["TABLE_ALIAS"] . "." . $column_name, "<b>" . $arSuggest["TABLE_ALIAS"] . "." . $column_name . "</b>", $sql); } $arSuggest["FORMATTED_SQL_TEXT"] = $sql; $arColumns = explode(",", $arSuggest["COLUMN_NAMES"]); $arTableStat = CPerfQueryStat::GatherTableStat($arSuggest["TABLE_NAME"]); $arIndexes = CPerfomanceTable::GetIndexes($arSuggest["TABLE_NAME"]); $arQueries = array(); $rsQueries = CPerfomanceSQL::GetList(array("ID", "SQL_TEXT"), array("=SUGGEST_ID" => $ID), array("ID" => "ASC"), false, array("nTopCount" => 10)); while ($arQuery = $rsQueries->Fetch()) { $arQuery["STAT"] = array(); $arQuery["WHERE"] = array(); $arQuery["JOIN"] = array(); $q = new CPerfQuery(); if ($q->parse($q->transform2select($arQuery["SQL_TEXT"]))) { foreach ($arColumns as $column_name) { $arQuery["WHERE"][$column_name] = $q->find_value($arSuggest["TABLE_NAME"], $column_name); if ($arQuery["WHERE"][$column_name] == "") { $arQuery["JOIN"][$column_name] = $q->find_join($arSuggest["TABLE_NAME"], $column_name); } else { $arQuery["JOIN"][$column_name] = ""; }
/*.require_module 'standard';.*/ /*.require_module 'hash';.*/ /*.require_module 'bitrix_main_include_prolog_admin_before';.*/ require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php"; IncludeModuleLangFile(__FILE__); if (!CModule::IncludeModule('perfmon')) { require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; echo CAdminMessage::ShowMessage(GetMessage("PERFMON_ROW_EDIT_MODULE_ERROR")); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php"; die; } $RIGHT = $APPLICATION->GetGroupRight("perfmon"); if ($RIGHT <= "D") { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } $obTable = new CPerfomanceTable(); $obTable->Init($table_name); if (!$obTable->IsExists()) { require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; echo CAdminMessage::ShowMessage(GetMessage("PERFMON_ROW_EDIT_TABLE_ERROR", array("#TABLE_NAME#" => htmlspecialcharsbx($table_name)))); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php"; die; } $isAdmin = $USER->CanDoOperation('edit_php'); $arUniqueIndexes = $obTable->GetUniqueIndexes(); $arFilter = array(); $strWhere = ""; $arRowPK = is_array($_REQUEST["pk"]) ? $_REQUEST["pk"] : array(); if (count($arRowPK)) { foreach ($arUniqueIndexes as $arIndexColumns) { $arMissed = array_diff($arIndexColumns, array_keys($arRowPK));
$lAdmin->AddGroupError(GetMessage("PERFMON_TABLES_CONVERT_ERROR"), $table_name); } break; case "optimize": $DB->Query("optimize table `" . $table_name . "`", false); break; case "orm": $_GET["orm"] = "y"; $tableParts = explode("_", $table_name); array_shift($tableParts); $moduleNamespace = ucfirst($tableParts[0]); if (count($tableParts) > 1) { array_shift($tableParts); } $className = \Bitrix\Main\Entity\Base::snake2camel(implode("_", $tableParts)); $obTable = new CPerfomanceTable(); $obTable->Init($table_name); $arFields = $obTable->GetTableFields(false, true); $arUniqueIndexes = $obTable->GetUniqueIndexes(); $hasID = false; foreach ($arUniqueIndexes as $indexName => $indexColumns) { if (array_values($indexColumns) === array("ID")) { $hasID = $indexName; } } if ($hasID) { $arUniqueIndexes = array($hasID => $arUniqueIndexes[$hasID]); } $obSchema = new CPerfomanceSchema(); $arParents = $obSchema->GetParents($table_name); $arValidators = array();
<?php define("ADMIN_MODULE_NAME", "perfmon"); define("PERFMON_STOP", true); require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php"; require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/perfmon/include.php"; require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/perfmon/prolog.php"; IncludeModuleLangFile(__FILE__); $table_name = $_REQUEST["table_name"]; $obTable = new CPerfomanceTable(); $obTable->Init($table_name); $RIGHT = $APPLICATION->GetGroupRight("perfmon"); if ($RIGHT == "D" || !$obTable->IsExists()) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } if ($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["ajax_tooltip"]) && $_GET["ajax_tooltip"] === "y" && isset($_GET["find_type"]) && isset($_GET["find"]) && check_bitrix_sessid()) { require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_js.php"; $rsData = $obTable->GetList(array("*"), array("=" . $_GET["find_type"] => $_GET["find"])); $arData = $rsData->Fetch(); if ($arData) { ?> <table class="list"><?php ?> <tr><td align="left" colspan="2"><b><?php echo htmlspecialcharsex($table_name); ?> </b></td></tr><?php foreach ($arData as $key => $value) { ?> <tr><td align="left"><?php echo htmlspecialcharsex($key);
public function suggest_index($table_alias) { global $DB; $suggest_table = null; foreach($this->from->tables as $table) if($table->alias === $table_alias) $suggest_table = $table; if(!isset($suggest_table)) return false; $arTableJoins = $this->table_joins($table_alias); //Next read indexes already have //echo "<pre>",htmlspecialcharsbx(print_r($arTableJoins,1)),"</pre>"; $arSuggest = array(); if(!empty($arTableJoins)) { if(!$DB->TableExists($suggest_table->name)) return false; $arIndexes = CPerfomanceTable::GetIndexes($suggest_table->name); foreach($arIndexes as $index_name => $arColumns) $arIndexes[$index_name] = implode(",", $arColumns); //echo "<pre>",htmlspecialcharsbx(print_r($arIndexes,1)),"</pre>"; //Test our suggestion against existing indexes foreach($arTableJoins as $i => $arColumns) { $index_found = ""; $arColumns = $this->_adjust_columns($arColumns); //Take all possible combinations of columns $arCombosToTest = $this->array_power_set($arColumns); //echo "<pre>",htmlspecialcharsbx(print_r($arCombosToTest,1)),"</pre>"; foreach($arCombosToTest as $arComboColumns) { if(!empty($arComboColumns)) { $index2test = implode(",", $arComboColumns); //Try to find out if index alredy exists foreach($arIndexes as $index_name => $index_columns) { if(substr($index_columns, 0, strlen($index2test)) === $index2test) { if( $index_found === "" || count(explode(",", $index_found)) < count(explode(",", $index2test)) ) $index_found = $index2test; } } } } // if(!$index_found) { sort($arColumns); $arSuggest[] = $suggest_table->alias.":".$suggest_table->name.":".implode(",", $arColumns); } } } if(!empty($arSuggest)) { return $arSuggest; } else { return false; } }
// Id of the edited record $rsSuggest = CPerfomanceIndexSuggest::GetList(array("ID", "TABLE_NAME", "TABLE_ALIAS", "COLUMN_NAMES", "SQL_TEXT", "SQL_EXPLAIN", "SQL_TIME", "SQL_COUNT"), array("=ID" => $ID), array()); $arSuggest = $rsSuggest->Fetch(); if (!$arSuggest) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } $sql = CPerfomanceSQL::Format($arSuggest["SQL_TEXT"]); $sql = htmlspecialcharsEx($sql); $sql = preg_replace("/(" . preg_quote($arSuggest["TABLE_NAME"]) . "\\s+(?i:as\\s+)*" . $arSuggest["TABLE_ALIAS"] . ")\\s+/", "<b>\\1</b> ", $sql); foreach (explode(",", $arSuggest["COLUMN_NAMES"]) as $column_name) { $sql = str_replace($arSuggest["TABLE_ALIAS"] . "." . $column_name, "<b>" . $arSuggest["TABLE_ALIAS"] . "." . $column_name . "</b>", $sql); } $arSuggest["FORMATTED_SQL_TEXT"] = $sql; $arColumns = explode(",", $arSuggest["COLUMN_NAMES"]); $arTableStat = CPerfQueryStat::GatherTableStat($arSuggest["TABLE_NAME"]); $obTable = new CPerfomanceTable(); $arIndexes = $obTable->GetIndexes($arSuggest["TABLE_NAME"]); $arQueries = array(); $rsQueries = CPerfomanceSQL::GetList(array("ID", "SQL_TEXT"), array("=SUGGEST_ID" => $ID), array("ID" => "ASC"), false, array("nTopCount" => 10)); while ($arQuery = $rsQueries->Fetch()) { $arQuery["STAT"] = array(); $arQuery["WHERE"] = array(); $arQuery["JOIN"] = array(); $q = new CPerfQuery(); if ($q->parse($q->transform2select($arQuery["SQL_TEXT"]))) { foreach ($arColumns as $column_name) { $arQuery["WHERE"][$column_name] = $q->find_value($arSuggest["TABLE_NAME"], $column_name); if ($arQuery["WHERE"][$column_name] == "") { $arQuery["JOIN"][$column_name] = $q->find_join($arSuggest["TABLE_NAME"], $column_name); } else { $arQuery["JOIN"][$column_name] = "";