Perguntas Frequentes
Introdução
O ODBC (Open Database Connectivity - Conectividade a Banco de Dados Aberta) é uma especificação para uma API de banco de dados criada para permitir a comunicação de aplicações com bancos de dados, independentemente do SGBD (Sistema de Gerenciamento de Banco de Dados), da plataforma (sistema operacional) e da linguagem de programação.
O Power BI utiliza de drivers ODBC (específico para o SGBD utilizado) para carregar os dados das tabelas do DW (Data Warehouse) para o conjunto de dados dos relatórios.
O Problema
Por padrão, a comunicação entre o servidor de dados e o Power BI Service ("Power BI Online") ocorre uma única vez, mais precisamente quando o relatório é aberto, ocasião em que os dados são enviados em sua plenitude. Isso, tem a vantagem de reduzir o tráfego de dados, especialmente na comunicação entre o servidor de banco de dados (onde está o DW) e o servidor da Microsoft (Power BI Service), mas tem como desvantagem elevar de sobremaneira o consumo de memória RAM do servidor de dados. Caso a disponibilidade/quantidade de memória principal (RAM) seja reduzida, isso pode gerar alguns problemas, sendo o mais notável o erro HY001, isto é, a impossibilidade de enviar a carga de dados por falta de memória RAM quando na leitura das linhas de dados/registros (tuplas).
A Solução
O padrão ODBC prevê a possibilidade de determinar se os dados são enviados em lote único (a totalidade dos dados em uma única conexão) ou se os dados são enviados por meio de uma sucessão de pequenos lotes, ou seja, um determinado número de linhas por vez em várias conexões. Se por um lado o envio na forma de lote único onera o servidor de dados quanto ao uso de memória RAM, por outro lado, a utilização de uma sucessão de lotes onera a conexão, já que necessita que a cada novo lote seja efetuada uma conexão entre os servidores envolvidos. Além disso, obriga a utilização de um cache e um cursor para definir a posição de cada leitura.
No Windows, há um Gerenciador de Fontes de Dados ODBC por meio do qual, além de possibilitar definir o DSN (Data Source Name - Nome da Fonte de Dados) para uma conexão, também permite, entre outras coisas, definir se o envio dos dados será feito em lote único ou múltiplo. Por padrão, o tipo de envio é em lote único, ou seja, a opção de lotes múltiplos (Declare/Fetch) fica desmarcado.
Caso o erro HY001 ocorra, convém definir o modo de envio como lote múltiplo.
Como Funciona?
Quando a opção Use Declare/Fetch está selecionada, o driver do banco de dados automaticamente utiliza um cursor de fetch para lidar com instruções SELECT e mantém 100 linhas em cache. Isso traz como principal vantagem uma leitura de dados que não onera o servidor quanto ao uso da memória principal, já que não usa muita memória para armazenar todo o conjunto de dados. Quando desmarcado, os cursores não são utilizados e o driver recuperará todo o conjunto de dados o que pode ser problemático para tabelas muito grandes e é ineficiente quando pode comprometer a disponibilidade da memória principal do servidor de dados. No entanto, lida muito melhor com as atualizações de dados, uma vez que as tabelas não são mantidas abertas, como ocorre utilizando cursores.
Como Configurar?
Para definir o uso ou não de cursores, faça:1) Acesse o Gerenciador de Fontes de Dados ODBC;
2) Selecione a aba de DSN (DSN de Usuário ou DSN de Sistema) conveniente (para a qual foi cadastrado um DSN);
3) Selecione a fonte de dados para a qual deseja configurar o tipo de envio;
4) Clique no botão Configurar;
5) Clique no botão Datasource ("Fonte de Dados");
6) Habilite a opção Use Declare/Fetch.
Por padrão, o cursor trabalha com 100 tuplas por vez. Com efeito, o valor padrão do cache é 100. Pode-se mudar o tamanho dos lotes alterando o valor do cache.