Até este momento criamos um ambiente que possibilitasse a nossa interação com o banco de dados, neste post conheceremos 5 maneiras de incluir dados no SQL Server 2017 ou no SQL Azure.
Se você chegou agora, veja os posts anteriores onde configuramos o SQL no Azure e configuramos o SQL Server 2017 em uma máquina virtual que tem o sistema operacional Ubuntu.
Post 1 – Você conhece o SQL Server 2017?
Post 2 – SQL Server 2017 – Termos importantes e Restore
O assunto desta semana é a inclusão de dados no SQL Server. Este assunto é bem bacana, não é complicado, mas envolve algumas decisões importantes.
Análise prévia
Quando você começa a construir ou vai fazer manutenção em um sistema você precisa saber qual é o tipo de operação predominante. Em outras palavras: os dados serão muito mais consultados, ou muito mais incluídos ou muito mais alterados?
Esta pergunta é importante para que você:
1 – Modele corretamente seu banco de dados
Um banco de dados que tem mais inclusões e alterações tende a ser mais normalizado, por que desta forma a integridade dos dados é mantida. Por exemplo: Você possui uma tabela com o endereço do seu cliente. Uma das colunas é a sigla do estado. Supondo que o estado do Distrito Federal mudou de nome. Você precisará alterar todas as linhas cuja sigla do estado tenha o valor Distrito Federal, o que pode ser arriscado. Seria mais fácil e seguro se existisse uma tabela de estado, relacionada com a tabela de clientes. Porque neste caso bastaria alterar a tabela de estados (um único lugar) para que a alteração fosse refletida na tabela de clientes.
2 – Uso de índices
Índices são usados para acelerar consultas. Se a sua tabela tem muitos inserts e updates um índice pode causar impactos negativos no desempenho da sua aplicação, porque a cada operação a engine do banco de dados além de inserir o dado, precisa inserir a informação no índice. Não seja radical, mas use com cuidado!
3- Utilize os recursos certos!!!
No dia 23/01/2018 fiz uma palestra na Microsoft falando sobre os novos recursos do SQL Server 2017 para melhorar o desempenho das aplicações. Faça o download da apresentação e saiba mais detalhes de alguns itens que vamos conhecer neste tópico.
O SQL Server 2017 possui recursos maravilhosos para que sua aplicação seja a mais rápida e sempre disponível. Vou listar duas opções que são úteis caso a sua aplicação tenha muitos inserts e muitas consultas (cenário mais comum), e precise ser rápida em ambos os casos:
Column store index
O columnstore index é um padrão para armazenar e consultar grandes tabelas (milhões e milhões de registros). Ele usa armazenamento de dados baseado em colunas, e se comparado com o armazenamento tradicional pode alcançar um desempenho até 10 vezes maior, além de compactar os dados, minimizando o uso de recursos.
As operações de inclusão, alteração e exclusão que são caras para os índices normais, não são para este tipo de índice, por isso use-o se:
- a sua aplicação faz muitos inserts;
- a tabela tem milhões de registros;
- você precisa análises em tempo real;
- você faz queries complexas com agregações (por exemplo);
Para saber mais acesse a documentação oficial .
In memory OLTP
O tempo de acesso para a memória de um dispositivo é muito menor que o tempo de acesso ao disco. Por isso a possibilidade de armazenar uma tabela em memória é fantástica!
Como SQL Server 2017, é possível criar uma tabela (com índices) e mantê-la em memória. A única limitação é a quantidade de memória disponível no seu servidor.
Para acessar as tabelas em memória, você pode escrever o seu comando INSERT ou criar um módulo compilado nativamente. Mas o que é isso? Um conjunto de instruções T-SQL que são compiladas para código de máquina e armazenadas como DLLs nativas, habilitando o acesso a dados mais rápido e execução de consultas de forma muito mais eficiente que o T-SQL tradicional.
Cabe aqui destacar que os módulos com compilação nativa só podem fazer referência às tabelas em memória e não podem fazer referência às tabelas baseadas em disco.
Saiba mais acessando a documentação oficial
Nosso Exemplo
Vamos criar uma tabela em nosso banco de dados para testar as inclusões. O comando para a criação é:
CREATE TABLE Sales.MyOrders ( orderid INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_MyOrders_orderid PRIMARY KEY, custid INT NOT NULL, empid INT NOT NULL, orderdate DATE NOT NULL, shipcountry NVARCHAR(15) NOT NULL, freight MONEY NOT NULL , updatedate DATE NULL);
E o comando INSERT?
Para inserir os dados em uma tabela temos algumas possibilidade, e todas usam o comando INSERT.
O comando insert (mesmo com suas variações) diz:
Insira na tabela ABC, nas colunas x, y,z os valores 1, 2,3. Traduzindo para o T-SQL: INSERT INTO ABC (x,y,z) VALUES (1,2,3)
Simples assim!!!
1 – Inserindo valores
Importante lembrar… Colunas identity são preenchidas automaticamente pelo SQL e colunas nulas podem não fazer parte do comando de inclusão. Observe que a coluna updatedate não fará parte dos nossos comandos de inclusão.
Seguindo a nossa “fórmula” INSERT INTO ABC (x,y,z) VALUES (1,2,3) , o comando para inclusão de dados na tabela Sales.MyOrders é:
INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight) VALUES(2, 19, '20170620', N'USA', 30.00);
2 – Inserindo valores em coluna com a propriedade identity
Agora imagine que você precise manualmente inserir um valor na coluna orderid. Neste caso você precisa desabilitar a propriedade identity da tabela, fazer a inclusão e depois habilitar o identity movamente.
SET IDENTITY_INSERT Sales.MyOrders ON INSERT INTO Sales.MyOrders(orderid , custid, empid, shipcountry, freight) VALUES(999, 3, 11, N'USA', 10.00); SET IDENTITY_INSERT Sales.MyOrders OFF
3 – Inserindo múltiplas colunas
É possível inserir várias linhas usando um único comando insert. Veja em nosso exemplo, onde iremos inserir 3 linhas usando o mesmo comando. Posso dizer a grosso modo, que cada par “()” é uma linha que será inserida.
INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight) VALUES (2, 11, '20170620', N'USA', 50.00), (5, 13, '20170620', N'USA', 40.00), (7, 17, '20170620', N'USA', 45.00);
4 – INSERT com SELECT
Ainda não conversamos sobre o comando SELECT, mas vou usá-lo em um exemplo para inclusão de dados.
Basicamente o comando SELECT seleciona dados de uma tabela, desde que eles obedeçam a um critério.
É possível selecionar os valores de algumas colunas e inserir em outra. Tomando cuidado com a ordem das colunas e os tipos. Por exemplo:
INSERT INTO Sales.MyOrders (custid, empid, orderdate, shipcountry, freight)
SELECT CustomerID, SalesPersonID, orderdate, N'USA' as shipcountry, freight FROM Sales.SalesOrderHeader WHERE SalesPersonID is not NULL;
Veja que a coluna CustomerID da tabela Sales.SalesOrderHeader será incluída na coluna custid da tabela Sales.MyOrders.
5 – SELECT com INSERT
Parece que eu errei no título… Mas não errei.
Uma outra possibilidade de inserir os dados de uma consulta em uma determinada tabela é a clausula INTO do comando SELECT. A diferença é que a claúsula INTO cria uma nova tabela, cuja estrutura é a mesma do resultado da consulta.
DROP TABLE IF EXISTS Sales.MyOrders;
SELECT CustomerID, SalesPersonID, orderdate, N'USA' as shipcountry, freight INTO Sales.MyOrders FROM Sales.SalesOrderHeader WHERE SalesPersonID is not NULL;
Conclusão
Esta semana começamos a manipular dados. Execute os comandos no SQL Server 2017 e no SQL no Azure… Depois me conta se teve alguma dificuldade, ou se existe alguma diferença nos comandos.
Os scripts usados hoje estão disponíveis no GitHub
Entenda o comando, e será fácil entender o código T-SQL. Teste, pergunte, verifique, leia a documentação oficial, essa é a estrada para o sucesso!
Comentário importante
O conteúdo deste post está de acordo com o Skill 1.4 do material oficial para certificação 70-461. Foi de lá que eu tirei os exemplos 🙂
* Conjunto de instruções Transact-SQL que são executadas dentro do banco de dados. Adiantando as cenas dos próximos capítulos, é uma boa prática não escrever seus comandos dentro do código da sua aplicação, a recomendação é sempre criar stored procedures.