<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos script - Diego Nogare</title>
	<atom:link href="https://diegonogare.net/tags/script/feed/" rel="self" type="application/rss+xml" />
	<link>https://diegonogare.net/tags/script/</link>
	<description>Consultor Executivo de IA &#38; ML</description>
	<lastBuildDate>Thu, 14 Feb 2013 16:48:18 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/diegonogare.net/wp-content/uploads/2025/06/cropped-cropped-DN-Black-300x300-1.png?fit=32%2C32&#038;ssl=1</url>
	<title>Arquivos script - Diego Nogare</title>
	<link>https://diegonogare.net/tags/script/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">247556142</site>	<item>
		<title>Comparativo de inserção de dados em uma tabela com ColumnStore Index</title>
		<link>https://diegonogare.net/2013/02/comparativo-de-insero-de-dados-em-uma-tabela-com-columnstore-index/</link>
		
		<dc:creator><![CDATA[Diego Nogare]]></dc:creator>
		<pubDate>Thu, 14 Feb 2013 16:48:18 +0000</pubDate>
				<category><![CDATA[Artigo]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Informativo]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Tech Ed Brasil]]></category>
		<category><![CDATA[TechNet]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[bi]]></category>
		<category><![CDATA[business intelligence]]></category>
		<category><![CDATA[ColumnStore Index]]></category>
		<category><![CDATA[comparativo]]></category>
		<category><![CDATA[desempenho]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sql server]]></category>
		<guid isPermaLink="false">http://diegonogare.net/?p=343</guid>

					<description><![CDATA[<p>Fala galera, o ColumnStore Index é um novo formato de índice que foi lançado junto ao SQL Server 2012, este índice usa um padrão de compressão de dados proprietário da Microsoft e altera o formato de armazenamento dos dados nas páginas do índice. A primeira vez que um registro é inserido no índice, ele registra...</p>
<p>O post <a href="https://diegonogare.net/2013/02/comparativo-de-insero-de-dados-em-uma-tabela-com-columnstore-index/">Comparativo de inserção de dados em uma tabela com ColumnStore Index</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Fala galera, o <strong>ColumnStore Index</strong> é um novo formato de índice que foi lançado junto ao SQL Server 2012, este índice usa um padrão de compressão de dados proprietário da Microsoft e altera o formato de armazenamento dos dados nas páginas do índice. A primeira vez que um registro é inserido no índice, ele registra o dado bruto, qualquer outra aparição deste mesmo dado dentro do índice, o SQL faz um apontamento de memória para o primeiro registro, diminuindo significativamente o tamanho da página com os índices.</p>
<p>Este novo formato de índice não chegou para substituir os já convencionais e úteis <strong>Clustered</strong> e <strong>Non-Clustered</strong>, ele vem para atender um outro cenário. O armazenamento do ColumnStore Index altera a escrita dos dados do índice que estamos acostumados a ver em um padrão linear (como a figura abaixo).</p>
<p><a href="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image-1.png"><img data-recalc-dims="1" fetchpriority="high" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image_thumb-1.png?resize=550%2C172" alt="image" width="550" height="172" border="0" /></a></p>
<p>Para um formato colunar – <em>por isso o nome ColumnStore</em> – armazenando todos os registros da coluna em uma mesma página. Uma representação visula seria como a imagem abaixo:</p>
<p><a href="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image1-1.png"><img data-recalc-dims="1" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image_thumb1-1.png?resize=550%2C234" alt="image" width="550" height="234" border="0" /></a></p>
<p>Os ganhos de performance com o uso correto do ColumnStore Index varia entre 10 e 100X. Podendo, em alguns casos reais que já presenciei, chegar a retornos 400X mais rápidos. Porém o ColumnStore Index não é só maravilhas. A utilização deste índice em uma tabela a transforma em Read Only, impedindo manutenção nos dados já existentes. Este cenário de dados como somente leitura nos remete à ambientes de Data Warehouse, onde a informação armazenada sobre manutenção incremental em determinados momentos do ciclo. Em alguns casos sendo incrementado somente uma vez por noite, em outros cenários somente uma atualização semanal, em um terceiro podendo ser uma vez por mês. Isso varia de acordo com a necessidade da área de negócios.</p>
<blockquote><p>Agora, se a tabela está em um formato Read Only, como podemos inserir dados incrementais nela???</p></blockquote>
<p>Pensando sobre como implementar estes incrementos, vem à mente 3 possibilidades. Podemos <strong>desabilitar, inserir e reabilitar</strong> o índice, <strong>remover, inserir e recriar</strong> o índice ou então trabalhar com <strong>Particionamento de Tabelas</strong>, onde temos as partições com o índice e uma tabela onde serão inseridos os dados.</p>
<p>Para colocar em comparação estes três cenários, montei um ambiente de teste com aproximadamente 35Milhões de linhas e fiz comparativo entre eles.</p>
<p>Veja o comparativo abaixo entre Logical Read dos três cenários, e também o tempo necessário para realizar cada atividade.</p>
<p><a href="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image2-1.png"><img data-recalc-dims="1" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image_thumb2-1.png?resize=550%2C330" alt="image" width="550" height="330" border="0" /></a></p>
<p><a href="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image3-1.png"><img data-recalc-dims="1" loading="lazy" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://i0.wp.com/blogdiegonogare.azurewebsites.net/wp-content/uploads/2013/02/image_thumb3-1.png?resize=550%2C330" alt="image" width="550" height="330" border="0" /></a></p>
<p align="left">O teste consistiu em <strong>criar uma tabela com 33milhões</strong> de registros e aplicar o <strong>ColumnStore Index</strong> nesta tabela. Em seguida, <strong>adicionar mais 1.6Milhões</strong> de linhas… Realizamos o teste no mesmo ambiente 2 vezes, e tiramos a média tanto de <strong><em>Logical Reads</em></strong> quanto de <strong><em>Elapsed Time</em></strong> do processo.</p>
<p>Os resultados provam que a melhor solução, disparada, é a utilização de <strong>Partition Table</strong>. A alguns meses eu havia escrito uma série com 7 posts sobre o assunto, e acredito que podem ser aproveitados para o entendimento do que fiz neste exemplo.</p>
<p><a href="https://diegonogare.net/2012/10/partition-table-particionamento-de-tabelas-parte1/" target="_blank" rel="noopener noreferrer">Partition Table (Particionamento de Tabelas) – Parte#1</a></p>
<p><a href="https://diegonogare.net/2012/10/partition-table-cenariosbeneficios-parte2/" target="_blank" rel="noopener noreferrer">Partition Table (Cenários/Benefícios) – Parte#2</a></p>
<p><a href="https://diegonogare.net/2012/10/partition-table-definicoesterminologias-parte3/" target="_blank" rel="noopener noreferrer">Partition Table (Definições/Terminologias) – Parte#3</a></p>
<p><a href="https://diegonogare.net/2012/10/partition-table-criando-filegroup-parte4/" target="_blank" rel="noopener noreferrer">Partition Table (Criando Filegroup) – Parte#4</a></p>
<p><a href="https://diegonogare.net/2012/10/partition-table-criando-partition-function-parte5/" target="_blank" rel="noopener noreferrer">Partition Table (Criando Partition Function) – Parte#5</a></p>
<p><a href="https://diegonogare.net/2012/11/partition-table-criando-o-partition-scheme-parte6/" target="_blank" rel="noopener noreferrer">Partition Table (Criando o Partition Scheme) – Parte#6</a></p>
<p><a href="https://diegonogare.net/2012/11/partition-table-criando-a-tabela-parte7/" target="_blank" rel="noopener noreferrer">Partition Table (Criando a tabela) – Parte#7</a></p>
<p>Caso alguém queira simular o processo que utilizei, segue abaixo a criação do ambiente e a população das tabelas com poucos dados. É claro que para você simular a mesma coisa que fiz aqui, você precisa adaptar este código abaixo para seu cenário.</p>
<div class="csharpcode">
<pre class="alt">/*******************************************/</pre>
<pre>/*********** CRIAÇÃO DO AMBIENTE ***********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">DATABASE</span> ngrSolutionsDW</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">USE</span> ngrSolutionsDW</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/*********** LIMPEZA DO AMBIENTE ***********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">USE</span> ngrSolutionsDW</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">DROP</span> <span class="kwrd">SEQUENCE</span> seq_Codigo</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">DROP</span> <span class="kwrd">TABLE</span> tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">DROP</span> <span class="kwrd">TABLE</span> tabelaProducao_v2</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">DROP</span> PARTITION SCHEME ps_DataAtualizacao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">DROP</span> PARTITION <span class="kwrd">FUNCTION</span> pf_DataAtualizacao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/********** POPULAÇÃO DO AMBIENTE **********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> tabelaProducao(</pre>
<pre>      id <span class="kwrd">INT</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt">    , idOrigem <span class="kwrd">INT</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre>    , nome <span class="kwrd">VARCHAR</span>(20) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt">    , endereco <span class="kwrd">VARCHAR</span>(30) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre>    , dataCadastro <span class="kwrd">date</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt">    , dataAtualizacao <span class="kwrd">date</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>  )</pre>
<pre><span class="kwrd">ON</span> [<span class="kwrd">PRIMARY</span>]</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> tabelaProducao <span class="kwrd">WITH</span> <span class="kwrd">CHECK</span> <span class="kwrd">ADD</span></pre>
<pre>    <span class="kwrd">CONSTRAINT</span> [validarCodigo_V1_Check]    <span class="kwrd">CHECK</span></pre>
<pre class="alt">    (dataAtualizacao &gt;= <span class="str">'2010-01-01'</span> <span class="kwrd">and</span> dataAtualizacao &lt; <span class="str">'2013-03-01'</span>)</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> tabelaProducao <span class="kwrd">CHECK</span> <span class="kwrd">CONSTRAINT</span> [validarCodigo_V1_Check]</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">CREATE</span> <span class="kwrd">SEQUENCE</span> seq_Codigo <span class="kwrd">AS</span> <span class="kwrd">INT</span></pre>
<pre class="alt">INCREMENT <span class="kwrd">BY</span> 1</pre>
<pre>minvalue 1</pre>
<pre class="alt">maxvalue 10000</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/* 1K registros de SETEMBRO 2012 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-5, <span class="kwrd">convert</span>(datetime, getdate())),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-5, <span class="kwrd">convert</span>(datetime, getdate())))</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre>/* 1K registros de OUTUBRO 2012 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-4, <span class="kwrd">convert</span>(datetime, getdate())),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-4, <span class="kwrd">convert</span>(datetime, getdate())))</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre>/* 1K registros de NOVEMBRO 2012 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-3, <span class="kwrd">convert</span>(datetime, getdate())),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-3, <span class="kwrd">convert</span>(datetime, getdate())))</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre>/* 1K registros de DEZEMBRO 2012 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-2, <span class="kwrd">convert</span>(datetime, getdate())),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-2, <span class="kwrd">convert</span>(datetime, getdate())))</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre>/* 1K registros de JANEIRO 2013 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-1, <span class="kwrd">convert</span>(datetime, getdate())),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-1, <span class="kwrd">convert</span>(datetime, getdate())))</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre>/* 500 registros de FEVEREIRO 2013 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    getdate(), getdate())</pre>
<pre class="alt"><span class="kwrd">go</span> 500</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">SET</span> <span class="kwrd">STATISTICS</span> IO <span class="kwrd">ON</span>; <span class="kwrd">SET</span> <span class="kwrd">STATISTICS</span> <span class="kwrd">TIME</span> <span class="kwrd">ON</span></pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/**************************************************************************/</pre>
<pre class="alt">/**************************** DISABLE / REBUILD ***************************/</pre>
<pre>/**************************************************************************/</pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/************ CRIAÇÃO DO <span class="kwrd">INDEX</span> *************/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre><span class="kwrd">ON</span> tabelaProducao ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/******** INSERIR NA TABELA DE PROD ********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt">/* +1 em FEVEREIRO 2013 */</pre>
<pre><span class="rem">-- Forçar o erro por causa que a tabela está com ColumnStore Index</span></pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    getdate(), getdate())</pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/************ DISABLE / REBUILD ************/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> idx_csi_tabelaProducao <span class="kwrd">ON</span> tabelaProducao DISABLE</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> idx_csi_tabelaProducao <span class="kwrd">ON</span> tabelaProducao REBUILD</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/************ POPULAR A TABELA *************/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> idx_csi_tabelaProducao <span class="kwrd">ON</span> tabelaProducao DISABLE</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre class="alt">            endereco, dataCadastro, dataAtualizacao)</pre>
<pre><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre class="alt">    dateadd(<span class="kwrd">month</span>,-4, <span class="kwrd">convert</span>(datetime, getdate())), getdate())</pre>
<pre><span class="kwrd">go</span> 1000</pre>
<pre class="alt"></pre>
<pre><span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> idx_csi_tabelaProducao <span class="kwrd">ON</span> tabelaProducao REBUILD</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/**************************************************************************/</pre>
<pre>/****************************** <span class="kwrd">DROP</span> / <span class="kwrd">CREATE</span> *****************************/</pre>
<pre class="alt">/**************************************************************************/</pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/************ CRIAÇÃO DO <span class="kwrd">INDEX</span> *************/</pre>
<pre class="alt">/*******************************************/</pre>
<pre><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre class="alt"><span class="kwrd">ON</span> tabelaProducao ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/******** INSERIR NA TABELA DE PROD ********/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"></pre>
<pre>/* +1 em FEVEREIRO 2013 */</pre>
<pre class="alt"><span class="rem">-- Forçar o erro por causa que a tabela está com ColumnStore Index</span></pre>
<pre>insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre class="alt">            endereco, dataCadastro, dataAtualizacao)</pre>
<pre><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre class="alt">    getdate(), getdate())</pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/************** <span class="kwrd">DROP</span> / <span class="kwrd">CREATE</span> **************/</pre>
<pre class="alt">/*******************************************/</pre>
<pre><span class="kwrd">DROP</span> <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao] <span class="kwrd">ON</span> tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre><span class="kwrd">ON</span> tabelaProducao ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/************ POPULAR A TABELA *************/</pre>
<pre class="alt">/*******************************************/</pre>
<pre><span class="kwrd">DROP</span> <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao] <span class="kwrd">ON</span> tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    dateadd(<span class="kwrd">month</span>,-4, <span class="kwrd">convert</span>(datetime, getdate())), getdate())</pre>
<pre class="alt"><span class="kwrd">go</span> 1000</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre><span class="kwrd">ON</span> tabelaProducao ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/**************************************************************************/</pre>
<pre>/***************************** PARTITION <span class="kwrd">TABLE</span> ****************************/</pre>
<pre class="alt">/**************************************************************************/</pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/********** CRIAÇÃO DAS PARTIÇÕES **********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> PARTITION <span class="kwrd">FUNCTION</span> [pf_DataAtualizacao](<span class="kwrd">date</span>) <span class="kwrd">AS</span> RANGE <span class="kwrd">RIGHT</span></pre>
<pre><span class="kwrd">FOR</span> <span class="kwrd">VALUES</span> (<span class="str">'2012-09-01'</span>,<span class="str">'2012-10-01'</span>,<span class="str">'2012-11-01'</span>,</pre>
<pre class="alt">            <span class="str">'2012-12-01'</span>,<span class="str">'2013-01-01'</span>,<span class="str">'2013-02-01'</span>,<span class="str">'2013-03-01'</span>)</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">CREATE</span> PARTITION SCHEME [ps_DataAtualizacao]</pre>
<pre class="alt">    <span class="kwrd">AS</span> PARTITION [pf_DataAtualizacao] <span class="kwrd">ALL</span> <span class="kwrd">TO</span> ([<span class="kwrd">PRIMARY</span>])</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/************ CRIAÇÃO DOS <span class="kwrd">INDEX</span> ************/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"></pre>
<pre><span class="kwrd">CREATE</span> <span class="kwrd">CLUSTERED</span> <span class="kwrd">INDEX</span> [idx_DataCodigo] <span class="kwrd">ON</span> tabelaProducao(DataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">ON</span> ps_DataAtualizacao(dataAtualizacao)</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre class="alt"><span class="kwrd">ON</span> tabelaProducao ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/*******************************************/</pre>
<pre class="alt">/******** INSERIR NA TABELA DE PROD ********/</pre>
<pre>/*******************************************/</pre>
<pre class="alt"></pre>
<pre>/* +1 em FEVEREIRO 2013 */</pre>
<pre class="alt"><span class="rem">-- Forçar o erro por causa que a tabela está com ColumnStore Index</span></pre>
<pre>insert <span class="kwrd">into</span> tabelaProducao(id, idOrigem, nome,</pre>
<pre class="alt">            endereco, dataCadastro, dataAtualizacao)</pre>
<pre><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre class="alt">    getdate(), getdate())</pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/******** CRIAÇÃO DA SEGUNDA TABELA ********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> tabelaProducao_V2 (id <span class="kwrd">INT</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, idOrigem <span class="kwrd">int</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,</pre>
<pre>    nome <span class="kwrd">VARCHAR</span>(20) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, endereco <span class="kwrd">VARCHAR</span>(30) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,</pre>
<pre class="alt">    dataCadastro <span class="kwrd">date</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, dataAtualizacao <span class="kwrd">date</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>)</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> tabelaProducao_V2 <span class="kwrd">WITH</span> <span class="kwrd">CHECK</span> <span class="kwrd">ADD</span></pre>
<pre class="alt">    <span class="kwrd">CONSTRAINT</span>[validarCodigo_V2_Check] <span class="kwrd">CHECK</span></pre>
<pre>    (dataAtualizacao &gt;= <span class="str">'2013-02-01'</span> <span class="kwrd">and</span> dataAtualizacao &lt; <span class="str">'2013-03-01'</span>)</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/************ CRIAÇÃO DOS <span class="kwrd">INDEX</span> ************/</pre>
<pre class="alt">/*******************************************/</pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">CLUSTERED</span> <span class="kwrd">INDEX</span> [idx_DataCodigo]</pre>
<pre><span class="kwrd">ON</span> tabelaProducao_v2(DataAtualizacao) <span class="kwrd">ON</span> [<span class="kwrd">PRIMARY</span>]</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt">/*******************************************/</pre>
<pre>/********* MOVIMENTAÇÃO DOS DADOS **********/</pre>
<pre class="alt">/*******************************************/</pre>
<pre><span class="rem">-- Conta os registros</span></pre>
<pre class="alt"><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre>        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre class="alt">        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao_v2</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="rem">-- Movimenta os dados</span></pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> tabelaProducao SWITCH PARTITION 7 <span class="kwrd">TO</span> tabelaProducao_v2</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="rem">-- Conta os registros</span></pre>
<pre class="alt"><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre>        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre class="alt">        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao_v2</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre>/* Fevereiro na TABELA 2 */</pre>
<pre class="alt">insert <span class="kwrd">into</span> tabelaProducao_V2(id, idOrigem, nome,</pre>
<pre>            endereco, dataCadastro, dataAtualizacao)</pre>
<pre class="alt"><span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seq_Codigo, <span class="kwrd">convert</span>(<span class="kwrd">int</span>,rand()*100)+1,</pre>
<pre>    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,20),</pre>
<pre class="alt">    <span class="kwrd">substring</span>(<span class="kwrd">convert</span>(<span class="kwrd">varchar</span>(40),newid()),1,30),</pre>
<pre>    getdate(), getdate())</pre>
<pre class="alt"><span class="kwrd">go</span> 10</pre>
<pre></pre>
<pre class="alt"><span class="rem">-- Conta os registros</span></pre>
<pre><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre class="alt">        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre>        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao_v2</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">NONCLUSTERED</span> COLUMNSTORE <span class="kwrd">INDEX</span> [idx_csi_tabelaProducao]</pre>
<pre><span class="kwrd">ON</span> tabelaProducao_v2 ( id, nome, endereco, dataCadastro, dataAtualizacao )</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre></pre>
<pre class="alt"><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> tabelaProducao_V2 switch <span class="kwrd">to</span> tabelaProducao partition 7</pre>
<pre><span class="kwrd">GO</span></pre>
<pre class="alt"></pre>
<pre><span class="rem">-- Conta os registros</span></pre>
<pre class="alt"><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre>        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao</pre>
<pre class="alt"><span class="kwrd">GO</span></pre>
<pre><span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(0) [TOTAL], <span class="kwrd">min</span>(dataAtualizacao) [MENOR],</pre>
<pre class="alt">        <span class="kwrd">max</span>(dataAtualizacao) [MAIOR] <span class="kwrd">FROM</span>  tabelaProducao_v2</pre>
<pre>GO</pre>
</div>
<div class="csharpcode"></div>
<div class="csharpcode"></div>
<p>Bom divertimento em seus testes. Espero ver nos comentários sua conclusão sobre este comparativo.</p>
<p>O post <a href="https://diegonogare.net/2013/02/comparativo-de-insero-de-dados-em-uma-tabela-com-columnstore-index/">Comparativo de inserção de dados em uma tabela com ColumnStore Index</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2121</post-id>	</item>
		<item>
		<title>Dicas para o exame 70-461 – Microsoft Querying SQL Server 2012</title>
		<link>https://diegonogare.net/2012/12/dicas-para-o-exame-70-461-microsoft-querying-sql-server-2012/</link>
		
		<dc:creator><![CDATA[Diego Nogare]]></dc:creator>
		<pubDate>Wed, 26 Dec 2012 17:25:51 +0000</pubDate>
				<category><![CDATA[Artigo]]></category>
		<category><![CDATA[Informativo]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[certificacao]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sql server]]></category>
		<category><![CDATA[t-sql]]></category>
		<guid isPermaLink="false">http://diegonogare.net/?p=267</guid>

					<description><![CDATA[<p>Fala galera, na semana passada refiz a prova 70-461 – Querying SQL Server 2012, e desta vez passei \o/. É uma prova que força o nosso cérebro, e também exige escrita de códigos… Gostei do que vi na prova, exige bastante atenção e conhecimento. Não vou entrar nos detalhes dos assuntos que caíram na prova,...</p>
<p>O post <a href="https://diegonogare.net/2012/12/dicas-para-o-exame-70-461-microsoft-querying-sql-server-2012/">Dicas para o exame 70-461 – Microsoft Querying SQL Server 2012</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Fala galera, na semana passada refiz a prova <strong>70-461 – Querying SQL Server 2012</strong>, e desta vez <strong>passei</strong> \o/. É uma prova que força o nosso cérebro, e também exige escrita de códigos… Gostei do que vi na prova, exige bastante atenção e conhecimento.</p>
<p>Não vou entrar nos detalhes dos assuntos que caíram na prova, porque o <strong>Luti</strong> fez isso neste post: <a href="http://luticm.blogspot.com.br/2012/03/impressoes-da-prova-70-461.html" target="_blank" rel="noopener noreferrer">Impressões da prova 70-461</a></p>
<p>Minha idéia é ajudar você a ver e entender um pouco de alguns códigos T-SQL referente aos assuntos que caíram na prova. Não são só esses tópicos que caíram, mas esses já te ajudam a ter uma idéia de uma parte da prova. Dentro <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-461" target="_blank" rel="noopener noreferrer">deste link</a>, vá até a sessão <strong>Skills Measures</strong>, e conheça todos os assuntos cobrados na prova.</p>
<p>Outro ponto interessante para estudar é o <strong>Training Kit</strong> deste exame, que você pode comprar diretamente no site da <a href="http://shop.oreilly.com/product/0790145345059.do" target="_blank" rel="noopener noreferrer">O’Reilly clicando aqui</a>. Compramos este eBook aqui onde eu trabalho, e ajudou bastante para revisar os itens do exame.</p>
<p>O código T-SQL abaixo possui as explicações diretamente nos comentários acima de cada bloco de código. Podem copiar e colar no SQL Server Management Studio para ver a formatação do código e executar passo a passo para ver os resultados e entender as diferenças&#8230;</p>
<pre class="csharpcode"><span class="kwrd">use</span> tempdb
<span class="kwrd">go</span>

<span class="rem">-- drop table tbNogare</span>
<span class="kwrd">create</span> <span class="kwrd">table</span> tbNogare (id <span class="kwrd">int</span> <span class="kwrd">identity</span>(1,1), nome <span class="kwrd">varchar</span>(5))
<span class="kwrd">GO</span>
insert <span class="kwrd">into</span> tbNogare <span class="kwrd">values</span> (<span class="str">'AAA'</span>),(<span class="str">'BBB'</span>),(<span class="str">'CCC'</span>),(<span class="str">'AAA'</span>)
                   ,(<span class="str">'DDD'</span>),(<span class="str">'DDD'</span>),(<span class="str">'EEE'</span>),(<span class="str">'EEE'</span>),(<span class="str">'AAA'</span>)
<span class="kwrd">GO</span>

/* <span class="kwrd">TOP</span> (x) <span class="kwrd">WITH</span> TIES <span class="rem">-- Adiciona as ocorrencias repetidas do ultimo item </span>
encontrado */
<span class="kwrd">select</span> <span class="kwrd">top</span> (1) <span class="kwrd">with</span> ties nome <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome
<span class="kwrd">select</span> <span class="kwrd">top</span> (5) <span class="kwrd">with</span> ties nome <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome
<span class="kwrd">select</span> <span class="kwrd">top</span> (6) <span class="kwrd">with</span> ties nome <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome

/* OFFSET <span class="kwrd">FETCH</span> <span class="rem">-- cria paginação, iniciando em um registro e </span>
informando quantos outros devem surgir */
<span class="kwrd">select</span> id, nome <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> ID 
offset 4 <span class="kwrd">rows</span> <span class="kwrd">fetch</span> <span class="kwrd">first</span> 2 <span class="kwrd">rows</span> <span class="kwrd">only</span>

/* <span class="kwrd">CROSS</span> <span class="kwrd">JOIN</span> <span class="rem">-- cria um Produto Cartesiano, multiplicando todos os </span>
itens da tabela 1 por todos da tabela 2. Inclusive aplicando filtros */
<span class="kwrd">select</span> I.id, N.nome
<span class="kwrd">from</span> tbNogare I <span class="kwrd">cross</span> apply tbNogare N
<span class="kwrd">where</span> I.id &lt; 3

<span class="kwrd">select</span> t2.id, t2.nome, t1.id, T1.nome <span class="kwrd">from</span> tbNogare t2
<span class="kwrd">cross</span> apply (<span class="kwrd">select</span> t.id, t.nome <span class="kwrd">from</span> tbNogare T <span class="kwrd">where</span> t.id &gt;= 4) T1
<span class="kwrd">where</span> t2.id = 2

/* <span class="kwrd">Table</span> <span class="kwrd">Value</span> <span class="kwrd">Function</span> - Retornar uma tabela através de uma função */
<span class="kwrd">CREATE</span> <span class="kwrd">FUNCTION</span> dbo.FuncaoTabular (@id <span class="kwrd">int</span>) <span class="kwrd">RETURNS</span> <span class="kwrd">TABLE</span>
<span class="kwrd">AS</span>
<span class="kwrd">RETURN</span> (<span class="kwrd">SELECT</span> nome <span class="kwrd">from</span> tbNogare <span class="kwrd">where</span> id &gt;= @id)

<span class="kwrd">select</span> * <span class="kwrd">from</span> FuncaoTabular(2)
<span class="kwrd">select</span> * <span class="kwrd">from</span> FuncaoTabular(4)
<span class="kwrd">select</span> * <span class="kwrd">from</span> FuncaoTabular(7)

/* WINDOWS FUNCTIONS */
<span class="rem">-- Ultimo dia do mês, inserindo um mês como parametro</span>
<span class="kwrd">select</span> EOMONTH(getdate(),-1) <span class="rem">-- o parametro negativo, retorna os meses.</span>
<span class="kwrd">select</span> EOMONTH(getdate(),0) <span class="rem">-- o parametro zero, retorna o mês atual.</span>
<span class="kwrd">select</span> EOMONTH(getdate(),1) <span class="rem">-- o parametro positivo, avança os meses.</span>

<span class="rem">-- Windows Functions</span>
<span class="kwrd">select</span> 
 first_value(id) <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> id) primeiro
,lag(id) <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> id) anterior
,id
, lead(id) <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> id) seguinte
, last_value(id) <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> id) ultimo
<span class="kwrd">from</span> tbNogare
<span class="kwrd">where</span> id <span class="kwrd">in</span> (3,4,5,6)

