Boas práticas com CodeIgniter 3 e BD Oracle

No CodeIgniter 3, você pode aplicar essas boas práticas ao trabalhar com o banco de dados Oracle usando a biblioteca query builder ou db->query(). Vou te mostrar como fazer isso.


1. Paginação para evitar sobrecarga de memória

No CodeIgniter 3, você pode usar limit() e offset() para buscar os registros em partes.

$limite = 100; // Quantidade de registros por página
$offset = $this->uri->segment(3, 0); // Pega o valor da URL (ex: /controller/método/100)

$this->db->limit($limite, $offset);
$query = $this->db->get('sua_tabela'); // Executa a consulta
$resultado = $query->result_array();

Isso evita carregar um grande volume de dados de uma vez.


2. Usar fetch() ao invés de fetchAll()

O CodeIgniter já trabalha de forma otimizada, mas se precisar evitar carregar todos os registros na memória, use result() ou result_array() para iterar diretamente no loop:

$query = $this->db->query("SELECT * FROM sua_tabela");

foreach ($query->result() as $row) {
    // Processa cada linha sem sobrecarregar a memória
}

Ou, para evitar objetos e trabalhar com arrays:

$query = $this->db->query("SELECT * FROM sua_tabela");

foreach ($query->result_array() as $row) {
    // Processa cada linha em formato de array
}

3. Processar os dados em partes com array_chunk()

Se você já carregou um grande conjunto de dados, pode dividir os dados para processar em lotes menores:

$query = $this->db->get('sua_tabela');
$dados = $query->result_array();

$dadosDivididos = array_chunk($dados, 100); // Divide em blocos de 100 registros

foreach ($dadosDivididos as $chunk) {
    foreach ($chunk as $item) {
        // Processa cada item dentro do bloco
    }
}

4. Otimizar consultas SQL e índices

Se sua consulta for complexa, você pode otimizar com índices adequados e usar EXPLAIN PLAN no Oracle para analisar a performance.

Para consultas específicas no CodeIgniter:

$this->db->select('coluna1, coluna2'); // Pegue apenas as colunas necessárias
$this->db->where('status', 'ativo'); // Filtre os dados para evitar trazer registros desnecessários
$this->db->limit(100); // Limite de registros
$query = $this->db->get('sua_tabela');

5. Ajustes de memória e tempo de execução

Se o processamento for pesado, você pode aumentar os limites no PHP dentro do CodeIgniter:

ini_set('memory_limit', '512M'); // Aumenta a memória disponível
set_time_limit(0); // Evita que o script pare por tempo de execução

Caso esteja dentro de um controller:

public function processar_dados() {
    ini_set('memory_limit', '512M');
    set_time_limit(0);

    // Código aqui...
}

6. Evitar loops infinitos e adicionar logs

Se seu código estiver travando, pode ser um loop infinito. Adicione logs para entender onde o problema ocorre:

foreach ($query->result_array() as $row) {
    log_message('debug', 'Processando ID: ' . $row['id']);
}

Isso ajuda a depurar possíveis travamentos.


Conclusão

No CodeIgniter 3, as melhores práticas são:
Usar limit() e offset() para buscar dados em partes.
Usar result() ou fetch() para evitar carregar tudo na memória.
Quebrar os dados com array_chunk() se necessário.
Otimizar consultas SQL pegando apenas os dados necessários.
Ajustar memory_limit e set_time_limit(0) para grandes volumes de dados.

Se precisar de um exemplo mais específico para seu caso, me avise! 🚀