Oracle XE возвращает ложное извлечение таблицы с 1 миллионом строк с использованием PHP - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать эталонный тест, используя PDO :: FETCH_LAZY для MySQL, Postgres, SQLServer и Oracle.

Итак (в Oracle) я создал эту таблицу:

  CREATE TABLE "TESTE" 
   (    "ID" NUMBER(*,0), 
    "DATETIME" DATE DEFAULT SYSDATE, 
    "CHANNEL" NUMBER(*,0) DEFAULT NULL, 
    "VALUE" FLOAT(5)
   )

И использовал эту процедуру:

CREATE OR REPLACE PROCEDURE generate_data
AS
BEGIN
   DECLARE
      v_i NUMBER(10,0) := 0; 
   BEGIN
      WHILE v_i < 1000000 
      LOOP 
         BEGIN
            INSERT INTO teste
              ( datetime, value, channel )
              VALUES ( to_date('2010-01-01', 'yyyy-mm-dd')+trunc(dbms_random.value(1,1000)), ROUND(dbms_random.value * 100, 2), 1 );
            v_i := v_i + 1 ;
         END;
      END LOOP;
   END;
END;

И попробовали этот код:

<?php

ini_set("memory_limit", "-1");
include 'connection_oracle.php';

$statement   = $pdo->query('SELECT * FROM teste');
$inicio = new DateTime('now');
print_mem();
$i = 0;
while($registro = $statement->fetch(PDO::FETCH_LAZY)){
    $i++;
}
$fim = new DateTime('now');
$diff = $fim->diff($inicio);

echo "total : {$diff->format("%H:%I:%S:%F")} i: {$i}";
print_mem();

function print_mem(){
   $mem_usage = memory_get_usage();
   $mem_peak = memory_get_peak_usage();
   echo 'The script is now using: <strong>' . formatBytes($mem_usage) . '</strong> of memory.<br>';
   echo 'Peak usage: <strong>' . formatBytes($mem_peak) . '</strong> of memory.<br><br>';
}

function formatBytes($size){
  $base = log($size) / log(1024);
  $suffix = array("B", "KB", "MB", "GB", "TB");
  $f_base = floor($base);
  return round(pow(1024, $base - floor($base)), 1) . $suffix[$f_base];
}

Очень хорошо работал на MySQL, Postgres и SQLServer, но Oracle возвращает только false или 0 для счетчика () с использованием PDO. Но по странным причинам хорошо работает на SQL Developer (верните 1000000 за счет ()).

Итак, есть ли какие-либо ограничения в использовании Oracle XE на PHP PDO? Есть ли другой способ обойти это или это ошибка pdo_oci?

...