<span class="rem">-- Ranking agrupado pela quebra e mantendo o count do numero da linha</span>
<span class="kwrd">select</span> RANK() <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> nome) item, nome
        <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome

<span class="rem">-- Ranking agrupado pela quebra e continuando o count do numero da linha</span>
<span class="kwrd">select</span> DENSE_RANK() <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> nome) item, nome 
        <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome

<span class="rem">-- Ranking agrupado pela quebra e dividindo o numero </span>
<span class="rem">-- das linhas pelo parametro</span>
<span class="kwrd">select</span> ntile(4) <span class="kwrd">over</span> (<span class="kwrd">order</span> <span class="kwrd">by</span> nome) item, nome
        <span class="kwrd">from</span> tbNogare <span class="kwrd">order</span> <span class="kwrd">by</span> nome

/* XML */
<span class="rem">-- FOR XML RAW --&gt; por padrão, apresenta os dados </span>
<span class="rem">-- em atributos (dentro da tag)</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw (<span class="str">'Linha'</span>) <span class="rem">-- Nome da linha</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw (<span class="str">'Linha'</span>), elements <span class="rem">-- ELEMENTOS</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw (<span class="str">'Linha'</span>), root(<span class="str">'Raiz'</span>) <span class="rem">-- Nó raiz</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw (<span class="str">'Linha'</span>), elements, root(<span class="str">'Raiz'</span>)
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml raw (<span class="str">'Linha'</span>), elements, root(<span class="str">'Raiz'</span>)
        , XMLSCHEMA(<span class="str">'Nogare_70-461'</span>) <span class="rem">-- Adicionar XMLSchema</span>

