<?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>Thiago Zavaschi R2 &#187; SQL Server 2008</title>
	<atom:link href="http://zavaschi.com/index.php/category/sql-server-2008/feed/" rel="self" type="application/rss+xml" />
	<link>http://zavaschi.com</link>
	<description>www.zavaschi.com</description>
	<lastBuildDate>Mon, 02 Jan 2012 16:51:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Melhores pr&#225;ticas &#8211; Compress&#227;o de Dados</title>
		<link>http://zavaschi.com/index.php/2011/07/melhores-prticas-compresso-de-dados/</link>
		<comments>http://zavaschi.com/index.php/2011/07/melhores-prticas-compresso-de-dados/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 16:49:00 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[Data Compression]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/07/melhores-prticas-compresso-de-dados/</guid>
		<description><![CDATA[Olá pessoal,
Vocês conhecem as melhores práticas, estratégias e execução de capacity planning quando o assunto é compressão de dados?
A feature de compressão de dados (e de backup) está disponível desde o SQL Server 2008 mas ainda é pouco explorada nos ambientes que conheço.
Recomendo o seguinte whitepaper de maio de 2009 (não contempla o SQL Server [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Olá pessoal,</p>
<p align="justify">Vocês conhecem as melhores práticas, estratégias e execução de capacity planning quando o assunto é compressão de dados?</p>
<p align="justify">A feature de compressão de dados (e de backup) está disponível desde o SQL Server 2008 mas ainda é pouco explorada nos ambientes que conheço.</p>
<p align="justify">Recomendo o seguinte whitepaper de maio de 2009 (não contempla o SQL Server 2008 R2, que ganhou a capacidade de compactação em Unicode também):</p>
<p align="justify"><a title="http://msdn.microsoft.com/en-us/library/dd894051(SQL.100).aspx" href="http://msdn.microsoft.com/en-us/library/dd894051(SQL.100).aspx">http://msdn.microsoft.com/en-us/library/dd894051(SQL.100).aspx</a></p>
<p align="justify">Para saber mais sobre a compactação no SQL Server 2008 R2, recomendo:</p>
<p align="justify"><a title="http://www.mssqltips.com/tip.asp?tip=2019" href="http://www.mssqltips.com/tip.asp?tip=2019">http://www.mssqltips.com/tip.asp?tip=2019</a></p>
<p align="justify">Os artigos são em inglês. Em breve publico uma adaptação aqui no blog para o português.</p>
<p align="justify">Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/07/melhores-prticas-compresso-de-dados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como saber quem est&#225; conectado no meu servidor do Analysis Services?</title>
		<link>http://zavaschi.com/index.php/2011/06/como-saber-quem-est-conectado-no-meu-servidor-do-analysis-services/</link>
		<comments>http://zavaschi.com/index.php/2011/06/como-saber-quem-est-conectado-no-meu-servidor-do-analysis-services/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 18:23:04 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[DMV]]></category>
		<category><![CDATA[Resource Monitoring]]></category>
		<category><![CDATA[SSAS]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/06/como-saber-quem-est-conectado-no-meu-servidor-do-analysis-services/</guid>
		<description><![CDATA[Olá pessoal!
Recebi essa dúvida no meu e-mail e por ser pertinente estou fazendo esse post.
“Como saber quem está conectado no meu servidor do Analysis Services?”
A resposta é simples: existem DMVs no SSAS (!!!) que podem retornar informações sobre recursos, objetos e desempenho. As DMVs em geral são utilizadas no database engine, mas existem no servidor [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Olá pessoal!</p>
<p align="justify">Recebi essa dúvida no meu e-mail e por ser pertinente estou fazendo esse post.</p>
<p align="justify"><em>“Como saber quem está conectado no meu servidor do Analysis Services?”</em></p>
<p align="justify">A resposta é simples: <strong>existem DMVs no SSAS (!!!)</strong> que podem retornar informações sobre recursos, objetos e desempenho. As DMVs em geral são utilizadas no database engine, mas existem no servidor de análise também.</p>
<p align="justify">Mais diretamente, para saber quem está conectado no meu servidor SSAS basta executar:</p>
<p align="justify"><strong><font face="Courier New">SELECT * FROM $system.DISCOVER_CONNECTIONS</font></strong></p>
<p align="justify">A DMV similar a procedure <em>sp_who2 </em>para o Analysis Services é a seguinte:</p>
<p align="justify"><strong><font face="Courier New">SELECT * FROM $system.DISCOVER_Commands</font></strong></p>
<p align="justify">Para obter uma listagem de todas as DMVs que podem receber consultas, utilize:</p>
<p align="justify"><strong><font face="Courier New">SELECT * FROM $system.dbschema_tables        <br />WHERE Table_Schema = '$SYSTEM'</font></strong></p>
<p align="justify">Como referência posso citar o livro: <a href="http://www.amazon.com/Microsoft-Server-Analysis-Services-Unleashed/dp/0672330016/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1308680365&amp;sr=8-1" target="_blank">Microsoft SQL Server Analysis Services Unleashed</a>, capítulo 41: Resource Monitoring.</p>
<p align="justify">Abraços e até o próximo post!</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/06/como-saber-quem-est-conectado-no-meu-servidor-do-analysis-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server e SQL Azure &#8211; Licenciamento + Billing</title>
		<link>http://zavaschi.com/index.php/2011/05/sql-server-e-sql-azure-licenciamento-billing/</link>
		<comments>http://zavaschi.com/index.php/2011/05/sql-server-e-sql-azure-licenciamento-billing/#comments</comments>
		<pubDate>Tue, 31 May 2011 18:18:56 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[Licenciamento]]></category>
		<category><![CDATA[SQL Azure]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/05/sql-server-e-sql-azure-licenciamento-billing/</guid>
		<description><![CDATA[Então pessoal, como estão?
Sei que estou postando fortemente sobre Business Intelligence, mas hoje gostaria de iniciar algo diferente.
Se eu fosse elencar as dúvidas que recebo mais frequentemente dos clientes e parceiros, com certeza seria licenciamento em primeiro lugar.
A plataforma de dados da Microsoft é o SQL Server e o seu braço na nuvem é o [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Então pessoal, como estão?</p>
<p align="justify">Sei que estou postando fortemente sobre <em><a href="http://zavaschi.com/index.php/business-intelligence/" target="_blank">Business Intelligence</a></em>, mas hoje gostaria de iniciar algo diferente.</p>
<p align="justify">Se eu fosse elencar as dúvidas que recebo mais frequentemente dos clientes e parceiros, com certeza seria licenciamento em primeiro lugar.</p>
<p align="justify">A plataforma de dados da Microsoft é o SQL Server e o seu braço na nuvem é o SQL Azure. Por isso vou dividir esse conjunto de posts da seguinte forma (vou adicionar os links a esse post conforme os posts seguintes saírem), mas não necessariamente nesta mesma ordem.</p>
<ul>
<li>
<div align="justify"><a href="http://zavaschi.com/index.php/2011/06/licenciamento-de-sql-server-server-cal-ou-por-processador/" target="_blank">Server com CAL ou por processador?</a></div>
</li>
<li>
<div align="justify">SQL Server, Analysis Services, Integration Services, preciso de uma licença para cada um?</div>
</li>
<li>
<div align="justify">SQL Server com Cluster, Mirror e Log Shipping, o que preciso licenciar?</div>
</li>
<li>
<div align="justify">SQL Server virtualizado e ambientes híbridos: Virtualizado + não-virtualizado.</div>
</li>
<li>
<div align="justify">SQL Azure – Espaço, transferência? Como funciona e quanto custa?</div>
</li>
</ul>
<p align="justify">A ideia dos posts é não é entrar na precificação (com excessão do SQL Azure), pois há várias modalidades contratuais e esses aspectos de contratos e programas de relacionamento com a Microsoft eu não irei abordar.</p>
<p align="justify"><em>Gostaria de um feedback de vocês que leem o blog (nos comentários) sobre esta sequência de posts. Isso é muito importante! Aceito sugestões!!</em></p>
<p align="justify">Abraços,    <br />Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/05/sql-server-e-sql-azure-licenciamento-billing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Permiss&#227;o para ver a estrutura, mas sem os dados!</title>
		<link>http://zavaschi.com/index.php/2011/01/permisso-para-ver-a-estrutura-mas-sem-os-dados/</link>
		<comments>http://zavaschi.com/index.php/2011/01/permisso-para-ver-a-estrutura-mas-sem-os-dados/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 17:59:48 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[DENY]]></category>
		<category><![CDATA[GRANT]]></category>
		<category><![CDATA[Permissão]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/01/permisso-para-ver-a-estrutura-mas-sem-os-dados/</guid>
		<description><![CDATA[Recentemente o Carlos Barini (http://twitter.com/cabarini) me perguntou se era possível liberar para um user ver a estrutura de uma tabela, mas não ter a permissão de leitura na tabela.
É possível sim, claro que a configuração do permissionamento pode ser adaptado para cada caso. No exemplo aqui vou concentrar nesse caso perguntado.
Vamos criar um login e [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Recentemente o Carlos Barini (<a href="http://twitter.com/cabarini">http://twitter.com/cabarini</a>) me perguntou se era possível liberar para um user ver a estrutura de uma tabela, mas não ter a permissão de leitura na tabela.</p>
<p align="justify">É possível sim, claro que a configuração do permissionamento pode ser adaptado para cada caso. No exemplo aqui vou concentrar nesse caso perguntado.</p>
<p align="justify">Vamos criar um login e um user na database “demo”.</p>
<p align="justify"><font face="Courier New">USE [master]     <br />GO      <br />CREATE LOGIN [usuario] WITH PASSWORD=N'123', DEFAULT_DATABASE=[demo], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF      <br />GO      <br />USE [demo]      <br />GO      <br />CREATE USER [usuario] FOR LOGIN [usuario]      <br />GO</font></p>
<p align="justify">Vamos usar a mesma tabela de empregados que usamos no <a href="http://zavaschi.com/index.php/2011/01/auditoria-no-sql-server-sql-audit" target="_blank">artigo anterior</a>. </p>
<p align="justify">O usuário “usuario” tem permissão de select na tabela. O que podemos fazer é simplesmente:</p>
<p align="justify">1) Remover a permissão de select no objeto.</p>
<p align="justify">2) GRANT na permissão de VIEW DEFINITION:</p>
<p align="justify"><font face="Courier New">DENY SELECT ON [dbo].[Empregado] TO [usuario]</font></p>
<p align="justify"><font face="Courier New">GRANT VIEW DEFINITION ON [dbo].[Empregado] TO [usuario]     <br /></font></p>
<p align="justify">E teremos ao executar o select:</p>
<p align="justify"><font color="#ff0000" face="Courier New">Msg 229, Level 14, State 5, Line 1     <br />The SELECT permission was denied on the object 'Empregado', database 'demo', schema 'dbo'.</font></p>
<p align="justify">Mas ao tentar ver a estrutura:</p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2011/01/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 2px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://zavaschi.com/wp-content/uploads/2011/01/image_thumb1.png" width="330" height="262" /></a></p>
<p align="justify">Espero que te ajude Carlos!</p>
<p align="justify">Grande abraço,   <br />Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/01/permisso-para-ver-a-estrutura-mas-sem-os-dados/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Auditoria no SQL Server &#8211; SQL Audit</title>
		<link>http://zavaschi.com/index.php/2011/01/auditoria-no-sql-server-sql-audit/</link>
		<comments>http://zavaschi.com/index.php/2011/01/auditoria-no-sql-server-sql-audit/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 20:22:20 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Audit]]></category>
		<category><![CDATA[SQL Server Audit]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/01/auditoria-no-sql-server-sql-audit/</guid>
		<description><![CDATA[Olá a todos!
No último artigo vimos o que, na minha opinião, é o carro chefe do SQL Server 2008 (“new” feature), o Resource Governor. Mas não é só isso!
Hoje vamos ver sobre auditoria! :)
Há diferentes formas de se fazer auditoria no SQL Server: triggers, CDC, Audit, entre outras.
O que veremos hoje é o audit e [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos!</p>
<p align="justify">No <a href="http://zavaschi.com/index.php/2011/01/sql-server-resource-governor/" target="_blank">último artigo</a> vimos o que, na minha opinião, é o carro chefe do SQL Server 2008 (“new” feature), o Resource Governor. Mas não é só isso!</p>
<p align="justify">Hoje vamos ver sobre auditoria! :)</p>
<p align="justify">Há diferentes formas de se fazer auditoria no SQL Server: triggers, CDC, Audit, entre outras.</p>
<p align="justify">O que veremos hoje é o audit e serve (não só) para responder dúvidas como:</p>
<p align="justify"><em>“Tenho uma aplicação de recursos humanos e que possui uma tabela com o salário dos funcionários, tem como eu saber os usuários que executaram um comando de select sobre essa tabela?” </em>(sim é possível, além de ser menos custoso do que rodar um profiler contra a base e ainda filtrando sobre a tabela desejada (parse de texto)).</p>
<p align="justify">Para efeito de simplicidade imagine que o seu cenário tenha a seguinte tabela:</p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2011/01/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://zavaschi.com/wp-content/uploads/2011/01/image_thumb.png" width="174" height="99" /></a></p>
<p>O script para criação da tabela:</p>
<p><em><font face="Courier New">CREATE TABLE Empregado       <br />( idEmpregado INT IDENTITY PRIMARY KEY,        <br />nome VARCHAR(100) NOT NULL,        <br />valor MONEY NOT NULL)        <br />GO        <br /></font></em></p>
<p align="justify">O log de auditoria pode ir para três destinos distintos: arquivo, security log e application log (do servidor onde o SQL Server roda).</p>
<p align="justify">O primeiro passo é criar um Audit:</p>
<blockquote><p align="justify">Pelo Management Studio: (Security &gt; Audits &gt; New Audit) </p>
<p align="justify">Ou através de scripts.</p>
</blockquote>
<p align="justify">Para cada destino escolhido há configurações específicas. Segue o script para criar o Audit para arquivo:</p>
<p><em><font face="Courier New">USE [master]       <br />GO        <br />CREATE SERVER AUDIT [AuditoriaSalario]        <br />TO FILE         <br />(&#160;&#160;&#160; FILEPATH = N'C:\Temp'        <br />&#160;&#160;&#160; ,MAXSIZE = 0 MB        <br />&#160;&#160;&#160; ,MAX_ROLLOVER_FILES = 2147483647        <br />&#160;&#160;&#160; ,RESERVE_DISK_SPACE = OFF        <br />)        <br />WITH        <br />(&#160;&#160;&#160; QUEUE_DELAY = 1000        <br />&#160;&#160;&#160; ,ON_FAILURE = CONTINUE        <br />)</font></em></p>
<p align="justify"><font face="Courier New">Após isso você</font> precisa criar uma especificação da auditoria (Audit Specification) que pode ser Server Audit Specification (Security &gt; Server Audit Specifications &gt; New Server Audit Specification…) ou Database Audit Specification (DatabaseName &gt; Security &gt; Database Audit Specification), que mapeiam efetivamente os objetos (ou servidores) sendo monitorados e conecta a um Audit (que nada mais é que a configuração do local aonde estarão os dados da auditoria).</p>
<p align="justify">Existem MUITOS tipos de ações de auditoria (Audit Action Type). No nosso exemplo (para responder ao questionamento inicial) vamos utilizar Database Audit Specification (pois o objeto a ser monitorado é uma tabela de uma base de dados específica).</p>
<p align="justify">O comando abaixo cria a especificação (public que é o role sendo monitorado):</p>
<p><em><font face="Courier New">CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Salario]       <br />FOR SERVER AUDIT [AuditoriaSalario]        <br />ADD (SELECT ON OBJECT::[dbo].[Empregado] BY [public])</font></em></p>
<p>Depois disso temos que ativar a auditoria:</p>
<p><em><font face="Courier New">USE [master]       <br />GO</font></em></p>
<p><em><font face="Courier New">ALTER SERVER AUDIT AuditoriaSalario       <br />WITH (STATE = ON);        <br />GO</font></em></p>
<p><em><font face="Courier New">USE [demo]       <br />GO</font></em></p>
<p><em><font face="Courier New">ALTER DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Salario]       <br />WITH (STATE = ON)        <br />GO</font></em></p>
<p>Beleza.. Auditoria “de pé”! Vamos inserir alguns dados na tabela de Empregado (sintaxe SQL2008+):</p>
<p><em><font face="Courier New">INSERT INTO [demo].[dbo].[Empregado]       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ([nome],[valor])        <br />&#160;&#160;&#160;&#160; VALUES        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ('Thiago', 15000),        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ('Joao', 1000),        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ('Pedro', 7500)        <br />GO</font></em></p>
<p>E na sequência vamos fazer um select para descobrir o meu salário:</p>
<p><em><font face="Courier New">SELECT 'Valor do Salário: ' + CONVERT(VARCHAR,valor) FROM Empregado WHERE nome = 'Thiago' </font></em></p>
<p>Se tudo foi configurado corretamente, devemos ter no arquivo essa informação logada.</p>
<p>O arquivo não é plain text, para ler basta executar o seguinte comando:</p>
<p><font face="Courier New">SELECT * FROM sys.fn_get_audit_file (N'C:\Temp\*',default,default);</font></p>
<p>E lá estão os selects que executei. Para facilitar, uma visão resumida:</p>
<p><em><font face="Courier New">SELECT        <br />event_time 'horario',         <br />database_name + '.' + schema_name + '.' + object_name 'objeto',         <br />statement,         <br />server_principal_name 'login',         <br />session_server_principal_name 'user'        <br />FROM sys.fn_get_audit_file (N'C:\Temp\*',default,default)        <br />WHERE action_id = 'SL';</font></em></p>
<p>Que retorna (no meu caso):</p>
<p><em><font face="Courier New">Horario: 2011-01-19 20:04:37.0349242&#160;&#160;&#160; <br />Objeto: demo.dbo.Empregado&#160;&#160;&#160; <br />Statement: SELECT 'Valor do Salário: ' + CONVERT(VARCHAR,valor) FROM Empregado WHERE nome = 'Thiago'&#160;&#160;&#160;&#160;&#160;&#160; <br />Login: SOUTHAMERICA\v-thzava&#160;&#160;&#160; <br />User: SOUTHAMERICA\v-thzava</font></em></p>
<p align="justify">E relembrando que isso pode ser enviado ao security log ou app log (onde até mesmo um sysadmin do banco pode não ter acesso <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://zavaschi.com/wp-content/uploads/2011/01/wlEmoticon-smile.png" />).</p>
<p align="justify">É isso pessoal, espero que tenham gostado!</p>
<p align="justify">Em caso de dúvidas entrem em contato!</p>
<p>Abraços,   <br />Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/01/auditoria-no-sql-server-sql-audit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SQL Server Resource Governor WhitePaper</title>
		<link>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor-whitepaper-2/</link>
		<comments>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor-whitepaper-2/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 00:52:47 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/01/sql-server-resource-governor-whitepaper-2/</guid>
		<description><![CDATA[E ae galera!
Então.. para complementar o assunto sobre Resource Governor segue o link para um whitepaper MUITO bom da Microsoft sobre o assunto:
http://msdn.microsoft.com/en-us/library/ee151608%28SQL.100%29.aspx
Recomendo a leitura!
Abraços,
Thiago Zavaschi
]]></description>
			<content:encoded><![CDATA[<p>E ae galera!</p>
<p>Então.. para complementar o assunto sobre Resource Governor segue o link para um whitepaper MUITO bom da Microsoft sobre o assunto:</p>
<p><a title="http://msdn.microsoft.com/en-us/library/ee151608%28SQL.100%29.aspx" href="http://msdn.microsoft.com/en-us/library/ee151608%28SQL.100%29.aspx">http://msdn.microsoft.com/en-us/library/ee151608%28SQL.100%29.aspx</a></p>
<p>Recomendo a leitura!</p>
<p>Abraços,<br />
Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor-whitepaper-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server Resource Governor</title>
		<link>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor/</link>
		<comments>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 13:00:04 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Resource Governor]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2011/01/sql-server-resource-governor/</guid>
		<description><![CDATA[Oi pessoal!
Há algum tempo atrás eu havia iniciado um artigo para a SQL Magazine, mas devido a alguns compromissos não pude finalizar/enviar para a revista.
O artigo está praticamente finalizado e é sobre Resource Governor. Segue o artigo:
Introdução
O Resource Governor é um mecanismo da plataforma SQL Server, tendo seu aparecimento na versão 2008, para controlar o [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Oi pessoal!</p>
<p align="justify">Há algum tempo atrás eu havia iniciado um artigo para a SQL Magazine, mas devido a alguns compromissos não pude finalizar/enviar para a revista.</p>
<p align="justify">O artigo está praticamente finalizado e é sobre Resource Governor. Segue o artigo:</p>
<p align="justify"><strong>Introdução</strong></p>
<p align="justify">O Resource Governor é um mecanismo da plataforma SQL Server, tendo seu aparecimento na versão 2008, para controlar o acesso a recursos de memória e processamento. Boa gerência dos recursos disponíveis para o SQL Server pode significar o sucesso ou o fracasso da sua solução de negócio baseada neste sistema gerenciador de bancos de dados (SGBD).</p>
<p align="justify">A ideia deste artigo é demonstrar o recurso, onde e como se aplica, e sensibilizar o leitor no que tange a considerações relacionadas à concorrência que ocorre sobre os recursos do(s) servidor(es).</p>
<p align="justify"><strong>Já viu este cenário?</strong></p>
<p align="justify">A aplicação tem seu desenvolvimento concluído (ou é gerado um release ao final de um ciclo), é colocada em um ambiente de validação/homologação e nesta etapa são feitos os testes para verificar a regra de negócio. Colocando os méritos das técnicas de validação um pouco de lado e assumindo que está tudo de acordo, a aplicação é, por fim, posta em produção. E é aí que os problemas mais graves começam...</p>
<p align="justify">Algumas semanas depois da aplicação estar em produção, os usuários começam a relatar problemas como a lentidão no sistema, timeouts (especialmente se for uma aplicação web), e etc. Esses problemas são relatados ao mesmo tempo em que as verificações feitas no banco de dados indicam que o consumo de memória e CPU estão próximos ao limite.</p>
<p align="justify">Uma análise mais detalhada mostra que a causa da lentidão é causada pela geração dos relatórios, pois os mesmo são extraídos a partir da base de dados de produção. Existem diversas estratégias que podem ser utilizadas para contornar o problema: replicação, espelhamento (mirroring), solução utilizando BI e bases OLAP, etc, etc, etc. Mesmo com a adoção de uma destas estratégias o uso do resource governor é interessante conforme veremos na sequência.</p>
<p align="justify">Em um cenário em que a compra de um novo servidor ou a utilização de uma solução de BI não é factível o resource governor pode dar um grande auxílio!</p>
<p align="justify"><strong>Mas o que é o resource governor?</strong></p>
<p align="justify">O resource governor é “simplesmente” um mecanismo para a gerência dos recursos de memória e processador utilizados pelo SQL Server. Com o resource governor é possível classificar as queries disparadas contra a base de dados em workload groups pré-definidos, e estes, por sua vez, são mapeados em resource pools que efetivamente definem as limitações de memória e processamento.</p>
<p align="justify">As queries precisam ser classificadas em um dos workload groups criados, tal tarefa é executada por uma função de classificação (classifier function). O código desta função deve ser muito escrito, para garantir o tratamento adequado das queries, que podem ter características de mais de um workload group. A figura 1 contempla um esquema deste mecanismo.</p>
<p align="justify">Mas em quais cenários o Resource Governor é interessante ser aplicado? Principalmente para três cenários: Controle de queries “soltas” executadas no banco; controle da concorrência previsível de workloads (base de produção x relatórios, por exemplo); e a priorização dos workloads.</p>
<p align="center"><a href="http://zavaschi.com/wp-content/uploads/2011/01/clip_image002.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 2px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://zavaschi.com/wp-content/uploads/2011/01/clip_image002_thumb.jpg" width="244" height="236" /></a></p>
<p align="center"><b>Figura 1</b>. Arquitetura macro do mecanismo de Resouce Governor</p>
<p><strong>Criando Resource Pools</strong></p>
<p align="justify">Os resource pools representam os recursos físicos do servidor (memória e CPU). No SQL Server 2008 estes pools definem as quantidades máxima e mínima da utilização dos recursos. Existem livros que tratam resource pools como sendo instâncias virtuais do SQL Server, eu penso que é quase isso, visto que poderíamos ter uma separação mais consistente (além de memória e CPU). No SQL Server 2008 existem dois resource pools pré-definidos: Internal e o Default.</p>
<p align="justify">O pool internal é usado somente pela engine do SQL Server, não é possível apagá-lo ou fazer quaisquer alterações sobre as suas capacidades mínimas e máximas sobre os recursos.</p>
<p align="justify">O pool default será usado pelos workloads que não estão associados a nenhum resource pool. Caso o resource governor não esteja configurado na sua instância do SQL Server, todas as suas queries executarão neste pool. Não é possível apagá-lo ou alterá-lo, com exceção aos seus valores máximos e mínimos associados aos recursos que podem ser configurados.</p>
<p align="justify">Os administradores de bancos de dados podem criar novos resource pools. Seguindo o raciocínio do cenário anterior, vamos criar dois pools: um para as queries “normais” e outro para as queries executadas para extrair dados para os relatórios. A <b>listagem 1</b> mostra o comando Transact-SQL para a criação do Resource Pool. Um detalhe importante é que a soma dos valores mínimos dos pools não pode ser maior que 100 %. O valor máximo individual de cada pool é de até 100 %, mas devemos lembrar de que este valor não será o real caso haja mais de um pool com este valor máximo. O cálculo do valor máximo efetivo deve ser feito subtraindo a soma dos demais mínimos, e este sim será o valor mais elevado atingido pelo SQL Server. Para nossos exemplos, inicialmente colocaremos ambos os pools com percentual máximo de 100 % de CPU.</p>
<p><em><b>Listagem 1</b>. Criação dos Resource Pools</em></p>
<p>CREATE RESOURCE POOL NormalQueries</p>
<p>WITH (MAX_CPU_PERCENT = 100)</p>
<p>CREATE RESOURCE POOL RelatorioQueries</p>
<p>WITH (MAX_CPU_PERCENT = 100)</p>
<p align="justify">A sintaxe associada aos Resource Pools e os parâmetros passíveis de configuração, podem ser vistos na <b>listagem 2 </b>(o “valor” é um número correspondido de 1 a 100, para os valores máximos, e de 0 a 100 para os valores mínimos). Acredito que o nome dos parâmetros e a sintaxe são auto explicativos e por isso não entrarei em maiores detalhes, para mais informações consultar o Books Online do SQL Server 2008). Um detalhe importante é a utilização de aspas (“, ”) ou de colchetes ([, ]) na palavra <b>default </b>para evitar conflitos com a palavra reservada DEFAULT, isto vale para as sintaxes subseqüentes também).</p>
<p align="justify"><em><b>Listagem 2</b>. Sintaxe e Parâmetros Configuráveis - Resource Pool</em></p>
<p>CREATE|ALTER|DROP RESOURCE POOL { <i>pool_name</i> | &quot;default&quot; }    </p>
<p>[WITH</p>
<p><b>( </b>[ MIN_CPU_PERCENT <b>=</b> <i>valor </i>]</p>
<p>&#160;&#160;&#160;&#160; [ [ <b>, </b>] MAX_CPU_PERCENT <b>=</b> <i>valor </i>]</p>
<p>&#160;&#160;&#160;&#160; [ [ <b>, </b>] MIN_MEMORY_PERCENT <b>=</b> <i>valor </i>]</p>
<p>&#160;&#160;&#160;&#160; [ [ <b>, </b>] MAX_MEMORY_PERCENT <b>=</b> <i>valor </i>] <b>)</b></p>
<p>]</p>
<p>[;]</p>
<p align="justify">Se não forem criados Resource Pools próprios, isto é, sempre utilizar o pool padrão, podemos dizer que é um comportamento similar ao encontrado no SQL Server 2005. Devemos também nos atentar para a limitação do número de pools que é de 20 (incluindo os dois pré-definidos). </p>
<p align="justify"><strong>Criando Workload Groups</strong></p>
<p align="justify">Já vimos como fazer a criação dos resource pools, mas também foi visto que necessitamos de workload groups mapeados nestes pools para configurar o resource governor, pois se associarmos usuários diretamente aos pools poderia ser extremamente custoso qualquer gerência, para não dizer quase impossível. Acredito que um dos elementos mais interessantes dos workload groups é a capacidade de definir prioridade (baixa, média, alta) aos mesmos, o que aumenta ainda mais a granularidade da configuração possível. Por padrão a prioridade é a média (MEDIUM).</p>
<p align="justify">Um pool pode mapear zero ou mais workloads, por sua vez, mapeados com as queries dos usuários, mas um workload group só pode estar em um único pool (e sempre estará em um).</p>
<p align="justify">Vamos criar três workload groups (para exemplificar múltiplos workloads por pool): AdhocAdm, UsuariosNormais, Relatorios. Os comandos Transact-SQL para a criação dos workloads, para o nosso exemplo, podem ser vistos na <b>listagem 3</b>. A cláusula USING serve para mapear o workload sendo criado a um pool existente. Como já mencionado, as queries que se encaixarem nos workload groups não associados a um resource pool, utilizarão o resource pool default (sempre existente). </p>
<p><em><b>Listagem 3</b>. Criação dos Workload Groups</em></p>
<p>CREATE WORKLOAD GROUP AdhocAdm</p>
<p>USING NormalQueries</p>
<p>CREATE WORKLOAD GROUP UsuariosNormais</p>
<p>USING NormalQueries</p>
<p>CREATE WORKLOAD GROUP Relatorios</p>
<p>USING RelatorioQueries </p>
<p align="justify">A <b>listagem 4</b> mostra a sintaxe completa associada à manipulação de workload groups e também os parâmetros configuráveis.</p>
<p><em><b>Listagem 4</b>. Sintaxe do Workload Group e seus Parâmetros Configuráveis</em></p>
<p>CREATE|ALTER|DROP WORKLOAD GROUP { group_name | &quot;default&quot; }</p>
<p>[WITH</p>
<p>([IMPORTANCE = { LOW | MEDIUM | HIGH }]</p>
<p>[[,] REQUEST_MAX_MEMORY_GRANT_PERCENT = valor ]</p>
<p>[[,] REQUEST_MAX_CPU_TIME_SEC = valor ]</p>
<p>[[,] REQUEST_MEMORY_GRANT_TIMEOUT_SEC = valor ]</p>
<p>[[,] MAX_DOP = valor ]</p>
<p>[[,] GROUP_MAX_REQUESTS = valor ] )</p>
<p>]</p>
<p>[USING { pool_name | &quot;default&quot; }]</p>
<p>[;]</p>
<p align="justify">A sintaxe associada é um pouco mais complexa que a dos resource pools e por isso entrarei nos méritos de cada parâmetro.</p>
<p align="justify">IMPORTANCE: Define a prioridade do workload group, por padrão (se não especificada) é a média. Este grau de prioridade é usado para cálculos entre workgroups dentro do mesmo resource pool e <b>não</b> afeta os outros workload groups associados a outros resource pools.</p>
<p align="justify">REQUEST_MAX_MEMORY_GRANT_PERCENT: Especifica a quantidade máxima de memória que uma requisição única consegue utilizar do pool. Esta porcentagem é relativa ao tamanho da memória disponível ao pool (MAX_MEMORY_PERCENT). O parâmetro valor precisa ser zero ou um inteiro positivo até 100. O valor padrão (se não especificado) é 25.</p>
<p align="justify">REQUEST_MAX_CPU_TIME_SEC: Especifica o máximo de tempo (segundos) que uma query pode esperar por um recurso até ficar disponível antes da query falhar. O valor precisa ser 0 ou um inteiro positivo. Por padrão este valor é zero. O Resource Governor não impede a query de executar caso o tempo limite seja atingido, mas um evento é gerado (mais informações no Books Online do SQL Server 2008, ver sobre “CPU Threshold Exceeded Event Class”). </p>
<p align="justify">REQUEST_MEMORY_GRANT_TIMEOUT_SEC: Especifica o tempo máximo (segundos) que uma query pode esperar por memória (work buffer memory) até ficar disponível. O valor necessita ser um valor maior ou igua a 0 (padrão). Atingir o tempo limite não significa necessariamente que a execução da query irá falhar, isto só ocorrerá se existirem muitas solicitações concorrentes, a query executará na verdade com uma quantidade menor de memória disponível (o que pode afetar o desempenho da mesma). </p>
<p align="justify">MAX_DOP: Especifica o grau máximo de paralelismo (DOP: degree of parallelism) para requisições paralelas. O valor precisa ser 0 ou um número inteiro positivo, onde o valor máximo é de 64. O valor padrão é 0, e significa que útilizará o valor global configurado.</p>
<p align="justify">GROUP_MAX_REQUESTS: Especifica o número máximo de requisições simultâneas que são permitidas executar em um mesmo workload group. O valor precisa ser 0 ou um inteiro positivo. O valor padrão é 0 (requisições ilimitadas, teoricamente).</p>
<p align="justify">Por fim, a cláusula USING indica qual resource pool será utilizado, por padrão será o pool default.</p>
<p>Com o mapeamento resource pool ó workload group feito, devemos configurar a Classifier Function (função de classificação) que definirá qual o workload associado à chamada sendo feita. </p>
<p><strong>Função de Classificação (Classifier Function)</strong></p>
<p align="justify">Seguindo o raciocínio com base na <b>figura 1</b>, vemos que para efetuar o direcionamento das queries que chegam ao servidor SQL Server (idealmente colocado em um servidor físico diferente do servidor de aplicação) é necessária uma função de classificação. Para a construção do algoritmo de classificação é possível utilizar os parâmetros presentes na string de conexão, tais como: endereço IP; nome da aplicação; nome do usuário; entre outros. Sabendo o que é possível utilizar, é necessário definir as políticas que estarão presentes na função. Entre as funções auxiliares disponíveis podemos citar: SUSER_NAME(), HOST_NAME(), SUSER_SNAME(), etc. Temos também as novas funções: CONNECTIONPROPERTY(), ORIGINAL_DB_NAME() e também as novas opções para LOGINPROPERTY(). Para maior detalhamento do comportamento destas funções, favor olhar o Books Online do SQL Server 2008. </p>
<p align="justify">Para efeito de exemplificação utilizaremos os seguintes critérios:</p>
<p align="justify">Caso o usuário tenha aberto uma sessão através do SQL Server Management Studio (nome da aplicação) então deverá ser classificado no workload AdhocAdm.</p>
<p align="justify">Caso seja o usuário ‘Relatorio’, então será classificado para o workload de Relatorios. </p>
<p align="justify">Todos os demais que não se enquadrarem em nenhuma das regras anteriores serão classificados para o workload de UsuariosNormais.</p>
<p align="justify">Acompanhe o script de criação destas regras na <b>listagem 5</b>.</p>
<p><em><b>Listagem 5</b>. Criação da Classifier Function</em></p>
<p>USE MASTER</p>
<p>GO</p>
<p>CREATE FUNCTION fnClassificadora()</p>
<p>RETURNS SYSNAME WITH SCHEMABINDING</p>
<p>BEGIN</p>
<p>DECLARE @x SYSNAME</p>
<p>IF APP_NAME() LIKE 'Microsoft SQL Server Management Studio%'</p>
<p>BEGIN</p>
<p>SET @x = 'AdhocAdm';</p>
<p>RETURN @x;</p>
<p>END</p>
<p>DECLARE @user VARCHAR(50) = SUSER_SNAME();</p>
<p>IF @user = 'Relatorio'</p>
<p>BEGIN</p>
<p>SET @x = 'Relatorios';</p>
<p>RETURN @x;</p>
<p>END</p>
<p>SET @x = 'UsuariosNormais'; </p>
<p>RETURN @x;</p>
<p>END</p>
<p align="justify">A função de classificação demonstrada é bastante simples, mas contempla todas as definições que mencionei anteriormente. Fique atento, uma mesma sessão pode se encaixar em mais de um workload group, imagine (segundo nosso exemplo) se o usuário fosse “Relatorio”, mas utilizando o SQL Server Management Studio, logo caracterizando a presença em dois grupos distintos. Uma função de classificação bem programada também é peça fundamental de uma configuração bem sucedida do resource governor, com isso poderíamos ter uma função relativamente grande e complexa (dependendo do caso).</p>
<p>A função de classificação está criada, agora falta associá-la ao resource governor. A <b>listagem 6</b> demonstra o comando Transact-SQL para realizar a associação.</p>
<p><b>Listagem 6</b>. Associação da Classifier Function com o Resource Governor</p>
<p>ALTER RESOURCE GOVERNOR</p>
<p>WITH (CLASSIFIER_FUNCTION = dbo.fnClassificadora)</p>
<p>Todas as configurações não terão efeito até que o RECONFIGURE seja executado. O script para o RECONFIGURE pode ser observado na <b>listagem 7</b>.</p>
<p><b>Listagem 7</b>. Execução do RECONFIGURE</p>
<p>ALTER RESOURCE GOVERNOR</p>
<p>RECONFIGURE</p>
<p>Este foi o último ponto de configuração do resource governor, isto significa que a partir desse momento as queries serão executadas segundo os critérios configurados. </p>
<p>---</p>
<p>É isso pessoal, espero que ajude vocês nos seus estudos!</p>
<p>Grande abraço,   <br />Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2011/01/sql-server-resource-governor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQL Server Analysis Services sobre HTTP/HTTPs</title>
		<link>http://zavaschi.com/index.php/2010/12/sql-server-analysis-services-sobre-httphttps/</link>
		<comments>http://zavaschi.com/index.php/2010/12/sql-server-analysis-services-sobre-httphttps/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 16:20:04 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SSAS]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2010/12/sql-server-analysis-services-sobre-httphttps/</guid>
		<description><![CDATA[Olá pessoal,
Quando pensamos no SSAS, lembramos que o único modo de autenticação que temos é através de Windows Authentication. Não há algo como o Mixed mode do SQL Server.
Mas os clientes que vão consumir os dados do nosso servidor de análise nem sempre está no mesmo domínio que nós. Então como proceder?
É possível sim (SSAS [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Olá pessoal,</p>
<p align="justify">Quando pensamos no SSAS, lembramos que o único modo de autenticação que temos é através de Windows Authentication. Não há algo como o Mixed mode do SQL Server.</p>
<p align="justify">Mas os clientes que vão consumir os dados do nosso servidor de análise nem sempre está no mesmo domínio que nós. Então como proceder?</p>
<p align="justify">É possível sim (SSAS enterprise only) fazer essa conexão externa através de um pump. Ou seja, você cria uma passagem no seu IIS para o seu servidor de análise.</p>
<p align="justify">Primeiramente ative seu IIS no seu servidor. (Aqui estou utilizando o IIS7, os passos para o IIS 6 podem ser observados de uma maneira geral neste post, em inglês: <a title="http://msdn.microsoft.com/en-us/library/ee825077%28CS.20%29.aspx#cs_se_secure_dw_aiam" href="http://msdn.microsoft.com/en-us/library/ee825077%28CS.20%29.aspx#cs_se_secure_dw_aiam" target="_blank">Configuring SSAS over HTTP</a>, apesar de falar do SQL Server 2000, os passos são parecidos).</p>
<p align="justify">Crie um site no IIS. Dentro deste site crie um diretório virtual e mapeie para um diretório físico. No meu caso nomeei o diretório como “olap” e mapeei para “C:\inetpub\wwwroot\olap”.</p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2010/12/image.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" src="http://zavaschi.com/wp-content/uploads/2010/12/image_thumb.png" border="0" alt="image" width="206" height="220" /></a>Mesmo que seja usado HTTP (sem SSL) na porta 80, libere no firewall a porta 80 e a porta 2725, para que o Office consiga fazer o acesso ao servidor de análise.</p>
<p align="justify">Copie para a pasta mapeada (C:\inetpub\wwwroot\olap) todos os arquivos do diretório: C:\&lt;local da instalacao do SQL Server&gt;\MSAS10_50.&lt;instancia&gt;\OLAP\bin\isapi.</p>
<p align="justify">No meu caso o diretório é:<br />
C:\Program Files\Microsoft SQL Server\MSAS10_50.MSSQLSERVER\OLAP\bin\isapi.</p>
<p align="justify">O diretório mapeado fica semelhante ao mostrado abaixo:</p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2010/12/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" src="http://zavaschi.com/wp-content/uploads/2010/12/image_thumb1.png" border="0" alt="image" width="244" height="225" /></a></p>
<p align="justify">Após isso vá no gerenciador do IIS, clique no diretório virtual que você criou e depois clique em Mapeamentos de Manipulador (<em>Handler Mapping</em>) e depois clique em “Adicionar Mapeamento de Script” (<em>Add Map Script</em>).</p>
<p align="justify">Dê um nome para o mapeamento (no meu caso usei <em>olap </em>mesmo) e mapeie para a dll chamada msmdpump.dll que você copiou do diretório do SQL Server.</p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2010/12/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" src="http://zavaschi.com/wp-content/uploads/2010/12/image_thumb2.png" border="0" alt="image" width="361" height="297" /></a></p>
<p align="justify">O último detalhe agora é se o ISS não estiver no mesmo servidor do SSAS. Se este for o cenário você deve acertar o arquivo (com o notepad mesmo) msmdpump.ini que está no diretório mapeado para o diretório virtual. O pedaço que você deve ajustar é o &lt;ServerName&gt;. Se for no mesmo servidor, deixe localhost.</p>
<p align="justify">&lt;ConfigurationSettings&gt;<br />
<strong>&lt;ServerName&gt;localhost&lt;/ServerName&gt;<br />
</strong> &lt;SessionTimeout&gt;3600&lt;/SessionTimeout&gt;<br />
&lt;ConnectionPoolSize&gt;100&lt;/ConnectionPoolSize&gt;<br />
&lt;/ConfigurationSettings&gt;</p>
<p align="justify">Pronto!</p>
<p align="justify">Agora você pode usar como servidor para a conexão o seguinte endereço:</p>
<p align="justify">http://&lt;servername/ip&gt;/olap/msmdpump.dll.</p>
<p align="justify">Lembrando que você deve passar as credenciais, e estas devem estar no domínio do SSAS. O usuário e senha ficaria algo como:</p>
<p align="justify">&lt;domínio&gt;\usuario (com a barra mesmo), e a senha normal do usuário.</p>
<p align="justify">Este usuário vai ter as permissões normais definidas nas roles da base do SSAS que você estará fazendo o acesso.</p>
<p>É isso, espero que tenham gostado. :-)</p>
<p>Abraços,<br />
Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2010/12/sql-server-analysis-services-sobre-httphttps/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fa&#231;a um DBA feliz! #1</title>
		<link>http://zavaschi.com/index.php/2010/09/faa-um-dba-feliz-1/</link>
		<comments>http://zavaschi.com/index.php/2010/09/faa-um-dba-feliz-1/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 02:32:53 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Faça um DBA feliz]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2010/09/faa-um-dba-feliz-1/</guid>
		<description><![CDATA[Olá pessoal!
Você como desenvolvedor deve pensar que agradar àquele cara que fica sentado junto ao pessoal de infra é difícil, mas não é não!
Essa série irei passar pequenas dicas que podem facilitar (e muito) a vida do DBA. No final das contas ele pode até te pagar uma cerveja por isso :).
É muito comum encontrar [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p align="justify">Você como desenvolvedor deve pensar que agradar àquele cara que fica sentado junto ao pessoal de infra é difícil, mas não é não!</p>
<p align="justify">Essa série irei passar pequenas dicas que podem facilitar (e muito) a vida do DBA. No final das contas ele pode até te pagar uma cerveja por isso :).</p>
<p align="justify">É muito comum encontrar cenários de bases de dados SQL Server unificadas, e diversos (eu falei, diversooos!) sistemas que a utilizam.</p>
<p align="justify">É muito comum também existirem certas queries que não estão, digamos, muito otimizadas e que forçam muito o servidor. É papel do DBA identificar, tentar corrigir se possível e avisar aos responsáveis.</p>
<p align="justify">O problema é justamente saber a quem avisar… Existe uma solução muito simples pra isso.</p>
<p align="justify">Quando o DBA está visualizando o que está acontecendo no banco, se a aplicação informar, aparece o nome da aplicação, caso contrário aparece: <em>.NET sqlClient Data Provider </em>(nome genérico e sem significado de negócio direto)<em>.</em></p>
<p align="justify">É possível especificar um parâmetro opcional na connection string chamado <em>Application Name</em> e resolver isso:</p>
<p align="center"><em>Data Source=SERVIDOR;Initial Catalog=BASEDEDADOS;User Id=USER;Password=PASS;<strong>Application Name=NomeAplicacao;</strong></em></p>
<p align="justify"><em>Isso resulta numa bela visão para facilidar o tracking do DBA!     <br />Comando executado: </em></p>
<p><em>select spid, program_name, * from sys.sysprocesses     <br />where program_name &lt;&gt; ''</em></p>
<p align="justify"><a href="http://zavaschi.com/wp-content/uploads/2010/09/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://zavaschi.com/wp-content/uploads/2010/09/image_thumb.png" width="551" height="134" /></a> <em>     <br /></em></p>
<p align="justify">É isso pessoal. A ideia desta série é ter posts curtos e diretos! O próximo deve ser relacionado ao SQL dinâmico, não percam!</p>
<p align="justify">Abraços e excelente fim de noite!</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2010/09/faa-um-dba-feliz-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Verificando espa&#231;o em disco e o espa&#231;o ocupado por tabelas!</title>
		<link>http://zavaschi.com/index.php/2010/05/verificando-espao-em-disco-e-o-espao-ocupado-por-tabelas/</link>
		<comments>http://zavaschi.com/index.php/2010/05/verificando-espao-em-disco-e-o-espao-ocupado-por-tabelas/#comments</comments>
		<pubDate>Wed, 12 May 2010 15:30:00 +0000</pubDate>
		<dc:creator>Thiago Zavaschi</dc:creator>
				<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[Maiores Tabelas]]></category>
		<category><![CDATA[Tamanho em disco]]></category>

		<guid isPermaLink="false">http://zavaschi.com/index.php/2010/05/verificando-espao-em-disco-e-o-espao-ocupado-por-tabelas/</guid>
		<description><![CDATA[Olá pessoal! 
Inspirado no post do Diego Nogare, o qual comentei (com os scripts deste post), resolvi postar aqui também os scripts sobre verificação de espaço usado em disco e por tabelas!
Verificar o tamanho ocupado por tabelas no banco (a.k.a achar maiores tabelas):
Ordenado por quantidade de linhas:
SELECT object_name(id), rowcnt, dpages * 8 AS [tamanho KB] [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal! </p>
<p>Inspirado no post do <a href="http://blog.ngrsolutions.com.br/Blog/BlogEngine.NET/post/Como-calcular-a-massa-de-dados-no-SQL-Server.aspx" target="_blank">Diego Nogare</a>, o qual comentei (com os scripts deste post), resolvi postar aqui também os scripts sobre verificação de espaço usado em disco e por tabelas!</p>
<p>Verificar o tamanho ocupado por tabelas no banco (a.k.a achar maiores tabelas):</p>
<p>Ordenado por quantidade de linhas:</p>
<p><font size="2" face="Courier New">SELECT object_name(id), rowcnt, dpages * 8 AS [tamanho KB] FROM sysindexes      <br />WHERE indid IN (1,0) AND objectproperty(id,'isusertable') = 1       <br />ORDER BY rowcnt DESC</font> </p>
<p>Ordenado por tamanho físico:</p>
<p><font size="2" face="Courier New">SELECT object_name(id), rowcnt, dpages * 8 AS [tamanho KB] FROM sysindexes      <br />WHERE indid IN (1,0) AND objectproperty(id,'isusertable') = 1       <br />ORDER BY [tamanho KB] DESC</font></p>
<p>E para mostrar o espaço em disco disponível (valor absoluto e percentual) e o espaço total dos discos, é possível utilizar (a fonte deste script é o SQLDBATips):</p>
<p><font size="2" face="Courier New">DECLARE @hr int     <br />DECLARE @fso int      <br />DECLARE @drive char(1)      <br />DECLARE @odrive int      <br />DECLARE @TotalSize varchar(20)      <br />DECLARE @MB bigint ; SET @MB = 1048576 </font></p>
<p><font size="2" face="Courier New">CREATE TABLE #drives (drive char(1) PRIMARY KEY,     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FreeSpace int NULL,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TotalSize int NULL) </font></p>
<p><font size="2" face="Courier New">INSERT #drives(drive,FreeSpace)     <br />EXEC master.dbo.xp_fixeddrives </font></p>
<p><font size="2" face="Courier New">EXEC @hr=sp_OACreate 'Scripting.FileSystemObject',@fso OUT     <br />IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @fso </font></p>
<p><font size="2" face="Courier New">DECLARE dcur CURSOR LOCAL FAST_FORWARD     <br />FOR SELECT drive from #drives      <br />ORDER by drive </font></p>
<p><font size="2" face="Courier New">OPEN dcur </font></p>
<p><font size="2" face="Courier New">FETCH NEXT FROM dcur INTO @drive </font></p>
<p><font size="2" face="Courier New">WHILE @@FETCH_STATUS=0     <br />BEGIN </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; EXEC @hr = sp_OAMethod @fso,'GetDrive', @odrive OUT, @drive     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @fso      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; EXEC @hr = sp_OAGetProperty @odrive,'TotalSize', @TotalSize OUT      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @odrive      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; UPDATE #drives      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; SET TotalSize=@TotalSize/@MB      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; WHERE drive=@drive      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; FETCH NEXT FROM dcur INTO @drive </font></p>
<p><font size="2" face="Courier New">END </font></p>
<p><font size="2" face="Courier New">CLOSE dcur     <br />DEALLOCATE dcur </font></p>
<p><font size="2" face="Courier New">EXEC @hr=sp_OADestroy @fso     <br />IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @fso </font></p>
<p><font size="2" face="Courier New">SELECT drive,     <br />&#160;&#160;&#160;&#160;&#160;&#160; FreeSpace as 'Livre(MB)',      <br />&#160;&#160;&#160;&#160;&#160;&#160; TotalSize as 'Total(MB)',      <br />&#160;&#160;&#160;&#160;&#160;&#160; CAST((FreeSpace/(TotalSize*1.0))*100.0 as int) as 'Livre(%)'      <br />FROM #drives      <br />ORDER BY drive </font></p>
<p><font size="2" face="Courier New">DROP TABLE #drives </font></p>
<p><font size="2" face="Courier New">RETURN     <br />GO</font></p>
<p>A saída do script deverá ser semelhante a:</p>
<p><font size="2" face="Courier New">drive Livre(MB)&#160;&#160; Total(MB)&#160;&#160; Livre(%)     <br />----- ----------- ----------- -----------      <br />C&#160;&#160;&#160;&#160; 9541&#160;&#160;&#160;&#160;&#160;&#160;&#160; 49999&#160;&#160;&#160;&#160;&#160;&#160; 19      <br />D&#160;&#160;&#160;&#160; 46002&#160;&#160;&#160;&#160;&#160;&#160; 317966&#160;&#160;&#160;&#160;&#160; 14      <br />F&#160;&#160;&#160;&#160; 37549&#160;&#160;&#160;&#160;&#160;&#160; 99998&#160;&#160;&#160;&#160;&#160;&#160; 37      <br />K&#160;&#160;&#160;&#160; 68581&#160;&#160;&#160;&#160;&#160;&#160; 476269&#160;&#160;&#160;&#160;&#160; 14</font></p>
<p>É isso pessoal, fazia tempo que não postava algo masi focado a área de DBA (a qual gosto muito também), espero que seja útil!</p>
<p>Abraços,    <br />Thiago Zavaschi</p>
]]></content:encoded>
			<wfw:commentRss>http://zavaschi.com/index.php/2010/05/verificando-espao-em-disco-e-o-espao-ocupado-por-tabelas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

