<?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>MXStudio &#187; Agnaldo Diogo dos Santos</title>
	<atom:link href="http://www.mxstudio.com.br/author/agnaldo_diogo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mxstudio.com.br</link>
	<description>Macromedia e Adobe - Artigos, colunas, tutorias e muito mais...</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:31:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Índices no SQL Server &#8211; parte 02</title>
		<link>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-02/</link>
		<comments>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-02/#comments</comments>
		<pubDate>Wed, 28 May 2008 15:25:37 +0000</pubDate>
		<dc:creator>Agnaldo Diogo dos Santos</dc:creator>
				<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=1501</guid>
		<description><![CDATA[Num outro post expliquei o que são os índices. Foi uma idéia geral. Mostrei, ainda, um plano de execução simples. Fiz alguns selects que posso agregar nas seguintes tabelas: # COMANDO 01 SELECT * FROM PESSOA 02 SELECT * FROM PESSOA WHERE COD = 1 03 SELECT NOME FROM PESSOA 04 SELECT NOME FROM PESSOA [...]]]></description>
			<content:encoded><![CDATA[<p>Num <a title="ïndices no SQL Server - parte 01" href="http://www.mxstudio.com.br/sql/indices-no-sql-server-parte-01/" target="_blank"><span style="#cc0000;">outro post</span></a> expliquei o que são os índices. Foi uma idéia geral. Mostrei, ainda, um plano de execução simples. Fiz alguns selects que posso agregar nas seguintes tabelas:</p>
<table border="1" width="100%">
<tbody>
<tr>
<th>#</th>
<th>COMANDO</th>
</tr>
<tr>
<td>01</td>
<td>SELECT * FROM PESSOA</td>
</tr>
<tr>
<td>02</td>
<td>SELECT * FROM PESSOA WHERE COD = 1</td>
</tr>
<tr>
<td>03</td>
<td>SELECT NOME FROM PESSOA</td>
</tr>
<tr>
<td>04</td>
<td>SELECT NOME FROM PESSOA WHERE NOME = ‘AGNALDO’</td>
</tr>
<tr>
<td>05</td>
<td>SELECT COD, NOME FROM PESSOA WHERE NOME = ‘AGNALDO’</td>
</tr>
<tr>
<td>06</td>
<td>SELECT * FROM PESSOA WHERE NOME = ‘AGNALDO’</td>
</tr>
</tbody>
</table>
<table border="1" width="100%">
<tbody>
<tr align="center">
<th>COMANDO</th>
<th>SEM ÍNDICE</th>
<th>NON-CLUSTERED</th>
<th>CLUSTERED<br />
e<br />
NON-CLUSTERED</th>
</tr>
<tr>
<td>01</td>
<td>TABLE SCAN</td>
<td>TABLE SCAN</td>
<td>CLUSTERED INDEX SCAN</td>
</tr>
<tr>
<td>02</td>
<td>TABLE SCAN</td>
<td>TABLE SCAN</td>
<td>CLUSTERED INDEX SEEK</td>
</tr>
<tr>
<td>03</td>
<td>TABLE SCAN</td>
<td>INDEX SCAN</td>
<td>INDEX SCAN</td>
</tr>
<tr>
<td>04</td>
<td>TABLE SCAN</td>
<td>INDEX SEEK</td>
<td>INDEX SEEK</td>
</tr>
<tr>
<td>05</td>
<td>TABLE SCAN</td>
<td>TABLE SCAN</td>
<td>INDEX SEEK</td>
</tr>
<tr>
<td>06</td>
<td>TABLE SCAN</td>
<td>TABLE SCAN</td>
<td>CLUSTERED INDEX SCAN</td>
</tr>
</tbody>
</table>
<p>Nesse ponto, temos que sabe o que é a operação:</p>
<ul>
<li><strong>SCAN</strong> &#8211; busca em TODOS os elementos da estrutura (que pode ser uma tabela ou um índice);</li>
<li><strong>SEEK </strong>- busca binária nos elementos de um índice.</li>
</ul>
<p>Devemos atentar para a seguinte observação: SCAN é usado quando a tabela não possui índices que atendam ao select ou quando a quantidade de registros que a query retorna (em percentual) é grande. O SEEK é usado quando existe um índice que é adequado e a quantidade de registros retornados é pequena, percentualmente falando.</p>
<p>As operações executadas nas tabelas/índices foram:</p>
<ul>
<li><strong>TABLE SCAN</strong> &#8211; Busca em todos os elementos da tabela, de forma seqüencial;</li>
<li><strong>INDEX SCAN</strong> -Busca em todos os elementos  de um índice non-clustered, de forma seqüencial;</li>
<li><strong>CLUSTERED INDEX SCAN</strong> &#8211; Busca em todos os elementos  de um índice clustered, de forma seqüencial;</li>
<li><strong>INDEX SEEK</strong> &#8211; Busca binária num índice non-clustered;</li>
<li><strong>CLUSTERED INDEX SEEK</strong> &#8211; Busca binária num índice non-clustered.</li>
</ul>
<p> Agora, por que o  SQL Server criou planos de execução tão diferentes? Porque ele “sabe” (usando as estatísticas &#8211; assunto que abordarei em outro post) qual tipo de acesso tem maior probabilidade de retornar os dados pedidos no menor tempo possível.</p>
<p>E como o SQL Server escreve os índices no disco? Vamos lá.</p>
<p>Para essa explicação, vamos dropar o database que estávamos usando e recriá-lo, junto com a tabela pessoa. Após isso, vamos inserir as 8 pessoas (como fizemos no <span style="#cc0000;"><a title="Índices no SQL Server - parte 01" href="http://www.mxstudio.com.br/sql/indices-no-sql-server-parte-01/" target="_blank">post anterior</a></span>).</p>
<p>Lembro que, para dropar um banco, usamos os comandos:</p>
<p class="codigo"><span style="#0000ff;">USE<span style="x-small;"> MASTER<br />
</span><span style="#0000ff;">DROP</span><span style="x-small;"> </span><span style="#0000ff;">DATABASE</span><span style="x-small;"> EXEMPLO_INDICE</span></span></p>
<p>Após a criação da tabela, fazemos um select na <strong>tabela indexes</strong> do <strong>schema sys </strong>(que vou chamar, a partir de agora, de <strong>sys.indexes</strong>):</p>
<p class="codigo"><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"><br />
</span><span style="#0000ff;">FROM</span><span style="x-small;"> </span><span style="#008000;">SYS.INDEXES</span><span style="x-small;"><br />
</span><span style="#0000ff;">WHERE</span><span style="x-small;"> </span><span style="#ff00ff;">OBJECT_ID</span><span style="x-small;"> </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff00ff;">OBJECT_ID</span><span style="#808080;">(</span><span style="#ff0000;">‘PESSOA’</span><span style="#808080;">)</span></p>
<p>Vemos que existe uma linha na sys.indexes, mesmo PESSOA não tendo índice. Na realidade, sys.indexes armazena dados dos índices (quando existem) e das tabelas. Sabemos que a tabela não possui índice clustered porque seu <strong>type_desc</strong> é HEAP.</p>
<p>Nesse ponto, podemos executar os comandos abaixo, que vão nos mostrar como estão alocadas as páginas de dados para essa tabela:</p>
<p class="codigo"><span style="#0000ff;">DECLARE<span style="x-small;"> @DB_ID </span><span style="#0000ff;">INT</span><span style="#808080;">,</span><span style="x-small;"><br />
      @OBJECT_ID </span><span style="#0000ff;">INT<br />
SELECT</span><span style="x-small;"> @DB_ID </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff00ff;">DB_ID</span><span style="#808080;">(</span><span style="#ff0000;">‘EXEMPLO_INDICE’</span><span style="#808080;">),</span><span style="x-small;"><br />
      @OBJECT_ID </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff00ff;">OBJECT_ID</span><span style="#808080;">(</span><span style="#ff0000;">‘PESSOA’</span><span style="#808080;">)<br />
</span><span style="#008000;"><br />
</span><span style="#0000ff;">DBCC</span><span style="x-small;"> IND</span><span style="#808080;">(</span><span style="x-small;">@DB_ID</span><span style="#808080;">,</span><span style="x-small;"> @OBJECT_ID</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#808080;">-</span><span style="x-small;">1</span><span style="#808080;">)</span></span></p>
<p><img class="alignnone" src="http://www.50minutos.com.br/wp-content/uploads/2007/08/dbcc_ind.gif" alt="dbcc" /></p>
<p>Onde:</p>
<ul>
<li><strong>PagePID</strong> &#8211; é o número da página de dados onde a informação está escrita;</li>
<li><strong>IndexID </strong>- é o tipo de estrutura:
<ul>
<li>0 &#8211; página de dados;</li>
<li>1 &#8211; índice clustered;</li>
<li>2 a 255 &#8211; índices non-clustered;</li>
</ul>
</li>
<li><strong>PageType</strong> &#8211; é o tipo do dado armazenado:
<ul>
<li>1 &#8211; página de dados;</li>
<li>2 &#8211; página de índice;</li>
<li>10 &#8211; mapa de alocação de índices;</li>
</ul>
</li>
</ul>
<p>Executando o comando abaixo e fornecendo o valor de PagePID obtido com o script acima: </p>
<p class="codigo"><span style="#0000ff;">DECLARE<span style="x-small;"> @DB_ID </span><span style="#0000ff;">INT<br />
SELECT</span><span style="x-small;"> @DB_ID </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff00ff;">DB_ID</span><span style="#808080;">(</span><span style="#ff0000;">‘EXEMPLO_INDICE’</span><span style="#808080;">)<br />
</span><span style="#008000;"><br />
</span><span style="#0000ff;">DBCC</span><span style="x-small;"> TRACEON</span><span style="#808080;">(</span><span style="x-small;">3604</span><span style="#808080;">)<br />
</span><span style="#0000ff;">DBCC</span><span style="x-small;"> PAGE</span><span style="#808080;">(</span><span style="x-small;">@DB_ID</span><span style="#808080;">,</span><span style="x-small;"> 1</span><span style="#808080;">,</span><span style="x-small;"> 152</span><span style="#808080;">,</span><span style="x-small;"> 3</span><span style="#808080;">)<br />
</span><span style="#0000ff;">DBCC</span><span style="x-small;"> TRACEOFF</span><span style="#808080;">(</span><span style="x-small;">3604</span><span style="#808080;">)</span></span></p>
<p>Temos a descrição do conteúdo das página em questão.</p>
<p>Agora, recriamos o índice non-clustered, usando o mesmo comando do <a title="anterior" href="http://www.50minutos.com.br/?p=145" target="_blank"><span style="#cc0000;">post anterior</span></a>. Em seguida fazemos o select na sys.objects que, nesse momento, nos mostra a existência do índice non-clustered.</p>
<p>Executando o DBCC IND (acima) vemos que foram alocadas páginas para o índice.</p>
<p>Com o DBC PAGE (acima) vemos o conteúdo da página &#8211; temos que substituir o valor 152 (página de dados da tabela) por 154 (página que armazena os dados do índice).</p>
<p><img class="alignnone" src="http://www.50minutos.com.br/wp-content/uploads/2007/08/dbcc_page.gif" alt="dbcc page" /></p>
<p>Vemos, na figura acima, que existe uma coluna (HEAP RID) que aponta para o endereço do registro na página de dados.</p>
<p>Recriamos o índice clustered. Em seguida executamos os mesmos comandos mostrados anteriormente (select na sys.indexes, DBCC IND e DBCC PAGE para o índice non-clustered, trocando o número da página, claro &#8211; no meu servidor, 158).</p>
<p>Note que o <strong>type_desc</strong> do select mudou de HEAP para CLUSTERED.</p>
<p><img class="alignnone" src="http://www.50minutos.com.br/wp-content/uploads/2007/08/dbcc_page_ind_clustered.gif" alt="dbcc page ind clustered" /></p>
<p>A coluna que aponta para endereço do registro não é mais o HEAP RID e sim COD, que é a chave do índice clustered. Por isso que uma consulta por cod, nome (o select número 5) na tabela pessoa faz um <strong>table scan</strong> quando a tabela somente tem o índice non-clustered e <strong>index seek</strong> quando a tabela tem índices clustered e non-clustered.</p>
<p>Com esses dois posts temos uma visão (simplificada) de como os índices do Microsoft SQL Server 2005 funcionam.</p>
<p>Esse post também foi publicado no meu <a title="site do Agnaldo" href="http://www.50minutos.com.br" target="_blank">site</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-02/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Índices no SQL Server &#8211; parte 01</title>
		<link>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-01/</link>
		<comments>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-01/#comments</comments>
		<pubDate>Wed, 28 May 2008 14:59:43 +0000</pubDate>
		<dc:creator>Agnaldo Diogo dos Santos</dc:creator>
				<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=1500</guid>
		<description><![CDATA[Fala, gente&#8230; beleza? Agora estou escrevendo sobre o SQL Server para o MXStudio. É o banco de dados da Microsoft e (na minha opinião) o melhor que existe hoje no mercado. Com que dados eu fundamento isso? Experiência, fiote&#8230; experiência&#8230; Trabalhei alguns anos com Oracle, já desenvolvi em/para Access e MySQL, além do DB2 e Sybase. Mas eu gostei [...]]]></description>
			<content:encoded><![CDATA[<p>Fala, gente&#8230; beleza? Agora estou escrevendo sobre o SQL Server para o MXStudio. É o banco de dados da Microsoft e (na minha opinião) o melhor que existe hoje no mercado.</p>
<p>Com que dados eu fundamento isso? Experiência, fiote&#8230; experiência&#8230; Trabalhei alguns anos com Oracle, já desenvolvi em/para Access e MySQL, além do DB2 e Sybase. Mas eu gostei mesmo é do SQL Server. </p>
<p>Vamos ao assunto do post:</p>
<p>Um recurso que melhora muito a velocidade de acesso aos dados armazenados é o tal de <strong>índice</strong>. Já tinha publicado esse post no meu <a title="site do agnaldo" href="http://www.50minutos.com.br" target="_blank">site</a>, mas vale a pena rever pois é muito atual.</p>
<p><strong>Primeiro: </strong>qual a função de um índice? Melhorar o desempenho em consultas.</p>
<p><strong>Segundo: </strong>quais os tipos de índice que temos no SQL Server? Dois: CLUSTERED e NON-CLUSTERED.</p>
<p><strong>Terceiro:</strong> o que é um índice? É uma estrutura de árvore (balanceada &#8211; um tipo de árvore binária).</p>
<p><strong>Quarto: </strong>é mais rápido que pesquisar na tabela, mesmo? Agora sim apareceu <strong>A</strong> pergunta… vamos começar por ela.</p>
<p>Inicialmente, precisamos definir árvore binária: uma estrutura formada por nós (vértices) e por folhas. Os nós são para determinar a localização de uma informação qualquer (na figura - uma representação simplificada - abaixo, <strong>1-4</strong>, <strong>1-2</strong> e <strong>3-4</strong> são nós). As folhas (<strong>1</strong>, <strong>2</strong>, <strong>3</strong> e <strong>4</strong>, na figura abaixo) são as informações armazenadas.</p>
<p style="center;"><img class="alignnone" src="http://www.50minutos.com.br/wp-content/uploads/2007/07/arvbin.gif" alt="arvore binária" /></p>
<p>Imagine, agora, que minha tabela tenha somente 2 registros:  olhando para um deles saberei se é aquele que quero, ou não.</p>
<p>Se tiver 4 registros, devo procurar um máximo de 2 vezes. Veja a figura acima:</p>
<ul>
<li><strong>1a. pesquisa: </strong>o número  está entre 1 e 2 (na verdade, é a leitura do nó que contém <strong>1-2</strong>)?</li>
<li><strong>2a. pesquisa: </strong>se o número está entre 1 e 2: o número é 1 (leitura da folha que tem o conteúdo <strong>1</strong>)? Se for, ok. Se não for, é o <strong>2</strong>. Ou:</li>
<li><strong>2a. pesquisa: </strong>se o número não está entre 1 e 2: o número é 3 (leitura da folha que tem o conteúdo <strong>3</strong>)? Se for, ok. Se não for, é o <strong>4</strong>.</li>
</ul>
<p>Extrapolando, podemos montar uma tabela como abaixo, já que sabemos ser o número de pesquisas necessárias igual ao expoente a que 2 deve ser elevado para “dar” a quantidade de registros:</p>
<table border="1" width="100%">
<tbody>
<tr>
<th>QTD REGISTROS</th>
<th>LEITURAS</th>
<th> </th>
</tr>
<tr>
<td>até 2</td>
<td>1</td>
<td>2 = 2<sup>1</sup></td>
</tr>
<tr>
<td>até 4</td>
<td>2</td>
<td>4 = 2<sup>2</sup></td>
</tr>
<tr>
<td>até 8</td>
<td>3</td>
<td>8 = 2<sup>3</sup></td>
</tr>
<tr>
<td>…</td>
<td>…</td>
<td>…</td>
</tr>
<tr>
<td>até 1.024</td>
<td>10</td>
<td>1.024 = 2<sup>10</sup></td>
</tr>
<tr>
<td>até 1.048.576</td>
<td>20</td>
<td>1.048.576 = 2<sup>20</sup></td>
</tr>
</tbody>
</table>
<p>Mas, onde esses índices são gravados? Ops… Onde qualquer dado (tabela ou índice) é gravado? A resposta é: numa estrutura chamada <strong>PAGE</strong>. Uma page (página de dados) tem 8kB (8.192 bytes). Desse valor, tiramos 96 bytes, que são usados para endereçamento interno. O que sobra (8.096 bytes) está disponível para armazenamento de dados.</p>
<p>Uma page pode conter dados de tabelas ou de índices. Outra coisa: uma page somente pode conter dados de uma <strong>ÚNICA </strong>tabela ou de um <strong>ÚNICO </strong>índice.</p>
<p>Agora, sim. Podemos dizer que:</p>
<ul>
<li>ÍNDICE NON-CLUSTERED &#8211; tem os nós e folhas gravados em páginas de dados independentes da tabela;</li>
<li>ÍNDICE CLUSTERED &#8211; os nós são uma estrutura separada da tabela, mas as folhas são os próprios registros. As duas estruturas (índice e tabela) são mescladas.</li>
</ul>
<p>Para os exemplos seguintes, usaremos a tabela criada com o bloco de comandos abaixo:</p>
<p class="codigo"><span style="#0000ff;">CREATE<span style="x-small;"> </span><span style="#0000ff;">DATABASE</span><span style="x-small;"> EXEMPLO_INDICE<br />
GO<br />
</span><span style="#0000ff;">USE</span><span style="x-small;"> EXEMPLO_INDICE<br />
</span></span></p>
<p class="codigo"><span style="#0000ff;"><span style="#0000ff;">CREATE</span><span style="x-small;"> </span><span style="#0000ff;">TABLE</span><span style="x-small;"> PESSOA<br />
</span><span style="#808080;">(<br />
</span><span style="x-small;">      COD </span><span style="#0000ff;">INT</span><span style="x-small;"> </span><span style="#808080;">NOT</span><span style="x-small;"> </span><span style="#808080;">NULL,<br />
</span><span style="x-small;">      NOME </span><span style="#0000ff;">VARCHAR</span><span style="#808080;">(</span><span style="x-small;">50</span><span style="#808080;">),</span><span style="x-small;"><br />
      SEXO </span><span style="#0000ff;">CHAR</span><span style="#808080;">(</span><span style="x-small;">1</span><span style="#808080;">)<br />
)</span></span></p>
<p>Inserimos alguns registros:</p>
<p class="codigo"><span style="#0000ff;">INSERT<span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">1</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘BRUNO’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘M’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">2</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘NETINHO’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘M’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">3</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘PEDRO’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘M’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">4</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘M’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">5</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘MARIA’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘F’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">6</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘ANA MARIA’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘F’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">7</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘MARIANA’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘F’</span><span style="#808080;">)<br />
</span><span style="#0000ff;">INSERT</span><span style="x-small;"> </span><span style="#0000ff;">INTO</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">VALUES</span><span style="#808080;">(</span><span style="x-small;">8</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘MARINA’</span><span style="#808080;">,</span><span style="x-small;"> </span><span style="#ff0000;">‘F’</span><span style="#808080;">)</span></span></p>
<p>Agora, vamos fazer alguns selects e ver qual é o <strong>plano de execução</strong> gerado. Eita nóis… O que é um plano de execução? Plano de execução é um “mapa” gerado pelo <strong>mecanismo relacional</strong> que informa ao <strong>mecanismo de armazenamento</strong> onde ler ou gravar no disco, se vai acessar a tabela diretamente ou se vai usar um índice, se a pesquisa é feita por seek ou por scan.</p>
<p>De novo: eita ferro!!! O que são esses mecanismos? Quando instalamos o SQL Server e iniciamos o serviço MSSQLSERVER, temos na memória três elementos:</p>
<ul>
<li><strong>Mecanismo relacional </strong>- responsável por gerar um plano de execução baseado nas estatísticas associadas aos dados das tabelas/índices;</li>
<li><strong>Mecanismo de armazenamento </strong>- responsável por acessar uma tabela ou índice, acompanhando o definido no plano de execução;</li>
<li><strong>ODS &#8211; open data services</strong> &#8211; fica “vigiando” uma porta do micro, esperando conexões de clientes. A porta padrão para o SQL Server é a 1433. Esse processo se chama <strong>listening</strong>.</li>
</ul>
<p>Como vejo um plano de execução? Basta habilitar sua apresentação através das teclas de atalho [CTRL] + [M] ou acessar a opção [Include Actual Execution Plan] do menu [Query]. Para testar, podemos selecionar alguns dados da tabela, usando:</p>
<p class="codigo"><span style="#0000ff;">SELECT<span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA</span></span><span style="#0000ff;"> </span></p>
<p>O plano de execução apresentado é:</p>
<p style="center;"><img class="alignnone" src="http://www.50minutos.com.br/wp-content/uploads/2007/07/planoexecucao.gif" alt="plano de execução" /></p>
<p>Onde Table Scan é o operador que significa que foi feito um acesso sequencial a todos os elementos da tabela Pessoa.</p>
<p>Para qualquer um dos comandos o plano de execução gerado é o mesmo:</p>
<p class="codigo"><span style="#0000ff;">SELECT<span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> COD </span><span style="#808080;">=</span><span style="x-small;"> 1<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> COD</span><span style="#808080;">,</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’</span></span></p>
<p>Agora, vamos criar um índice do tipo non-clustered para o campo <strong>NOME</strong> da tabela, usando o comando:</p>
<p class="codigo"><span style="x-small;"><span style="#0000ff;">CREATE NONCLUSTERED INDEX</span> INDEX_PESSOA_NOME <span style="#0000ff;">ON</span> PESSOA<span style="#808080;">(NOME)</span></span></p>
<p>Executando os comandos abaixo, temos planos de execução (uso de operadores) diversos:</p>
<p class="codigo"><span style="#0000ff;">SELECT<span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA<br />
</span><span style="#008000;">–-TABLE SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> COD </span><span style="#808080;">=</span><span style="x-small;"> 1<br />
</span><span style="#008000;">–-TABLE SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA<br />
</span><span style="#008000;">–-INDEX SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-INDEX SEEK<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> COD</span><span style="#808080;">,</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-TABLE SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-TABLE SCAN</span></span></p>
<p>Criamos agora, um índice clustered, para o campo <strong>COD</strong> da tabela:</p>
<p class="codigo"><span style="x-small;"><span style="#0000ff;">CREATE CLUSTERED INDEX</span> INDEX_PESSOA_COD <span style="#0000ff;">ON</span> PESSOA<span style="#808080;">(COD)</span></span></p>
<p>E executamos os mesmos comandos:</p>
<p class="codigo"><span style="#0000ff;">SELECT<span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA<br />
</span><span style="#008000;">–-CLUSTERED INDEX SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> COD </span><span style="#808080;">=</span><span style="x-small;"> 1<br />
</span><span style="#008000;">–-CLUSTERED INDEX SEEK<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA<br />
</span><span style="#008000;">–-INDEX SCAN<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-INDEX SEEK<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> COD</span><span style="#808080;">,</span><span style="x-small;"> NOME </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-INDEX SEEK<br />
</span><span style="#0000ff;">SELECT</span><span style="x-small;"> </span><span style="#808080;">*</span><span style="x-small;"> </span><span style="#0000ff;">FROM</span><span style="x-small;"> PESSOA </span><span style="#0000ff;">WHERE</span><span style="x-small;"> NOME </span><span style="#808080;">=</span><span style="x-small;"> </span><span style="#ff0000;">‘AGNALDO’<br />
</span><span style="#008000;">–-CLUSTERED INDEX SCAN</span></span></p>
<p>&#8230; continua &#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/tecnologia/sql/indices-no-sql-server-parte-01/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