<span class="rem">-- FOR XML AUTO --&gt; por padrão, apresenta os dados</span>
<span class="rem">-- em atributos (dentro da tag)</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml auto  <span class="rem">-- NÃO pode nome da linha</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml auto, elements  <span class="rem">-- ELEMENTOS</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml auto, root(<span class="str">'Raiz'</span>) <span class="rem">-- Nó raiz</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml auto, elements, root(<span class="str">'Raiz'</span>)
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml auto, elements, root(<span class="str">'Raiz'</span>)
        , XMLSCHEMA(<span class="str">'Nogare_70-461'</span>) <span class="rem">-- Adicionar XMLSchema</span>

<span class="rem">-- FOR XML PATH --&gt; por padrão, apresenta os dados em </span>
<span class="rem">-- elementos (fora da tag). Não suporta XMLSchema</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml <span class="kwrd">path</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml <span class="kwrd">path</span> (<span class="str">'Linha'</span>) <span class="rem">-- Nome da linha</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> tbNogare <span class="kwrd">for</span> xml <span class="kwrd">path</span> (<span class="str">'Linha'</span>), ROOT(<span class="str">'Raiz'</span>) <span class="rem">-- Nó raiz</span>

/* Coluna Computada */
<span class="rem">-- Retorno computado (calculo simples)</span>
<span class="kwrd">select</span> (ID * 2) <span class="kwrd">AS</span> COLUNA <span class="kwrd">from</span> tbNogare 

