Usar Cache de Tabela Externa para Melhorar o Desempenho de Tabelas Externas

O Cache de Tabela Externa no Oracle Autonomous Database permite armazenar em cache dados acessados com frequência de tabelas externas no seu banco de dados.

Observação

Só há suporte para o Cache de Tabela Externa no Oracle Database 23ai.

Sobre o Cache de Tabela Externa no Autonomous Database

Um cache de tabela externa é uma área de armazenamento no seu Autonomous Database que armazena os dados de uma tabela externa.

Os dados externos não são gerenciados pelo banco de dados; no entanto, você pode usar as tabelas externas para consultar dados fora do banco de dados. As consultas em tabelas externas não serão tão rápidas quanto as consultas em tabelas de banco de dados porque toda vez que você acessar os dados, eles precisarão ser extraídos dos arquivos externos armazenados no Object Store.

O recurso de cache de tabela externa permite armazenar em cache dados acessados com frequência de tabelas externas dentro do seu Autonomous Database, sem exigir modificações em seus aplicativos que acessam os dados, fornecendo assim acesso mais rápido a tabelas externas.

A seguir estão alguns dos benefícios de usar o cache de tabela externa:
  • Desempenho Aprimorado: As consultas são várias vezes mais rápidas para seus dados externos acessados com frequência, ideais para painéis, relatórios e ferramentas de análise que acessam os mesmos dados regularmente.

  • 100% Transparente: O mecanismo de armazenamento em cache é totalmente transparente; os aplicativos podem se beneficiar de uma velocidade aprimorada sem exigir alterações em suas consultas, painéis ou aplicativos.

  • Custos de Nuvem Menores: Em uma aplicação multicloud, o armazenamento em cache reduz a necessidade de repetidas recuperações de dados externos do armazenamento remoto, reduzindo assim as taxas de saída de dados associadas ao acesso a dados em regiões ou nuvens.

Você pode criar um cache de tabela externa para tabelas particionadas e não particionadas criadas nos seguintes tipos de arquivo:
  • Parquet

  • ORC

  • AVRO

  • Tabelas de Iceberg

Consulte Consultar Dados Externos para obter mais informações.

Pré-requisitos para Criar Cache de Tabela Externa

Lista os pré-requisitos para criar o cache de tabela externa.

  • Você deve ter o privilégio EXECUTE no pacote DBMS_EXT_TABLE_CACHE. Observe que você só pode criar um cache de tabela externa em seu próprio esquema e para as tabelas externas que você possui.

  • Você deve ter uma cota de espaço apropriada alocada para o seu esquema para garantir que haja capacidade de armazenamento suficiente para os dados do cache.

  • Você deve ter credenciais para acessar arquivos de tabela externa armazenados no Object Store. Não será necessário criar credenciais se você ativar credenciais do controlador de recursos para acessar o Oracle Cloud Infrastructure Object Store.

Criar e Gerenciar Cache de Tabela Externa no Autonomous Database

Usando o cache de tabela externa, você pode armazenar em cache os dados de tabelas externas dentro do banco de dados.

O cache de tabela externa é criado como um objeto de esquema no seu banco de dados, que recebe espaço físico semelhante ao armazenamento de tabelas e índices em arquivos de dados. Quando você cria um cache de tabela externa, uma nova tabela é criada no seu esquema, e quaisquer limites de cota de espaço definidos para o seu esquema também se aplicam ao cache de tabela externa.

Criar Cache de Tabela Externa

Execute DBMS_EXT_TABLE_CACHE.CREATE_CACHE para criar um cache de tabela externa.

