Example #1
0
 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;
     }
 }
Example #2
0
 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);
 }
Example #3
0
 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));
Example #6
0
         $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();
Example #7
0
<?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);
Example #8
0
	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] = "";