<span class="rem">-- Criação computada (calculo simples)</span>
<span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> #tbNogare (id <span class="kwrd">int</span> <span class="kwrd">identity</span>, valor <span class="kwrd">int</span>, dobro <span class="kwrd">as</span> valor *2 )
<span class="kwrd">GO</span>
insert <span class="kwrd">into</span> #tbNogare (valor) <span class="kwrd">values</span> (2),(3),(4)
<span class="kwrd">GO</span>
<span class="kwrd">select</span> * <span class="kwrd">from</span> #tbNogare
<span class="kwrd">GO</span>

/* <span class="kwrd">SEQUENCE</span> */
<span class="kwrd">CREATE</span> <span class="kwrd">SEQUENCE</span> seqNogare <span class="kwrd">AS</span> <span class="kwrd">INT</span>
INCREMENT <span class="kwrd">BY</span> 1 <span class="rem">-- Valor do incremento</span>
MINVALUE 1 <span class="rem">-- mínimo valor</span>
MAXVALUE 10 <span class="rem">-- máximo valor</span>
<span class="kwrd">CYCLE</span> <span class="rem">-- também pode ser NO CYCLE. Informa se volta pro começo ou não</span>
<span class="kwrd">START</span> <span class="kwrd">WITH</span> 5 <span class="rem">-- Informa o início do ciclo. Quando bater no valor máximo,</span>
             <span class="rem">-- volta pro início (valor mínimo)</span>

