2017-08-09 143 views
0

我在我的Web應用程序中有很多查詢,並且注意到性能不像我認爲的那樣。所以我刪除了參數化變量,查詢運行速度更快。使用參數化查詢緩慢SQLSRV PDO查詢性能

$conn = new PDO("sqlsrv:Server=myserver;Database=mydb; MultipleActiveResultSets=false", "user", "pw"); 
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$getData_query = $conn->prepare("select several_columns 
    from myTable 
    where severalstatements = severalstatements 
    and this = :that 
"); 
$getData_query->bindValue(':that', 'somestring'); 
$getData_query->execute(); 

or 

$getData_query = $conn->prepare("select several_columns 
    from myTable 
    where severalstatements = severalstatements 
    and this = :that 
"); 
$getData_query->execute(array('that'=>'somestring')); 

服務器正在運行PHP7和SQLServer 2016年,使用PDO_SQLSRV版本4.0.8.0

如果我運行上面的兩種以上的查詢,它需要1.15秒的平均運行。 如果我刪除了參數部分,只是使用

and this = 'somestring' 

查詢在0.110秒運行,速度更快!

我在做什麼錯?爲什麼參數化方法要慢得多?

回答

0

那麼你試圖做的是不正確的。

您需要使用bindParam,第二條語句你正在試圖綁定this當它應該是that

$conn = new PDO("sqlsrv:Server=myserver;Database=mydb; MultipleActiveResultSets=false", "user", "pw"); 
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$getData_query = $conn->prepare("select several_columns 
    from myTable 
    where severalstatements = severalstatements 
    and this = :that 
"); 
$getData_query->bindParam(':that', 'somestring'); //this line changed 
$getData_query->execute(); 

or 

$getData_query = $conn->prepare("select several_columns 
    from myTable 
    where severalstatements = severalstatements 
    and this = :that 
"); 
$getData_query->execute(array('that'=>'somestring')); // this line changed 
+0

謝謝你糾正我的代碼。無論如何,這只是一個例子。 我剛剛嘗試bindParam方法,它仍然有效,但仍然是4倍慢。 是否有任何理由爲什麼我的參數化查詢會實際運行速度較慢? –

+0

@Bill_VA你需要發佈你的整個查詢不僅僅是一個樣本,看看實際發生的情況 – cmorrissey

+0

我儘可能地更新了查詢。沒有什麼奇特的,只是相當簡單的查詢,需要5-8倍的時間來運行時,我參數化。 –