If your are using Oracle's OCI libraries, on any project, which PHP does, you can use this limit.
I have done network level testing on the effect of this parameter. It does improved efficiency. Big Time.
Oracle uses SQL*Net as the transport mechanism for data between your connection and the database. That is why you must setup Oracle properly.
This parameter tells SQL*NET to Buffer more results. When SQL*NET (at the server) gets a request for data, it bundles up X rows (1,2,3,1000, etc) for transport. It sends the appropriate SQL*NET headers back to the client, Waits for an ACK then begins sending data in MTU sized chunks (ethernet is something like 1500 bytes and ATM's WANS are around 1000 bytes). The chunk size can also be tuned in SQL*NET, but with much less improvements.
TCP/IP then takes the data across the wire, breaking it up into multiple TCP/IP packets.
Once the exchange is done, the SQL*NET client sends an
ACK back to the SQL*NET Listener (the Oracle Server) and the transaction is complete.
Each round trip, SQL*NET looks up inside the server memory (UGA - user global area) to find the query results. It then grabs the rows necessary to send. If it is one row, versus 1000 rows. The process is the same.
There is much I could tell you on how the Database itself reacts. If you can significantly lessen the amount of round trips you are making... WOW.
For more info on Oracle OCI go to http://otn.oracle.comoci_set_prefetch
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
oci_set_prefetch
Референца за `function.oci-set-prefetch.php` со подобрена типографија и навигација.
oci_set_prefetch
Класата OCICollection
oci_set_prefetch — (PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
= NULL
Поставува број на редови што треба да се претходно преземат од прашањата oci_execute() Поставува број на редови што треба да се тампонираат од Oracle Client библиотеките по успешен повик на прашањето до oci8.default_prefetch value.
и за секое последователно внатрешно барање за преземање до базата на податоци. За прашања што враќаат голем број редови, перформансите може значително да се подобрат со зголемување на бројот на претходно преземени редови над стандардниот oci_fetch_row() Претходното преземање е ефикасен начин на Oracle да врати повеќе од еден ред податоци од базата на податоци во секое мрежно барање. Ова може да резултира со подобра искористеност на мрежата и процесорот. Тампонирањето на редовите е внатрешно за OCI8 и однесувањето на функциите за преземање на OCI8 останува непроменето без оглед на бројот на претходно преземени редови. На пример,
секогаш ќе врати еден ред. Тампонот за претходно преземање е по исказ и не се користи од повторно извршени искази или од други врски. oci_set_prefetch() пред да повикате oci_execute().
Повик
Цел на подесување е да се постави вредноста за претходно преземање на разумна големина за мрежата и базата на податоци да може да се справи. За прашања што враќаат многу голем број редови, целокупната ефикасност на системот може да биде подобра ако редовите се преземаат од базата на податоци во неколку делови (т.е. поставете ја вредноста за претходно преземање помала од бројот на редови). Ова му овозможува на базата на податоци да се справи со исказите на други корисници додека PHP скриптата ги обработува тековните редови.iПретходното преземање на прашања беше воведено во Oracle 8g. Претходното преземање на REF CURSOR беше воведено во Oracle 11gR2 и се случува кога PHP е поврзан со Oracle 11gR2 (или понова) Клиентски библиотеки. Претходното преземање на вгнездени курсори беше воведено во Oracle 11gR2 и бара и Oracle Клиентските библиотеки и базата на податоци да бидат верзија 11
R2 или поголема.
Претходното преземање не е поддржано кога прашањата содржат LONG или LOB колони. Вредноста за претходно преземање се игнорира и ќе се користат преземања на еден ред во сите ситуации кога претходното преземање не е поддржано.cКога се користи Oracle Database 12 oraaccess.xml , вредноста за претходно преземање поставена од PHP може да биде надмината од конфигурациската датотека на клиентот на Oracle. Погледнете ја документацијата на Oracle за повеќе детали.
Параметри
statement-
Валиден идентификатор на OCI8 исказ креиран од oci_parse() и извршен од oci_execute(), или
REF CURSORидентификатор на исказ. rows-
Бројот на редови што треба да се претходно преземат, >= 0
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.
Примери
Пример #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) : " ")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
oci_free_statement($stid);
oci_close($conn);
?>
Example #2 Changing the default prefetch for a REF CURSOR fetch
<?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) : " ")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
oci_free_statement($refcur);
oci_free_statement($stid);
oci_close($conn);
?>
If PHP OCI8 fetches from a REF CURSOR and then passes the REF CURSOR back to a second PL/SQL procedure for further processing, then set the REF CURSOR prefetch count to 0 Пример #2 Промена на стандардното преземање за преземање REF CURSOR 0 Ако PHP OCI8 презема од REF CURSOR и потоа го враќа REF CURSOR на втора PL/SQL процедура за понатамошна обработка, тогаш поставете го бројот на преземања на REF CURSOR на
за да избегнете „губење“ редови од множеството резултати. Вредноста на преземањето е бројот на дополнителни редови преземени во секое барање на OCI8 до базата на податоци, така што поставувањето на
<?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().
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);
?>