<span class="rem">-- É possível compartilhar uma sequence entre mais de um objeto</span>
<span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> #tbNogare2 (id <span class="kwrd">int</span>)
<span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> #tbNogare3 (id <span class="kwrd">int</span>)

insert <span class="kwrd">into</span> #tbNogare2(id) <span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seqNogare)
<span class="kwrd">go</span> 3
insert <span class="kwrd">into</span> #tbNogare3(id) <span class="kwrd">values</span> (<span class="kwrd">next</span> <span class="kwrd">value</span> <span class="kwrd">for</span> seqNogare)
<span class="kwrd">go</span> 5

<span class="kwrd">select</span> * <span class="kwrd">from</span> #tbNogare2
<span class="kwrd">select</span> * <span class="kwrd">from</span> #tbNogare3

/* <span class="kwrd">OUTPUT</span> */
INSERT <span class="kwrd">INTO</span> #tbNogare(valor)
<span class="kwrd">output</span> inserted.dobro <span class="rem">-- Retorna um valor quando inserido</span>
<span class="kwrd">values</span> (10)

<span class="kwrd">select</span> * <span class="kwrd">from</span> #tbNogare

<span class="kwrd">delete</span> <span class="kwrd">from</span> #tbNogare
<span class="kwrd">output</span> deleted.id <span class="rem">-- Retorna um valor quando deletado</span>
<span class="kwrd">where</span> valor = 10

