Postagens

Dica de performance: Eliminando cursor com Window Functions + top 1 with ties

Imagem
 Olá  pessoal, tudo bem? Hoje gostaria de dar uma dica bem legal!! Muitos de vocês já devem saber que cursor na maioria das vezes é um grande vilão de performance no SQL-SERVER, isso porque o SQL não foi feito para processamento linha a linha e sim para um processamento em lote, vamos pensar SET-BASED! Hoje estarei mostrando para vocês um caso muito comum do dia dia. Vamos ao cenários: Precisamos pegar a última compra do cliente! Simples assim. Temos a tabela  cliente_tb, que guarda os dados do cliente e a tabela   venda_tb que guarda os dados da venda, basicamente um cliente pode fazer N  compras e nós precisamos pegar a ultima. Segue cursor que vejo na maioria dos casos: drop table if exists #aux create table #aux ( id_cliente int  ,nome           varchar(250) ,dt_venda datetime  ) DECLARE @id_cliente int -- Cursor para percorrer os registros DECLARE cursor1 CURSOR FOR select id_cliente from cliente_tb --Abrind...

Window Function: SUM()

Imagem
  Olá friends, espero que estejam todos bem, a hora de nos encontrarmos nos eventos da comunidade esta chegando, que alegria dia 10 e 11 de dezembro podemos nos encontrar no treinamento da lenda do tuning, Fabiano Amorim. Bora nessa? Bem, hoje gostaria de trazer a função SUM de forma diferente, que talvez algumas pessoas ainda não conheçam, podemos utilizar a função SUM como uma window Functions e acreditem isso é muito útil. Vamos ao cenário: Temos um banco de dados fictício de contas bancarias, essas contas recebem transações, saques, depósitos e transferências, imagine que gostaríamos de puxar a tela de extrato e verificar como estava o saldo do dia em determinada data? Um excelente cenário para utilizar a window functions SUM(). Temos essa tabela e precisamos fazer uma conta acumulativa, ou seja, temos que pegar linha a linha e somar com a soma acumulada das linhas anteriores, parece complexo, mas não é, vou primeiro mostrar como quero que a conta seja feita. Abaixo explico a s...

É possível utilizar AG com versões diferentes de SQL? (Passo a passo de como montar um AG básico)

Imagem
 Olá pessoal, hoje estou trazendo um blog de cara nova e um novo tipo de postagem, geralmente eu faço postagens sobre T-SQL que é uma linguagem que eu amo, mas hoje gostaria de trazer algum diferente. Hoje irei falar sobre SQL  AlwaysOn AG(availability group), eu não irei entrar muito afundo nesse assunto, pois ele renderia uma série de posts, nesse post estarei demonstrando como criar um AG básico para fins de estudo, mas nada impede de você usar esses passos para começar a pensar em uma solução de HA/DR para sua empresa. Antes de responder a pergunta desse post, vamos criar o ambiente: Primeiro é necessário ter um ambiente em cluster(WSFCI), o que não daria tempo de demonstrar nesse post, então irei deixar uma dica de livro, onde existe um passo a passo para criar um ambiente de alta disponibilidade com AlwaysON FCI. Melhor livro de FCI em pt-br "SQL SERVER 2014 -ALTA DISPONIBILIDADE NA PRÁTICA COM ALWAYSON FAILOVER CLUSTER INSTANCES", deixarei um link no final do artigo de...

Realizando um UNPIVOT separando colunas com ";" com cross apply ou string_Agg.

Imagem
Hello my friends!! Como estão? Espero sempre que estejam muito bem.  Hoje gostaria de dar uma dica para vocês que pode ajudar bastante. Esses dias estava trabalhando quando o head da área me manda um dúvida que surgiu em dos grupos que ele estar de SQL, a primeira pergunta que fiz, foi "Nossa, que grupo técnico de SQL é esse? Que não estou", my bad :( rs.  Bem a dúvida era como fazer um "UNPIVOT"  no SQL? Bem existe o comando Pivot /Unpivot, mas hoje gostaria de mostrar formas diferentes de fazer o UNPIVOT. O cliente tinha uma tabela com as seguintes informações: Ele queria agrupar  campo "nota" e colocar o campo "Produto" em uma linha separando esses produtos com ";" Assim: Para fazer isso de forma bem simples, podemos usar o string_agg, uma função excelente de concatenação e agregação do SQL, mas cuidado, pois só estar disponível a partir do SQL 2017 Segue código: ---Opção  1, sql 2017 +  select nota,STRING_AGG(produto,';') as...

Window Functions: Lead e lag

Imagem
 Olá pessoal, espero que estejam todos bem! Espero logo encontrar vocês por ai nos eventos da comunidade técnica, alias que saudade de aglomerar nos eventos de SQL e conversar com pessoas que valem a pena ouvir, ouvir e ouvir.  Pessoal, hoje gostaria de compartilhar com vocês duas funções muito interessantes que foram introduzidas a partir do SQL 2012, essas funções permitiram que os desenvolvedores T-SQL escrevessem menos códigos e tivessem resultados de maneira mais performáticas, estamos falando da função lead e lag do SQL. Bom, irei explicar de forma mais detalhada e resumida cada função.       R esumidamente essas funções são para verificar a linha anterior e a linha posterior da linha analisada, KEEP CALM, irei explicar em detalhes, primeiro irei falar sobre  a função lead. Função lag: Sintaxe lead e lag: LEAD/LAG ( scalar_expression [ ,offset ] , [ default ] )        OVER ( [ partition_by_clause ] order_by_clause ) scalar_expressi...

Procedure para auxiliar no processo de debug do processo.

Imagem
 Olá pessoal, espero que estejam todos bem! Estive um pouco sumido aqui do blog, pois estava focando meu tempo em outros assuntos, mas hoje gostaria de compartilhar uma rotina que fiz quando me deparei em uma situação onde precisava entender porque um processo não estava funcionando corretamente!  Acredito que em T.I toda solução é feita para curar uma dor, e essa solução não foi diferente. Vamos ao cenário: Um cliente procurou a consultoria onde trabalho, para auxiliá-los a identificar porque um processo não estava funcionando corretamente, basicamente eles tinham uma tabela de origem e precisavam que esses dados fossem para a  tabela de destino em outra base, até ai sem problemas, certo? Errado! Imagine você ter que achar esse gap em um processo que você não conhece e para dificultar ainda mais (só ficou mais interessante) existiam 8 bases no banco, o cliente não soube nos informou muita coisa sobre o processo, só que existia uma tabela de origem que precisava passar es...

Procedure que cria script de merge dinamico com apenas alguns parametros.

Imagem
 Olá pessoal, espero que estejam todos bem! Hoje gostaria de compartilhar uma procedure que fiz para automatizar o processo de merge que volta e meia aparece para fazer. O script é bem simples e versátil, nele você pode passar os seguintes parâmetros: @table_source            = Tabela de origem @table_target             =  Tabela destino @cols_key                 = Aqui você pode passar as colunas que são chaves para o merge (caso seja uma chave composta basta passar as colunas separadas por VIRGULA) Ex: 'COL1,COL2,COL3'   @schema_table_source    = Passar o schema da tabela origem por padrão o schema é dbo @schema_table_target     = Passar o schema da tabela destino por padrão o schema é dbo @name_base_table_source  = Nome da base da tabela origem @name_base_table_target  = Nome da base da tabela destino @usar_pk_como_chave...