2017-04-16 250 views

回答

1

Activerecord使用常規的SQL查詢來執行任何您希望它執行的活動。顯然,如果你使用activerecord來代表你的查詢,那麼它可能會選擇一種效率較低的方法來實現,比你想的要好。

這是針對當前所有ORM的標準配置。

但是,原始sql和通過activerecord發出的相同查詢將具有相同的性能影響,即使是明智的記憶。

1

如果你的問題是「在下面的例子中第二個需要明顯更多的內存?」。

實施例1:

$query = $this->db->query("SELECT `id`,`somefield` FROM `some_table` WHERE `id` = $id Order by `somefield` DESC"); 

實施例2:

$query = $this->db 
      ->select('id, somefield') 
      ->from('some_table') 
      ->where('id, $id) 
      ->order_by('somefield', 'DESC'); 
      ->get(); 

答案是存儲器差不顯著。還有一些額外的記憶,但在事物的計劃中,這並不是很多。

Active Record(自CI v3以來重命名查詢生成器)的目的是構建查詢語句字符串。活動記錄示例將執行更多代碼以組裝第一個示例中定義的相同語句。在它構造聲明之後,它實際上使得第一個例子所做的完全相同的調用。

如果正在加載Active Record類(由數據庫配置設置確定),則分配內存以保存該代碼,無論您是否使用該代碼。

使用Active Record確實需要更多的輸入。爲什麼如果查詢很容易用簡單的字符串表示?另一方面,在不同的查詢語句可能有條件需要(即不同的字段集合,附加或不同的「where」條件,備用排序順序等)的情況下,Active Record可以使您的生活更容易。例如。

$this->db 
    ->select('id, somefield') 
    ->from('some_table') 
    ->where('id, $id); 

if($need_another_where) 
{ 
    $this->db->where('other_field', $other); 
} 

if($reverse_sort) 
{ 
    $this->db->order_by('somefield', 'DESC'); 
} 
else 
{ 
    $this->db->order_by('somefield', 'ASC'); 
} 

$query = $this->db->get(); 

不可否認,通過有條件地連接字符串可以很容易地重新創建上述示例。但更復雜的情況可能很容易存在。

相關問題