<span class="kwrd">select</span> * <span class="kwrd">from</span> #tbNogare

/* <span class="kwrd">ISOLATION</span> <span class="kwrd">LEVEL</span> */
<span class="rem">-- READ COMMITED &gt;&gt; (default) Leitura de dados comitados (gera block)</span>
<span class="rem">-- READ UNCOMMITED &gt;&gt; Leitura de dados não comitados (leitura suja)</span>
<span class="rem">-- READ COMMITED SNAPSHOT &gt;&gt; Lê os ultimos dados comitados, qualquer </span>
<span class="rem">-- alteração, grava a origem da alteração no TempDB</span>
<span class="rem">-- REPEATABLE READ &gt;&gt; Lê o dado quantas vezes forem necessárias dentro</span>
<span class="rem">-- da transação. Mantém os dados que sofreram DELETES ou UPDATES</span>
<span class="rem">-- mas adiciona os que sofreram INSERT. (Leitura Fantasma)</span>
<span class="rem">-- SNAPSHOT &gt;&gt; Lê o dado comitado, sem ter leitura suja ou fantasma</span>
<span class="rem">-- SERIALIZABLE &gt;&gt; Trava as colunas utilizadas no SELECT, não permitindo</span>
<span class="rem">-- inserção de dados que alterem o resultado</span>

