Skip to content

Commit 7e8b5cf

Browse files
committed
[ENHANCEMENT] Performance tweaking with buffered query cursor - not be applied on heavy queries (memory issues)
1 parent 64a7b90 commit 7e8b5cf

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

lib/addon/creole/drivers/sfDebugConnection.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,35 @@ public function executeQuery($sql, $fetchmode = null)
178178
return $retval;
179179
}
180180

181+
/**
182+
* @see Connection::executeQuery()
183+
*/
184+
public function executeQueryBuffered($sql, $fetchmode = null)
185+
{
186+
$this->lastExecutedQuery = $sql;
187+
$this->numQueriesExecuted++;
188+
189+
$elapsedTime = 0;
190+
if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
191+
{
192+
$sqlTimer = sfTimerManager::getTimer('Database');
193+
$timer = new sfTimer();
194+
}
195+
196+
$retval = $this->childConnection->executeQueryBuffered($sql, $fetchmode);
197+
198+
if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
199+
{
200+
$sqlTimer->addTime();
201+
$elapsedTime = $timer->getElapsedTime();
202+
}
203+
204+
$this->log(sprintf("{sfCreole} executeQuery(): [%.2f ms] %s", $elapsedTime * 1000, $sql));
205+
206+
return $retval;
207+
}
208+
209+
181210
/**
182211
* @see Connection::executeUpdate()
183212
**/

lib/vendor/creole/drivers/mssqlsrv/MSSQLSRVConnection.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,29 @@ function executeQuery($sql, $fetchmode = null)
168168
return new MSSQLSRVResultSet($this, $result, $fetchmode);
169169
}
170170

171+
/**
172+
* @see Connection::executeQuery()
173+
*/
174+
function executeQueryBuffered($sql, $fetchmode = null)
175+
{
176+
$this->lastQuery = $sql;
177+
178+
$result = sqlsrv_query($this->dblink, $sql, null, array("Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED));
179+
if($result === false)
180+
{
181+
throw new SQLException('Could not execute query: ' . $sql, $this->sqlError());
182+
}
183+
184+
// get first results with has fields
185+
$numfields = sqlsrv_num_fields( $result );
186+
while(($numfields == false)&&(sqlsrv_num_fields( $result )))
187+
{
188+
$numfields = sqlsrv_fetch_array( $result );
189+
}
190+
191+
return new MSSQLSRVResultSet($this, $result, $fetchmode);
192+
}
193+
171194
/**
172195
* @see Connection::executeUpdate()
173196
*/

lib/vendor/creole/drivers/mssqlsrv/MSSQLSRVPreparedStatement.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,18 @@ class MSSQLSRVPreparedStatement extends PreparedStatementCommon implements Prepa
3333

3434
/**
3535
* @inheritdoc
36-
*
36+
*
3737
*/
3838
public function __construct(Connection $conn, $sql)
3939
{
4040
if (false !== stripos($sql, 'insert into'))
4141
{
4242
$sql .= '; SELECT SCOPE_IDENTITY() AS ID';
4343
}
44-
44+
4545
parent::__construct($conn, $sql);
4646
}
47-
47+
4848
/**
4949
* Add quotes using str_replace.
5050
* This is not as thorough as MySQL.
@@ -90,7 +90,14 @@ public function executeQuery($p1 = null, $fetchmode = null)
9090
}
9191
}
9292

93-
$this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
93+
if($this->limit)
94+
{
95+
$this->resultSet = $this->conn->executeQueryBuffered($sql, $fetchmode);
96+
}
97+
else
98+
{
99+
$this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
100+
}
94101

95102
if(!$offsetBefore)
96103
{

0 commit comments

Comments
 (0)