Quando o cache é criado, ele é inicialmente vazio e ativado para preenchimento. O tamanho do cache aumenta a cada vez que um arquivo é adicionado, dependendo dos limites de cota de espaço definidos para o esquema, até atingir os limites atribuídos. Consulte Definir Preferências de Dimensionamento Opcionais para Cache de Tabela Externa para obter mais informações.

  1. Use DBMS_EXT_TABLE_CACHE.CREATE_CACHE para criar um cache de tabela externa para seu esquema. Por exemplo:
    BEGIN
        DBMS_EXT_TABLE_CACHE.CREATE_CACHE (      
          owner          => 'SALES',
          table_name     => 'STORE_SALES',
          partition_type => 'PATH');                                                                 
    END;                                                                 
    /
    

    Isso cria um cache para a tabela STORE_SALES no esquema SALES. O STORE_SALES é uma tabela externa que aponta para dados armazenados no Object Store.

    O parâmetro owner especifica o nome do esquema. Este exemplo cria um cache de tabela externa para o usuário SALES.

    O parâmetro partition_type especifica o método de particionamento a ser usado para o cache de tabela externa. Este exemplo faz a partição do cache usando a coluna FILE$PATH. O FILE$PATH é uma coluna invisível que especifica o texto do caminho do arquivo até o início do nome do objeto.

    Para obter mais informações, consulte:

    CREATE_CACHE Procedimento

    Colunas de Metadados da Tabela Externa

  2. Quando você cria um cache de tabela externa pela primeira vez, seus metadados são armazenados no dicionário de dados; no entanto, nenhum espaço é alocado para os dados do cache. Você pode consultar a exibição USER_EXTERNAL_TAB_CACHES para verificar a criação do cache.
    SELECT external_table_name, cached, disabled 
      FROM user_external_tab_caches;

    Consulte DBA_EXTERNAL_TAB_CACHES e USER_EXTERNAL_TAB_CACHES Views para obter mais informações.

    Use o procedimento DBMS_EXT_TABLE_CACHE.VALIDATE para validar um cache de tabela externa. Um erro será reportado se a tabela externa referenciada não for encontrada no banco de dados.

    Por exemplo:
    BEGIN
      DBMS_EXT_TABLE_CACHE.VALIDATE (
        owner         => 'SALES', 
        table_name    => 'STORE_SALES',
        raise_errors  => TRUE);
    END;
    /

    Consulte Procedimento de VALIDAÇÃO para obter mais informações.

Preencher Arquivos no Cache de Tabela Externa

Mostra exemplos para preencher arquivos no cache de tabela externa.

Depois de criar um cache, você pode preencher arquivos no cache. O preenchimento de arquivos carrega o conteúdo dos arquivos de tabela externa especificados no cache. Você pode optar por preencher todos os arquivos de uma tabela, uma porcentagem específica da tabela ou especificar uma condição de filtro para limitar os arquivos que deseja preencher. Por exemplo, você pode filtrar os arquivos com base em seus nomes ou em um intervalo de datas.

Observação

  • Dependendo da cota de espaço alocada para o esquema, o sistema Oracle tenta preencher arquivos no cache. Se o limite de cota atribuído for atingido, o sistema Oracle interromperá o preenchimento de arquivos, a menos que o espaço necessário seja alocado.

  • O cache da tabela externa não é atualizado automaticamente. Para atualizar o cache quando um arquivo no Object Store for modificado, preencha o arquivo novamente.

  • Quando um arquivo é excluído do Armazenamento de Objetos, os dados armazenados em cache correspondentes se tornam inválidos imediatamente e não podem ser recuperados.

Adicionar Tabela ao Cache de Tabela Externa

Use DBMS_EXT_TABLE_CACHE.ADD_TABLE para preencher uma tabela inteira ou uma determinada porcentagem da tabela externa no cache.

Exemplos

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES');
END;
/

Este exemplo tenta preencher a tabela STORE_SALES no cache, ignorando todos os arquivos existentes que já foram preenchidos.

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES',
    percent_files => 80);
END;
/

Este exemplo tenta preencher 80% da tabela STORE_SALES no cache, ignorando todos os arquivos existentes que já foram preenchidos.

O parâmetro percent_files é opcional; se você não especificar esse parâmetro, toda a tabela será preenchida no cache.

Consulte ADD_TABLE Procedures para obter mais informações.

Adicionar Arquivos ao Cache de Tabela Externa

Você pode usar os seguintes procedimentos para adicionar um ou mais arquivos ao cache de tabela externa:
  • ADD_FILE: para adicionar um único arquivo ao cache.

  • ADD_BY_LIKE: para adicionar um ou mais arquivos especificados com base nos filtros de caminho especificados.

  • ADD_LATEST_FILES: para adicionar um ou mais arquivos com base no intervalo de tempo especificado.

