oci_set_prefetch

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_set_prefetch — 쿼리에서 미리 가져올 행 수를 설정합니다.


설명

oci_set_prefetch(resource $statement, int $rows): bool

oci_execute()에 대한 성공적인 쿼리 호출 후 및 데이터베이스에 대한 각 후속 내부 페치 요청에 대해 Oracle 클라이언트 라이브러리가 버퍼링할 행 수를 설정합니다. 많은 수의 행을 반환하는 쿼리의 경우 기본 oci8.default_prefetch 값 이상으로 프리페치 수를 늘리면 성능이 크게 향상될 수 있습니다.

프리페치는 각 네트워크 요청에서 데이터베이스에서 둘 이상의 데이터 행을 반환하는 Oracle의 효율적인 방법입니다. 그러면 네트워크 및 CPU 활용도가 향상될 수 있습니다. 행의 버퍼링은 OCI8 내부에 있으며 OCI8 가져오기 기능의 동작은 프리페치 횟수에 관계없이 변경되지 않습니다. 예를 들어, oci_fetch_row()는 항상 하나의 행을 반환합니다. 프리페치 버퍼는 명령문별로 사용되며 재실행된 명령문이나 다른 연결에서 사용되지 않습니다.

oci_execute()를 호출하기 전에 oci_set_prefetch()를 호출하십시오.

조정 목표는 프리페치 값을 네트워크와 데이터베이스가 처리할 수 있는 적당한 크기로 설정하는 것입니다. 매우 많은 수의 행을 반환하는 쿼리의 경우 데이터베이스에서 여러 청크로 행을 검색하면(즉, 프리페치 값을 행 수보다 작게 설정) 전체 시스템 효율성이 더 좋을 수 있습니다. 이것은 PHP 스크립트가 현재 행 집합을 처리하는 동안 데이터베이스가 다른 사용자의 명령문을 처리할 수 있도록 합니다.

쿼리 프리페치는 Oracle 8i에서 도입되었습니다. REF CURSOR 프리페치는 Oracle 11gR2에 도입되었으며 PHP가 Oracle 11gR2(또는 그 이상) 클라이언트 라이브러리와 링크될 때 발생합니다. 중첩 커서 프리페치는 Oracle 11gR2에 도입되었으며 Oracle 클라이언트 라이브러리와 데이터베이스 모두 버전 11gR2 이상이어야 합니다.

쿼리에 LONG 또는 LOB 열이 포함된 경우 프리페치가 지원되지 않습니다. prefetch 값은 무시되고 prefetch가 지원되지 않는 모든 상황에서 single-row fetch가 사용됩니다.

Oracle Database 12c를 사용하는 경우 PHP에서 설정한 프리페치 값은 Oracle 클라이언트 oraaccess.xml 구성 파일에 의해 무시될 수 있습니다. 자세한 내용은 Oracle 설명서를 참조하십시오.


매개변수

statement
oci_parse()에 의해 생성되고 oci_execute()에 의해 실행되는 유효한 OCI8 문 식별자 또는 REF CURSOR 문 식별자.
rows
프리페치할 행 수 >= 0

반환 값

성공하면 true를, 실패하면 false를 반환합니다.


변경 로그

버전설명
PECL OCI8 1.4이 릴리스 이전에는 rows이 >= 1이어야 합니다.
PECL OCI8 1.3.4이 릴리스 이전에는 프리페치가 rows 행과 1024 * rows 바이트 중 작은 것으로 제한되었습니다. 이제 바이트 크기 제한이 제거되었습니다.

Examples

예제 #1 쿼리의 기본 프리페치 값 변경

                   
<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM myverybigtable');
oci_set_prefetch($stid, 300);  // Set before calling oci_execute()
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "    <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;")."</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>
                    
                  

예제 #2 REF CURSOR 페치에 대한 기본 프리페치 변경

                    
<?php
/*
  Create the PL/SQL stored procedure as:

  CREATE OR REPLACE PROCEDURE myproc(p1 OUT SYS_REFCURSOR) AS
  BEGIN
    OPEN p1 FOR SELECT * FROM all_objects WHERE ROWNUM < 5000;
  END;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'BEGIN myproc(:rc); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Change the prefetch before executing the cursor.
// REF CURSOR prefetching works when PHP is linked with Oracle 11gR2 or later Client libraries
oci_set_prefetch($refcur, 200);
oci_execute($refcur);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS)) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "    <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;")."</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($refcur);
oci_free_statement($stid);
oci_close($conn);

?>

                     
                  

PHP OCI8이 REF ​​CURSOR에서 가져온 다음 추가 처리를 위해 REF CURSOR를 두 번째 PL/SQL 프로시저로 다시 전달하는 경우 결과 집합에서 행이 "lost"되는 것을 방지하기 위해 REF CURSOR 프리페치 수를 0으로 설정합니다. 프리페치 값은 데이터베이스에 대한 각 OCI8 내부 요청에서 페치된 추가 행의 수이므로 0으로 설정하면 한 번에 한 행만 페치한다는 의미입니다.

예제 #3 REF CURSOR를 Oracle에 다시 전달할 때 프리페치 값 설정

                     
<?php

$conn = oci_connect('hr', 'welcome', 'localhost/orcl');

// get the REF CURSOR
$stid = oci_parse($conn, 'BEGIN myproc(:rc_out); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc_out', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Display two rows, but don't prefetch any extra rows otherwise
// those extra rows would not be passed back to myproc_use_rc().
// A prefetch value of 0 is allowed in PHP 5.3.2 and PECL OCI8 1.4
oci_set_prefetch($refcur, 0);
oci_execute($refcur);
$row = oci_fetch_array($refcur);
var_dump($row);
$row = oci_fetch_array($refcur);
var_dump($row);

// pass the REF CURSOR to myproc_use_rc() to do more data processing
// with the result set
$stid = oci_parse($conn, 'begin myproc_use_rc(:rc_in); end;');
oci_bind_by_name($stid, ':rc_in', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

?>

                      
                  

기타