Fala pessoal, bom dia!

Estou iniciando uma série de vídeos onde exploraremos o SQL SERVER no Linux. Estou chamando esta série de Stairway do Heaven (sem copiar o Vitor que já criou a sensacional Highway to Hell, sobre Extended Events).

Neste vídeo inicial veremos o passo-a-passo de como instalar o CentOS v7 no Hyper-V.

Por que você está fazendo uma série sobre SQL SERVER no Linux?

  • A Microsoft está investindo pesado no Linux e trouxe seu melhor produto para o Sistema Operacional, você não quer ficar de fora né?

Mas os clientes já estão usando?

  • Em produção ainda não, mas é sempre bom estar preparado!

Por que CENTOS?

  • Preferência e custo, é absolutamente gratuita e baseada no RED HAD, a distro que eu mais estou familiarizado, fique à vontade para escolher outra!

Por que Hyper-V?

  • Porque é gratuito (Custo zero) e já vem com o Windows (8+).

É isso pessoal! Uma ótima semana e qualquer coisa deixe um comentário!

Abraços!

 

Marcelo

 

 

Fala pessoal, bom dia!

Realizaremos o último encontro do SQLMANIACS de 2017 na sede da Microsoft em São Paulo.

O encontro acontecerá no dia 18/12/17 (Segunda-feira) à partir das 19:00.

Para maiores detalhes e inscrições acesse: https://www.sympla.com.br/ultimo-encontro-do-sql-maniacs-de-2017__225518

E mais um ano chega ao fim! Muito SQL SERVER, muitos problemas doidos, muito trabalho e também muito conhecimento!

Aguardem novidades em 2018!

 

Grande Abraço!

Marcelo

 

Fala pessoal, boa tarde.

Antes de qualquer coisa, agradeço ao Vitor Fava pela ideia e inspiração para esse vídeo!

Neste video mostro pra vocês o passo a passo para instalar um Windows Server 2016 Core – Sem interface Gráfica – e configurar nele um Controlador de Domínio (DC ou AD Server).

Para isso utilizei o  Windows Server 2016 Evaluation Edition (Expira em 180 dias) sobre o VMWARE Workstation.

Aqui estão as referências que usei:

https://blogs.technet.microsoft.com/chadcox/2016/10/25/chads-quick-notes-installing-a-domain-controller-with-server-2016-core/

https://technet.microsoft.com/en-us/library/hh831453(v=ws.11).aspx

https://www.microsoft.com/en-us/download/details.aspx?id=45520

E os passos que executei via Powershell:

#Renomeie o servidor:

Rename-computer -newname 2016-DC01

#Altere o endereço IP, coloque de acordo com o seu ambiente:

$ipaddress = "10.0.0.2"
$dnsaddress = "127.0.0.1"
New-NetIPAddress -InterfaceAlias Ethernet -IPAddress $ipaddress -AddressFamily IPv4 -PrefixLength 24
Set-DnsClientServerAddress -InterfaceAlias Ethernet1 -ServerAddresses $dnsaddress

#Reinicie o Servidor:
Restart-Computer

#Verifique o timezone e se necessário troque-o:
get-timezone
Set-TimeZone -Id "UTC-02"

#Instale a Feature de AD:
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools

#Crie uma nova floresta de AD e promova o Servidor atual a DC:
Install-ADDSForest -DomainName ONOMEDOSEUADAQUI.ad
#No seu host físico, comando para adicionar o DC virtual à lista de Servidores Confiáveis:
Set-Item wsman:\localhost\Client\TrustedHosts SEUADAQUI -Concatenate -Force


#No seu servidor virtual para verificar o uso de memória:
Get-WmiObject win32_OperatingSystem |%{"Total Physical Memory: {0}KB`nFree Physical Memory : {1}KB`nTotal Virtual Memory : {2}KB`nFree Virtual Memory : {3}KB" -f $_.totalvisiblememorysize, $_.freephysicalmemory, $_.totalvirtualmemorysize, $_.freevirtualmemory}

 

Deixem as dúvidas ae caso precisem de um help!

Abs!

Marcelo

 

 

 

Salve SQL Geeks de plantão!

Neste final de semana aconteceu o primeiro SQLSATURDAY de Salvador – e último SQLSAT do ano em terras brazucas!

Como sempre, foi muito bom e gratificante reencontrar amigos, fazer networking e é claro, conversar sobre SQL SERVER.

Destaque da manhã para a Keynote realizada pelo Gustavo Gattass(@ggattass), gerente de produto da Microsoft, apresentando sobre o panorama da plataforma de dados da Microsoft no Brasil e no mundo.
É muito gratificante ver que a Microsoft nos apoia e ajuda em eventos grandiosos como este!