Exemplos

Use o procedimento DBMS_EXT_TABLE_CACHE.ADD_FILE para preencher um único arquivo no cache de tabela externa. Por exemplo:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_FILE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

Este exemplo preenche os dados do arquivo salesdata.parquet no cache.

Este exemplo ignora o preenchimento do arquivo no cache se o arquivo especificado existir no cache e não tiver sido modificado desde que o arquivo foi armazenado no cache pela última vez.

Consulte ADD_FILE Procedures para obter mais informações.

Use o procedimento DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE para preencher um ou mais arquivos no cache de tabela externa. Por exemplo:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

Este exemplo preenche dados dos arquivos salesdata.parquet e salesdata1.parquet no cache, ignorando todos os arquivos existentes que já foram preenchidos.

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data2.parquet"]',
    esc_char     => '#',
    force        => TRUE);
END;
/

Este exemplo preenche os arquivos sales_data1.parquet e sales_data2.parquet no cache.

Neste exemplo, o caractere '#' é definido como o caractere de escape. O caractere '_' após '#' é tratado como um sublinhado literal, não como um caractere curinga correspondente a qualquer caractere único.

Consulte ADD_BY_LIKE Procedures para obter mais informações.

Use o procedimento DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILES para preencher um ou mais arquivos com base na data da última modificação no cache da tabela externa. Por exemplo:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILES (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    since        => INTERVAL '7' DAY,
    max_files    => 5,
    force        => TRUE);
END;
/

O parâmetro since especifica o intervalo de tempo; somente arquivos modificados nos últimos sete (7) dias são elegíveis para serem preenchidos no cache.

O parâmetro max_files limita o número de arquivos que podem ser preenchidos no cache. Este exemplo preenche apenas 5 (cinco) arquivos.

O parâmetro force força os arquivos especificados a serem substituídos no cache, mesmo que os arquivos não tenham sido modificados.

Consulte ADD_LATEST_FILES Procedures para obter mais informações.

Consulte as seguintes views de dicionário de dados para listar os arquivos armazenados em cache no cache de tabelas externas:

Eliminar Arquivos do Cache de Tabela Externa

Mostra exemplos para eliminar arquivos do cache de tabela externa.

Você pode remover todos os arquivos do cache ou especificar condições de filtro para eliminar um ou mais arquivos do cache. Por exemplo, você pode filtrar os arquivos por seus nomes ou com base em um intervalo de tempo específico.

Limpar Cache de Tabela Externa

Use DBMS_EXT_TABLE_CACHE.CLEAR para eliminar todos os arquivos do cache de tabela externa. Por exemplo:

BEGIN
  DBMS_EXT_TABLE_CACHE.CLEAR (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES');
END;
/

Este exemplo elimina todos os arquivos do cache STORE_SALES e desaloca todo o espaço usado pelos arquivos removidos.

Consulte Procedimento CLEAR para obter mais informações.

Eliminar Arquivos do Cache de Tabela Externa

Você pode usar os seguintes procedimentos para eliminar um ou mais arquivos do cache de tabela externa:
  • DROP_FILE: para eliminar um único arquivo do cache.

  • DROP_BY_LIKE: para eliminar um ou mais arquivos do cache com base nos filtros de caminho especificados.

  • RETIRE_FILES: para eliminar um ou mais arquivos do cache com base no intervalo especificado.

Exemplos

Use DBMS_EXT_TABLE_CACHE.DROP_FILE para eliminar um arquivo do cache de tabela externa. Por exemplo:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_FILE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

Este exemplo elimina o arquivo salesdata.parquet do cache e desaloca todo o espaço usado pelo arquivo removido.

Consulte DROP_FILE Procedures para obter mais informações.

Use DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE para eliminar um ou mais arquivos com base no parâmetro path_filters. Por exemplo:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

Este exemplo elimina os arquivos salesdata.parquet e salesdata1.parquet do cache e desaloca todo o espaço usado pelos arquivos removidos.

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet"]'
);
END;
/