/* THROW */
<span class="kwrd">SELECT</span> * <span class="kwrd">FROM</span> tbNogare

<span class="kwrd">BEGIN</span> TRY
    INSERT tbNogare(ID) <span class="kwrd">VALUES</span>(1);
<span class="kwrd">END</span> TRY
<span class="kwrd">BEGIN</span> CATCH
    <span class="kwrd">PRINT</span> <span class="str">'-------0-------'</span>;
    THROW 50000, <span class="str">'&gt;&gt;&gt; SEU ERRO AQUI &lt;&lt;&lt;'</span>,0
<span class="kwrd">END</span> CATCH;

/* TRY <span class="kwrd">CONVERT</span> */
<span class="rem">-- Quando falhar, ao invés de erro ele retorna null</span>
<span class="kwrd">SELECT</span> <span class="kwrd">CONVERT</span>(<span class="kwrd">int</span>, <span class="str">'55'</span>)
<span class="kwrd">SELECT</span> <span class="kwrd">CONVERT</span>(<span class="kwrd">int</span>, <span class="str">'texto'</span>)
<span class="kwrd">SELECT</span> TRY_CONVERT(<span class="kwrd">int</span>, <span class="str">'66'</span>)
<span class="kwrd">SELECT</span> TRY_CONVERT(<span class="kwrd">int</span>, <span class="str">'texto'</span>)

