這種寫法,對於Oracle資料庫來說,完全就是兩條不同的sql語句,
代碼:
select * from table_name where id = 1;
select * from table_name where id = 2;
每次查詢都要進行sql語句的執行解析,並且每個sql都會分配一個地區來存放sql解析後的二進位可執行代碼。試想,要是id不同的10萬個sql呢?Oracle就會分配10萬個sql地區來分別存放10萬個這樣的id不同的sql語句。對於一個資料庫驅動的Web網站這樣情況下,SGA開的再大,也會很快被耗盡share pool的,最後報一個ORA-4031錯誤。資料庫就串連不上了,只好重起。
正確的寫法應該是:
代碼:
$stmt = ociparse($conn,"select * from table_name where id = :id");
ocibindbyname($stmt,":id",&$id, 12);
這樣Oracle資料庫就知道你實際上用的都是同一條sql語句,會以這樣的形式:
select * from table_name where id = :1
解析執行後存放在sql地區裡面,當以後再有一樣的sql的時候,把參數替換一下,就立刻執行,不需要再解析sql了。既加快了sql執行速度,也不會佔有過多SGA的share pool。