Este exemplo elimina os arquivos sales#_data1 e sales#_data2 do cache e desaloca todo o espaço usado pelos arquivos removidos.

Neste exemplo, o caractere '#' é definido como o caractere de escape. O caractere '_' após '#' é tratado como um sublinhado literal, não como um caractere curinga correspondente a qualquer caractere único.

Consulte DROP_BY_LIKE Procedures para obter mais informações.

Use DBMS_EXT_TABLE_CACHE.RETIRE_FILES para eliminar um ou mais arquivos com base no intervalo especificado. Por exemplo:

BEGIN
 DBMS_EXT_TABLE_CACHE.RETIRE_FILES (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    before       => INTERVAL '30' DAY);
END;
/

Este exemplo elimina arquivos com mais de trinta (30) dias do cache e desaloca todo o espaço usado pelos arquivos removidos.

Consulte RETIRE_FILES Procedures para obter mais informações.

Os exemplos acima removem um ou mais arquivos do cache enquanto mantêm o cache. Você pode carregar arquivos novamente no cache quando necessário. Consulte Preencher Arquivos no Cache de Tabela Externa para obter mais informações.

Desativar e Ativar Cache de Tabela Externa

Mostra exemplos para desativar e ativar o cache de tabela externa.

Execute DBMS_EXT_TABLE_CACHE.DISABLE para desativar o cache de tabela externa do banco de dados. A desativação de um cache não exclui dados do cache; em vez disso, o cache é marcado como DISABLED e o otimizador não pode usar o cache para regravações de consulta.

Exemplo

BEGIN
    DBMS_EXT_TABLE_CACHE.DISABLE (      
      owner          => 'SALES',
      table_name     => 'STORE_SALES');                                                                 
END;                                                                 
/

Este exemplo desativa o cache STORE_SALES.

Consulte Procedimento DISABLE para obter mais informações.

Depois de desativar um cache de tabela externa, use DBMS_EXT_TABLE_CACHE.ENABLE para ativar o cache.

Exemplo:
BEGIN
  DBMS_EXT_TABLE_CACHE.ENABLE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES'
 );
END;
/

Este exemplo ativa o cache STORE_SALES.

Consulte CAPACITAR Procedimento para obter mais informações.

Eliminar Cache de Tabela Externa

Mostra um exemplo para eliminar o cache da tabela externa.

Execute DBMS_EXT_TABLE_CACHE.DROP_CACHE para eliminar um cache de tabela externa. O procedimento DBMS_EXT_TABLE_CACHE.DROP_CACHE remove o cache de tabela externa especificado do banco de dados e libera o espaço de armazenamento associado ao cache.

Exemplo:

BEGIN
    DBMS_EXT_TABLE_CACHE.DROP_CACHE (      
      owner          => 'SALES',
      table_name     => 'STORE_SALES');                                                             
END;                                                                 
/

Este exemplo elimina o cache STORE_SALES do esquema SALES.

A eliminação de um cache remove seus metadados do dicionário de dados e exclui todos os dados armazenados no cache.

Consulte DROP_CACHE Procedures para obter mais informações.

Consulte a view USER_EXTERNAL_TAB_CACHES para verificar se o cache foi eliminado. Por exemplo:
SELECT external_table_name, cached
  FROM user_external_tab_caches;
Consulte DBA_EXTERNAL_TAB_CACHES e USER_EXTERNAL_TAB_CACHES Views para obter mais informações.

Exibir Informações do Cache da Tabela Externa

O Autonomous Database fornece views que permitem monitorar o cache de tabela externa.

Exibir Descrição
Views DBA_EXTERNAL_TAB_CACHES e USER_EXTERNAL_TAB_CACHES

Fornece informações sobre todos os caches de tabelas externas no banco de dados ou sobre os caches de tabelas externas de um usuário.

ALL_EXTERNAL_TAB_CACHE_LOCATIONS

Fornece informações sobre os arquivos no Cloud Storage que são acessíveis ao usuário atual e pertencem a tabelas externas em cache.

USER_EXTERNAL_TAB_CACHE_LOCATIONS