Neste evento fiz um overview básico do Linux para DBAs SQL SERVER, você encontra o material na agenda do evento, clicando aqui.

Crédito da foto: Rodrigo Crespi (@sqlcrespi)

 

Salve SQLGeeks de plantão!

Neste final de semana apresentamos as opções de alta disponibilidade disponíveis no SQL SERVER em um encontro do SQL BH.

Foi muito gratificante ver o pessoal com vontade de aprender, mesmo em um final de semana pós-feriado! São atitudes assim que nos incentivam a sempre continuar e buscar o melhor para apresentar!

Obrigado galera!

O material que utilizei você consegue clicando aqui: SQLBH_Set_2017.zip

 

Até a próxima pessoal!

Happy SQLServing!

Fala pessoal, bom dia!

No próximo dia 07 de Agosto, estaremos em Lisboa conversando sobre Alta Disponibilidade do SQL SERVER no Linux e sobre semelhanças e diferenças do SQL SERVER e Oracle para Administradores.

O evento acontecerá à partir das 18:30 – horário local.

Como a grande maioria de eventos de SQL SERVER, é gratuito – inscreva-se aqui: https://www.eventbrite.pt/e/bilhetes-2o-encontro-da-data-community-portugal-36756785535.

No Facebook você pode encontrar o link aqui: https://www.facebook.com/events/153509681870089

Fala pessoal, tudo bem por aí?

Sobre o TDC – Trilha de Banco de Dados, que aconteceu no dia 20/07/2017:
Excelente evento, muito bem organizado, grande infraestrutura e o melhor: Bastante heterogêneo (muitas tecnologias, sobre tudo e tudo junto e misturado!) O Evento aconteceu pela semana toda. Mas a trilha de banco de dados foi apenas na quinta feira.

Palestrei sobre as primeiras impressões sobre Alta Disponibilidade no SQL SERVER no Linux. Você pode baixar o Powerpoint e scripts que eu usei aqui: TDC_2017_SQLSERVER_HA_Linux

Me fizeram duas perguntas sensacionais lá, vou colocá-las aqui:

  1. Temos a replicação nativa do SQL SERVER no Linux? – Transacional e Merge ainda não são suportadas.
  2. E os contadores PERFMON do SQL SERVER no Linux? – Não existem, PERFMON é uma ferramenta do Windows, no Linux temos que utilizar ferramentas básicas de troubleshooting dele (SAR, TOP, FREE, etc) e dentro do SQL SERVER podemos usar Extended Events quando temos um problema mais grave (consultem o BLOG do Vitor Fava para mais detalhes sobre XEvents, ele tem uma série gigante sobre isso).

 

É isso pessoal! Até a próxima!

Happy SQLServing!

 

 

 

Fala pessoal!

neste vídeo mostro bem rapidamente como utilizar as Window Function com as funções de classificação do T-SQL. Vamos aprofundar um pouco no módulo seguinte!

Aqui está o código (retirei do Simple Talk e da apresentação do Fabiano no SQLSAT 100, as fontes estão logo em cima!)

--cria a base de dados
/*fonte:  https://www.simple-talk.com/sql/t-sql-programming/sql-server-2012-window-function-basics/ 
outras fontes: http://blogfabiano.com/?s=sql+saturday+100 */
USE TSQL2012;
GO
 
IF OBJECT_ID('RegionalSales', 'U') IS NOT NULL
DROP TABLE RegionalSales;
GO
 
CREATE TABLE RegionalSales
(
  SalesID INT NOT NULL IDENTITY PRIMARY KEY,
  SalesGroup NVARCHAR(30) NOT NULL,
  Country NVARCHAR(30) NOT NULL,
  AnnualSales INT NOT NULL
);
GO
 
INSERT INTO RegionalSales
  (SalesGroup, Country, AnnualSales)
VALUES
  ('North America', 'United States', 22000),
  ('North America', 'Canada', 32000),
  ('North America', 'Mexico', 28000),
  ('Europe', 'France', 19000),
  ('Europe', 'Germany', 22000),
  ('Europe', 'Italy', 18000),
  ('Europe', 'Greece', 16000),
  ('Europe', 'Spain', 16000),
  ('Europe', 'United Kingdom', 32000),
  ('Pacific', 'Australia', 18000),
  ('Pacific', 'China', 28000),
  ('Pacific', 'Singapore', 21000),
  ('Pacific', 'New Zealand', 18000),
  ('Pacific', 'Thailand', 17000),
  ('Pacific', 'Malaysia', 19000),
  ('Pacific', 'Japan', 22000);
GO
-----------------------------------------------------------------------------------------------------------------------------------
--sintaxe b�sica:

<window function> OVER
  (
    [ PARTITION BY <expression> [, ... n] ] --define a janela
    [ ORDER BY <expression> [ASC|DESC] [, ... n] ] --define a ordem dos dados dentro da janela
    [ ROWS|RANGE <window frame> ] --frame, ou moldura, define em quais linhas a fun��o � calculada
  )
go


---------------------------------------------------------------------------------------------------------------
--fun��es de RANKING:
--ranking functions:
--a janela � a tabela toda:
--ORDER BY OBRIGAT�RIO:
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales;
 go
 --------------------------------------------------------------
 --ordena��o diferente
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales
ORDER BY
  SalesGroup, Country;

 -------------------------------------------------------------
 --defini��o de janela: SALESGROUP
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales;
------------------------------------------------------------
--utilizando fun��es de agrupamento em janelas:
--grouping functions:

SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup) AS CountryCount,--janela � SALESGROUP, contar quantos existem
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup) AS TotalSales, --soma total de vendas  por SALESGROUP
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup) AS AverageSales --m�dia por SALESGROUP
FROM
  RegionalSales
ORDER BY
  SalesGroup, AnnualSales DESC;

-----------------------------------------
--igual, menos colunas
SELECT DISTINCT
  SalesGroup,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup) AS AverageSales
FROM
  RegionalSales
ORDER BY
  TotalSales DESC;
 --------------------------------------------
 --AGRUPANDO E ORDENANDO
 --grouping with ordering: each grouping column is different!
 --duplicate are aggregated together
 /*
 The default setting for the ROWS/RANGE subclause is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 
 This means that, for each row in the partition, the window function is applied to the current row and the preceding rows only. 
 So aggregations don�t operate on the entire set of values within the partition, but only on the value in the current row and the previous rows, 
 as we saw in the example below.
 */

 --contagem a partir de dentro da janela, ordenando do maior valor de venda at� o menor, agregando da primeira linha at� a atual.
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS AverageSales
FROM
  RegionalSales  ;
------------------------------------------------------------------------------------------------
--PALAVRAS-CHAVE: PRECEDING -> anteriores, FOLLOWING -> seguintes
--CURRENT ROW -> linha atual
--UNBOUNDED -> sem limite, a partir da primeira ou at� a �ltima

--IGUAL com a defini��o de frame padr�o:
--RANGE considera valores iguais como o mesmo, GREECE e SPAIN, agregando apenas um deles:

 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS AverageSales
FROM
  RegionalSales  ;
---------------------------------------------------------------------------
--ROWS considera cada linha como um valor a ser agregado, normalmente � o mais utilizado
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS AverageSales
FROM
  RegionalSales  ;
-------------------------------------------------------------------------------------
--fa�a a agrega��o apenas com as 2 linhas anteriores:
--only the 2 preceding rows and current
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS AverageSales
FROM
  RegionalSales;
  ------------------------------------------
 --fa�a a agrga��o considerando a janela toda: 
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS AverageSales
FROM
  RegionalSales;




 ------------------------------------------
 --FUN��ES ANAL�ICAS:
  --First/Last values - analytic functions
 --veja horizontalmente
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  FIRST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS HighestSales, -- ordene o valor do maior pro menor, ous seja, o primeiro � o maior, o �ltimo � o menor
  LAST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS LowestSales
FROM
  RegionalSales;

------------------------------
--todas as linhas da parti��o!
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  FIRST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS HighestSales,
  LAST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
      AS LowestSales
FROM
  RegionalSales;
 ----------------------------

 --LAG: valor de n linhas antes da atual
 --LEAD: valor de n linhas depois da atual
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  LAG(AnnualSales, 1) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS PreviousSale,
  LEAD(AnnualSales, 1) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NextSale
FROM
  RegionalSales;
  ----------------------------
  --tratando nulls:
   SELECT
  SalesGroup,
  Country,
  AnnualSales,
  LAG(AnnualSales, 1,0) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS PreviousSale,
  LEAD(AnnualSales, 1,0) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NextSale
FROM
  RegionalSales;



Abraços e Happy SQL Serving!

Aqueles que estão acostumados com o Linux, conhecem a facilidade de criar um arquivo com o comando TOUCH.

No Windows podemos usar o comando FSUTIL para fazer a mesma coisa.

Um arquivo dummy tem várias utilidades mas a principal é testar tempo de cópia entre um servidor e outro por exemplo!

Para criar um arquivo então utilize a seguinte sintaxe:
FSUTIL FILE CREATENEW <<Caminho e nome do arquivo>> Tamanho em Bytes

Cuidado para o tamanho que deve ser em Bytes!

Até a próxima pessoal!

 

Happy SQL Serving!