/* TRY PARSE */
<span class="rem">-- Quando falhar, ao invés de erro ele retorna null</span>
<span class="kwrd">SELECT</span> PARSE(<span class="str">'44'</span> <span class="kwrd">as</span> <span class="kwrd">int</span>)
<span class="kwrd">SELECT</span> PARSE(<span class="str">'b'</span> <span class="kwrd">as</span> <span class="kwrd">int</span>)
<span class="kwrd">SELECT</span> TRY_PARSE(<span class="str">'33'</span> <span class="kwrd">as</span> <span class="kwrd">int</span>)
<span class="kwrd">SELECT</span> TRY_PARSE(<span class="str">'b'</span> <span class="kwrd">as</span> <span class="kwrd">int</span>)

<span class="kwrd">DROP</span> <span class="kwrd">TABLE</span> tbNogare
go</pre>
<p>&nbsp;</p>
<p>Aproveite que ainda está em época de <a href="https://diegonogare.net/2012/08/segunda-chance-gratuita-nos-exames-de-certificacao/" target="_blank" rel="noopener noreferrer">segunda chance</a>, e marque agora mesmo seu exame. Já pensou começar 2013 fazendo esta prova de <strong>SQL Server 2012</strong>??</p>
<p>Espero que isso lhe ajude a passar no exame, bons estudos!</p>
<p>O post <a href="https://diegonogare.net/2012/12/dicas-para-o-exame-70-461-microsoft-querying-sql-server-2012/">Dicas para o exame 70-461 – Microsoft Querying SQL Server 2012</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">267</post-id>	</item>
	</channel>
</rss>