Fornece informações sobre os arquivos no armazenamento em nuvem que pertencem ao usuário atual e pertencem a tabelas externas em cache. Esta exibição não exibe a coluna OWNER.

Definir Preferências de Dimensionamento Opcionais para Cache de Tabela Externa

Você pode usar o procedimento DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY para definir preferências de dimensionamento e limites de cota de espaço no cache da tabela externa.

Por padrão, o cache de tabela externa é desativado para um usuário. Para ativar e criar o cache de tabela externa, use o procedimento DBMS_EXT_TABLE_CACHE.CREATE_CACHE. O cache é criado no seu esquema padrão e herda quaisquer limites de cota de espaço definidos para o seu esquema. No entanto, você também pode usar o procedimento DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY para definir cotas de espaço para o cache de tabela externa. Use os parâmetros PROPERTY_NAME e PROPERTY_VALUE do procedimento DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY para definir os limites de cota de espaço.

O parâmetro PROPERTY_NAME aceita valores MAX_CACHE_SIZE e MAX_CACHE_PERCENT. A propriedade MAX_CACHE_SIZE especifica o tamanho total do cache externo em bytes. A propriedade MAX_CACHE_PERCENT especifica o tamanho total do cache externo como uma porcentagem da cota do usuário especificado.

Antes de definir as propriedades de tamanho do cache, observe a seguinte ordem de precedência:
  • Quando MAX_CACHE_SIZE, MAX_CACHE_PERCENT e a cota de espaço são definidos, MAX_CACHE_PERCENT tem precedência sobre MAX_CACHE_SIZE.

  • Quando apenas MAX_CACHE_SIZE é definido e MAX_CACHE_PERCENT ou cota de espaço não é definida, MAX_CACHE_SIZE tem precedência.

  • Quando apenas a cota de espaço é definida e MAX_CACHE_SIZE e MAX_CACHE_PERCENT não são definidos, a cota de tamanho do cache assume como padrão 10% da cota total do esquema.

  • Quando MAX_CACHE_SIZE, MAX_CACHE_PERCENT ou a cota de espaço não estiver definida, a cota de espaço no cache assumirá como padrão UNLIMITED.

Exemplos

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    property_name  => 'MAX_CACHE_PERCENT',          
    property_value => 50,                   
    owner          => 'SALES');                                                                
END;                                                                 
/

Este exemplo define a preferência de armazenamento em cache como MAX_CACHE_PERCENT para o esquema SALES.

O property_value é 50%, o que especifica que a cota de espaço no cache para o esquema SALES é no máximo 50% da cota de espaço total definida para SALES.

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    owner          => 'SALES',   
    property_name  => 'MAX_CACHE_SIZE',          
    property_value => 5368709120);                                                                
END;                                                                 
/

Este exemplo define a preferência de armazenamento em cache como MAX_CACHE_SIZE para o esquema SALES.

O property_value é 5368709120, que especifica que o tamanho máximo do cache para o esquema SALES é de até 5 GB.

Consulte SET_USER_PROPERTY Procedure e CREATE_CACHE Procedure para obter mais informações.

Use DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTY para recuperar as propriedades de tamanho do cache.

Exemplo:

SET SERVEROUTPUT ON
    DECLARE
    max_cache_sz NUMBER,
    BEGIN
    max_cache_sz := DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTY (
        property_name       => 'MAX_CACHE_SIZE',         
        owner               => 'SALES');                                                                
END;                                                                 
/

Consulte Função GET_USER_PROPERTY para obter mais informações.

Observações do Cache da Tabela Externa

Lista observações e restrições importantes sobre o uso do cache de tabela externa em um Autonomous Database.

  • Você só pode criar um cache de tabela externa em seu próprio esquema e para as tabelas externas que você possui.

  • Um cache de tabela externa só pode conter arquivos de uma única tabela externa.

  • Você não pode conceder privilégios em um cache de tabela externa e só pode acessar dados do cache de tabela externa que você possui.

  • Quando um arquivo é excluído do Armazenamento de Objetos, os dados correspondentes no cache são sinalizados como inválidos e não podem ser acessados.