#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, которое может помочь вам начать.