Улучшение времени загрузки запроса

#php #sql #sql-server #odbc

#php #sql #sql-сервер #odbc

Вопрос:

У меня есть этот скрипт, но загрузка занимает много времени, а иногда и превышает время загрузки, есть ли способ увеличить время загрузки?

 public static function getSubAreas() {

    // Get database object from global scope
    global $database;

    if(isset($_GET['PostAreaRef'])){ $PostAreaRef = trim($_GET['PostAreaRef']); } else { $PostAreaRef = "0"; }


    $resultA = $database->execute("SELECT AgentRef FROM SearchGroupsAgent WHERE SearchGroupRef = '21'");
    $AgentRefs = array();
    while($rowA = $database->fetch($resultA)) {
        $AgentRefs[] = '''.$rowA['AgentRef'].'''; 
    }
    $AgentRefs = implode(',',$AgentRefs);


    // Build database query
    $sql = "SELECT SubAreaRef, count(*) AS Count FROM PropertySale WHERE StatusRef = 1  AND Archived = 0 AND AgentRef IN ($AgentRefs) GROUP BY SubAreaRef ORDER BY Count DESC";

    // Get data from database
    $result = $database->execute($sql);

    // Initialize array to hold objects
    $objects = array();

    // Fetch rows from database cursor
    while($row = $database->fetch($result)) {

        $object = new self;

        $GroupAreaSQL = $database->execute("SELECT ID,SubArea FROM SubArea WHERE ID =  '".$row['SubAreaRef']."'");
        $GroupArea = $database->fetch($GroupAreaSQL);

        if ($GroupArea['SubArea'] == "-- Not Specified --")
            {

            }
            else
            {
                if ($GroupArea['AreaRef'] == $PostAreaRef)
                {
                    // Initialize object's attributes
                    $object->ID = $GroupArea['ID'];
                    $object->SubArea = $GroupArea['SubArea'];
                    $object->Count = $row['Count'];
                    $objects[] = $object;
                }
            }


    }

    // Return array of objects
    return $objects;
}
  

И этот код:

    public static function getAreas2() {



    $db = odbc_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD);  

    $resultA = odbc_exec($db, "SELECT AgentRef FROM SearchGroupsAgent WHERE SearchGroupRef = '21'");
    $AgentRefs = array();
    while($rowA = odbc_fetch_array($resultA)) {
        $AgentRefs[] = '''.$rowA['AgentRef'].'''; 
    }
    $AgentRefs = implode(',',$AgentRefs);


    $query = odbc_exec($db, "SELECT  ID,Area FROM Area ORDER BY Area"); 
    while($Area = odbc_fetch_array($query))
      {                    
         $Counter = 0;
         $query2 = odbc_exec($db, "SELECT  ID,SubArea FROM SubArea WHERE AreaRef = '".$Area['ID']."' ");  
         while($SubArea = odbc_fetch_array($query2))
         {
            if ($SubArea['SubArea'] != "-- Not Specified --")
            {
              $result3 = odbc_exec($db, "SELECT count(*) AS Count FROM PropertySale WHERE StatusRef = 1  AND Archived = 0 AND SubAreaRef = '".$SubArea['ID']."' AND AgentRef IN ($AgentRefs)");
              $PropertySale = odbc_fetch_array($result3);
              if ($PropertySale['Count'] > 0)
              {
                $AreaID = $Area['ID'];
                $AreaName = $Area['Area'];
                $Counter = $Counter   $PropertySale['Count'];
              }

            }
            else
            {
              $AreaID = $Area['ID'];
              $AreaName = "";
              $Counter = $Counter;
            }

         }

        if ($Counter != 0)
        {
            $object = new self;
             // Initialize object's attributes
            $object->ID = $AreaID;
            $object->Area = $AreaName;
            $object->Count = $Counter;
            $objects[] = $object;
        }

      } 

    // Return array of objects
    return $objects;
}
  

Это мои таблицы:

Область: идентификатор, область

Вложенная область: идентификатор, вложенная область, AreaRef

PropertySale: идентификатор, адрес, вложенная область

Ответ №1:

Я думаю, что потенциально ваш код может привести к выполнению многих операторов SQL. Это может быть дорогостоящим, особенно если вы получаете доступ к своей базе данных через TCP, что, вероятно, имеет место в случае с ODBC.

Вы должны искать способ уменьшить количество инструкций SQL, которые вы должны выполнить, и, следовательно, количество сетевых обходов, которые являются дорогостоящей операцией. Я не могу сразу разобраться с синтаксисом, но я думаю, что вы могли бы свести это к одному оператору SQL, выполнив оператор, который объединяет три таблицы, содержащие ваши данные.

Тогда вам нужно будет выполнить только один оператор, и нужная информация будет возвращена в одном наборе результатов. Это должно значительно сократить количество сетевых обходов, поэтому вы должны увидеть увеличение производительности. Сокращение сетевых обходов всегда следует учитывать при кодировании приложения для доступа к данным.

Вот ссылка на учебное пособие по синтаксису соединения SQL, которое может помочь вам начать.