0% acharam este documento útil (0 voto)
120 visualizações20 páginas

SQL SERVER Com Máximo Desempenho-Aprenda T-SQL TUNNING

Este documento fornece instruções sobre como configurar e otimizar bancos de dados no SQL Server. Aborda tópicos como armazenamento de dados, design do banco de dados, criação de tabelas e compactação de dados para melhorar o desempenho.

Enviado por

Thiago Oliveira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
120 visualizações20 páginas

SQL SERVER Com Máximo Desempenho-Aprenda T-SQL TUNNING

Este documento fornece instruções sobre como configurar e otimizar bancos de dados no SQL Server. Aborda tópicos como armazenamento de dados, design do banco de dados, criação de tabelas e compactação de dados para melhorar o desempenho.

Enviado por

Thiago Oliveira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 20

------------------------------------------------------------------------

SECTION 1: Conhecer, instalar e preparar


------------------------------------------------------------------------
-clientes querem recuperar as informações o mais rapido possível
respostas rápidas
determinante para que sua aplicação ou site de sua empresa tenham sucesso

------------------------------------------------------------------------
SECTION 2: Conceitos e introduçoes
------------------------------------------------------------------------
----------------------------
Onde os dados repousam
----------------------------
tabelas são representaçao lógicas do dado que é armazenado fisicamente
tabelas, alguns indices sao objetos de alocacao de dados
Pode-se dzer que também é um conceito lógico
os objetos de alocacão grava em arquivos de dados
cada arquivo de dados que o sql usa para para armazenar dados
tem uma área predefinida aonde serao gravados os dados
que vao ser asociados aos objetos de alocacao
registro de dados-é as linhas da tabela
todos objetos gravados nessa área serao gravados como registro de g

execute sp_spaceused
vai dzer o numero de registros, quantidade reservada
e espaço usado para armazenamenro de dados e quanto kb em indexes
no ex 16kb que equivale a 2 paginas de dados
na hora de inserir nao colocamos os 4mil char
e contou 8mil, mas ele vai explicar o pq

1 pagina tem 8kbytes


extend tem 8 paginas 64kbytes

quando for fazer formataçao do disco, fazer em 64kbystes

Extend Misto-tabelas diferentes


Extend Uniforme-mesma tabela

Quando vc começa uma tabela geralmente é alocado os registros com


Extend Misto(defalt),mas dá para mudar

----------------------------
Memória da instancia do SQL Server. A configuraçao ideal
----------------------------

é mais rapido acessar memoria do que em disco


e essa memoria é chamada de buffer ou buffer de cache ou buffer pool
quanto mais memoria melhor
o sql vai colocar o que conseguir de dados na memoria dele
+de 512 giga de moria só de memoria, caramba
4 gigas para começar
a MS recomenda apartit de um giga mas nos dias de hoje nao é nada
+++++++
mas vc tem de anilisar seu ambiente para definir
como tabelas, carga de dados,quantas conexoes terao,
e depois disso monitorar seu ambiente, e depois disso aí
ver se tem alguma sobrecarga na memória(o sql usando memoria demais,
ele ele nao consegue mais, daí a unica soluçao e só aumentando
a memoria mesmo no seu servidor)

o buffer é uma área de memoria de 8kbytes


pois é onde vai armazenar as paginas lidas dos objetos de alocaçao

o dado permanece do buffer at[e que o gerenciador de buffer precise


de mais áreas para carregar novos dados

Buffer Pool é configurada no SQL Server como Min Server Memory


e Max Server Memory

execute sp_configure
--temos informacoes de configuraçao do servidor
significado das colunas minimum, maximum dos valores
permitidos , config_value-o que foi onfigurado
e run_value o que está rodando atualmente

execute sp_configure 'show advanced options' , 1 --muda o valor do parametro


go
reconfigure with override --agora voce aplica esse valor

vc pode ver os valores


execute sp_configure 'min server memory (MB)'
execute sp_configure 'max server memory (MB)'

o maximo e 2tb. isso pq o sql nao identifica o q tem


de memoria fisica no servidor

nao esqueca de deixar memoria para o sistema operacional


o Min Server memory é a memoria minima que o SO pode pedir para liberar
pois o SQL server precisa de memoria para trabalhar

E o Max Memory é até onde o Sql server pode alocar memoria


depois disso ele vai pegando a mais antigas e substituindo

view dinamica
select total_physical_memory_kb / 1024.0 as MemoriaTotal ,
available_physical_memory_kb / 1024.0 as MemoriaDisponivel
from sys.dm_os_sys_memory

8gb de memoria total, mas 500mb de disponivel

Consultando a quantidade de páginas no Buffer Pool ocupada por cada


banco de dados.
select * from sys.dm_os_buffer_descriptors

bancos e mb usados em memoria


select db_name(database_id) as BancoDeDados,
(count(1) * 8192 ) / 1024 /1024 as nTamanhoPaginas
from sys.dm_os_buffer_descriptors
group by db_name(database_id)
go

----------------------------
Design da Banco de dados
----------------------------
- No arquivo Primário ou MDF além de termos os dados da aplicação,
temos também as
informações sobre :

- Inicialização do banco de dados;


- A referência para outros arquivos de dados do banco;
- Metadados de todos os objetos de banco de dados
criados pelos desenvolvedores.

Todo e qualquer comando que tenha alguma referência


a objetos como tabela, colunas, view, etc.,
sempre consulta os metadados desses objetos no arquivo primário.

se vc colocar uma taxa baixa de crescimento ,


vai acontecer overhead e perda de performance

defina espaco maximo de crescimento, senao vai ocupar todo hd

CREATE DATABASE DBDemoA -- Instrução par criar o banco de


dados.
ON PRIMARY -- FG PRIMARY.
( NAME = 'Primario', -- Nome lógico do arquivo.
FILENAME = 'D:\DBDemoA_Primario.mdf' , -- Nome físico do arquivo.
SIZE = 256MB -- Tamanho inicial do arquivo.
)
LOG ON
( NAME = 'Log',
FILENAME = 'F:\DBDemoA_Log.ldf' ,
SIZE = 12MB
)
GO

CREATE DATABASE DBDemoA


ON PRIMARY
( NAME = 'Primario',
FILENAME = 'D:\DBDemoA_Primario.mdf' ,
SIZE = 256MB
), -- Segundo Arquivo de dados,
no mesmo FG
( NAME = 'Secundario',
FILENAME = 'D:\DBDemoA_Secundario.ndf' ,
SIZE = 256MB
)
LOG ON
( NAME = 'Log',
FILENAME = 'D:\DBDemoA_Log.ldf' ,
SIZE = 12MB
)
GO

/*
No exemplo acima, temos dois arquivos de dados no FG PRIMARY. Os dados gravados
nesse grupo serão distribuidos de forma proporcional dentro dos arquivos.
*/

ganhando assim performance


+++existe movimentaçao de dados entre filesgroups
se vc quebrar um filegroup em dois arquivos vai ficar mais rapido
por conta de vc ter 2 entradas

Select * from sys.filegroups


lista toos files groups

é legal separar metadados de dados e de indices tbm e se tiver taelas pouca


acessadas vc pode separ tbm
estrutura de banco de dados alta performance

----------------------------
Armazamento e tipos de dados. Dados certos nos lugares certos
----------------------------

o N' é para dizer que os caracteres sao do tipo unicode


nchar(n) é para o tipo unicode
se vc colocar caracter japones q é acima de 255 echar ia ficar ?????

declare @Nome1 varchar(10) = 'Jose'


select len(@Nome1) , datalength(@Nome1)

declare @Nome2 nvarchar(10) = N'Jose'


select len(@Nome2) , datalength(@Nome2)

mostra o tamanho da informaçao e dados em bytes armazenados

----------------------------
Criando as melhores tabelas
----------------------------

Select object_name(i.object_id) as [Table] , d.name as Filegroup


from sys.data_spaces d
join sys.indexes i
on d.data_space_id = i.data_space_id
where i.object_id = object_id('tExemplo1')
and i.index_id in (0,1)
go

com esse codigo vc ve em qual filegroup está sua tabela

select fg.name ,
su.total_page_count as nTotalPaginas ,
su.allocated_extent_page_count as nPaginasUsada,
su.unallocated_extent_page_count as nPaginasLivre,
-------
su.total_page_count * 8192 / 1024.0 as nTamanhoKb,
su.allocated_extent_page_count * 8 / 1024.0 nUsadoKB,
su.unallocated_extent_page_count * 8 / 1024.0 nLivreKB
from sys.dm_db_file_space_usage su
join sys.filegroups fg
on su.filegroup_id = fg.data_space_id
para saber numero total de paginas e com isso numero de kb utilizados
se uma tabela nao tem indice ela está dentro da sys.indexes

----------------------------
Colunas calculadas
----------------------------
para saver informaçoes das colunas de uma tabela
sp_help nome tabela, e mostra o valor maximo

como ele nao sabe o resultado ele usa o maior valor para coluna resultado

Alter table tItemModelo04 drop column ValorComissao


go
Alter table tItemModelo04 add ValorComissao as cast((Preco * Comissao/100) as
smallmoney) -- Coluna Calculada.
para dar tipo
sempre ficar esperto no tamanho q vai retornar

sempre que inserir dado, fazer alteracao em otra coluna,recalcula

Create Table tItemModelo04


(
iID smallint primary key identity(1,1),
Codigo varchar(20),
Titulo varchar(200),
Descricao varchar(5000),
iIDFornecedor int ,
Preco smallmoney ,
Comissao numeric(5,2),
ValorComissao as cast( (Preco * Comissao/100) as smallmoney) PERSISTED ,
Quantidade smallint ,
Frete smallmoney
) on DADOS4
go

o famoso permited

----------------------------
Compactando meus dados
----------------------------
compactando dados conseguimos ler mais dados em uma mesma pagina
no buffer pool continua compactado

avalia se compensa compactar ou nao a tabela


EXEC sp_estimate_data_compression_savings 'dbo', 'tCliente', null, NULL, 'PAGE' ;

sera q compensa no job

tamanho da pagina nao muda, mas o numero de páginas muda

colunas repetidas e colunas com valor null pode ser compactado

aqui q faz a compactaçao


ALTER TABLE dbo.tCliente
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE)
go
aqui vc ve o numero de paginas
select total_pages , used_pages , data_pages , p.data_compression_desc
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.partition_id
where p.object_id = object_id('tCliente')
and au.type = 1

ai vc ve as paginas antes e depois a compactação

+++++++++++
existe compactaçao por linha e compactaçao por página

----------------------------
Gestão de desempenho com visoes de gerenciamento dinamicos DMV
----------------------------

DMV pode ser view ou functions

select * from sys.dm_os_file_exists('c:\windows\system.ini')


select * from sys.dm_os_file_exists('c:\windows')
fala se existe o arquivo e se é um diretorio

Mostra as Sessões autenticadas na instância do SQL Server.


*/

Select *
From sys.dm_exec_sessions
login, qual maquina fez acesso

so mostra as sessoes em execuçao


Select *
From sys.dm_exec_requests
Where session_id >= 51

-- Apresenta os contadores de desempenho para o SQL Server


select * from sys.dm_os_performance_counters

Select @@SPID -- Retorna a Identificação da sessão do processo da conexão atual

++++++++++++++++++++++++++++++++++
Select tab.name as cTable , ind.name as cIndex , ind.type_desc as cTypeIndex ,
ind.index_id
From sys.indexes ind
Join sys.tables tab
on ind.object_id = tab.object_id
where tab.name = 'tCliente'
order by index_idnao
congue ver o indice e seus tipois se é clustured ou n

------------------------------------------------------------------------
SECTION 3: Páginas de dados.Onde seus dados moram
------------------------------------------------------------------------

----------------------------
Página de dados.Entenda onde estao os dados
----------------------------

psgina de dados - 8kb ou 8192 bytes


cabeçalho(header) da pagina - 96 bytes
[no header tem informaçoes tanto na página de dados do buffer quanto no disco
vai ter o id da pagina ,vai ter o qual é o objeto de alocaçao,qua
a area reservada,qunto bytes tem disponiveis, quantos registros tem armazenado
qual eá proxima página e a anterior]
area de dados -tamnho máximo de uma linha:8060 bytes
matriz de lotes 2 bytes por linha
[vai ter 2 bytes por linha ,pois ele seria o ponteiro
que fala aonde começa a minha linha dentro da minha página]

Set statistics io on

Set statistics io off


Quando ligado e uma instrução é executada, o SQL Server apresenta as estatísticas
de acesso ao cache ou buffer ou a área de disco.

Table 'XXXXXXXX' Nome da Tabela


Scan count Contagem de buscas para recuperar os dados.
(dependendo de como foi feito a cesso fisico aos meus dados
pode ser que tenhamos que passar diversar vezes pela mossa tabela
para recuperar dados)
logical reads Qtd de Páginas acessadas no Buffer Pool (cache de
dados).
physical reads Qtd de Páginas acessadas do Disco.
read-ahead reads Qtd de Páginas incluídas no Buffer Pool. Chamda leitura
antecipada.
o sql sobe as paginas atuais e tbm uma futura por meio de statistica

vai ter uma seçao só para tratr large objects

----------------------------
O que é uma Heap Table.Mas evite por favor
----------------------------
como nao tem indice clusterizado, mesmo achando o valor da oluna iIDCliente
ele vai varrer todas colunas

+++
Mesmo que voce inclua os dados em uma ordem que deseja que eles fiquem,
uma Heap Table não tem em sua estrutura os dados algo que indique que esses dados
estão ordenados.

só podemos usar heap table , quando as tabelas sao pequenas

----------------------------
Localizando uma linha na página
----------------------------

Como sei que uma determinada linha ou dados estão em uma página?

Uma delas é usando a pseudo coluna %%PHYSLOC%% que retorna um hexadecimal com
o RID ( ROW IDENTIFIER ) do endereço físico da linha dentro de uma página.
select %%PHYSLOC%% as LocalFisico,
DemoPage.*
from DemoPage

tem 3 linhas sendo que tem duas paginas utilizadas

mesma pagina o começo mantes, se for outra muda na frente

Para traduzir essa endereço em algo mais legível para nós, utilizaremos
a função sys.fn_PhysLocFormatter que recebe esse coluna como parâmetro e retorna as
informações da localização da linha.

*/

use DBDemo
go

select sys.fn_PhysLocFormatter(%%PHYSLOC%% ) as LocalFisico,


DemoPage.*
from DemoPage

1 - ID do Arquivo de dados.
372 - Número da Página de Dados.
0 - ID do Slot (Posição da linha dentro da página).

select * from sys.dm_os_buffer_descriptors


mostra todas paginas q estao no buffer
mostra tbm, quantaas linhas tem na pagina
se a pagina , foi modificada ou nao
quanto tem de space livre

----------------------------
Entenda o que é Extend
----------------------------
Mostra o extend da linhas , tabelas
dá para ver as paginas que estao no extend
mostrando cada tabela que tem a pagina do extend

----------------------------
Registro de paginas de dados.Cada dado em seu lugar
----------------------------

Utilizar duas visões do catálogo do sistemas

sys.allocation_units - Contém uma linha para cada unidade de alocação no


banco de dados.
sys.partitions - Contém uma linha para cada partição de todas
as tabelas e para a
maioria dos tipos de índices no banco de dados.

PS: Partição : Recurso do SQL Server que permite dividir a tabela horizontalmente
em várias partições.
Se não utilizar esse recurso, a tabela é definida como um única
partição.

|- Cabeçalho da linha.
| |- Dados de tamanho fixo.
| | |- Contagem de colunas (6)
| | | |- Mapeamente de NULL das colunas.
| | | | |- Contagem de colunas variáveis (3)
| | | | | |- Deslocamento dos dados
variáveis.
| | | | | | |- Dados variavéis
| | | | | | |
+---------+----------+---------+--------+---------+---------+----------+----------
+---------+
| 4 bytes | 23 bytes | 2 bytes | 1 byte | 2 bytes | 6 bytes | 13 bytes | 17 bytes |
26 bytes| <-- REGISTRO
+---------+----------+---------+--------+---------+---------+----------+----------
+---------+

++++++++++
quando vemos uma index_id iqual a zero estamos vendo uma heap table
select *
from sys.partitions pa
where pa.object_id = object_id('tAluno')
na coluna rows fala que na reparticao so tem uma linha armazenada

Select pa.index_id , pa.rows ,


au.type, au.type_desc , au.data_space_id , au.total_pages , au.data_pages
From sys.partitions pa
Join sys.allocation_units au
on pa.partition_id = au.container_id
where pa.object_id = object_id('tAluno')

se usarmos essa uniao de tabelas

vamos ver o numero total de pages igual a 9 no ex


mas em data_pages tem 1, isso q importa
mas tem uma ainda melhor

declare @db_id int = db_id()


declare @object_id int = object_id('tAluno')

Select index_id ,
index_type_desc ,
alloc_unit_type_desc ,
page_count ,
record_count ,
min_record_size_in_bytes ,
max_record_size_in_bytes ,
avg_record_size_in_bytes
from sys.dm_db_index_physical_stats(@db_id, @object_id , null,null,'DETAILED')

tem até dado com valor min e máximo

----------------------------
Olhando dentro da pagina de dados
----------------------------

------------------------------------------------------------------------
SECTION 4: Quanto tempo demora uma consulta. Tempo de acesso aos discos
------------------------------------------------------------------------

----------------------------
Quanto tempo demora uma consulta
----------------------------

set statistics io on
set statistics time on
go

DBCC DROPCLEANBUFFERS
go
DBCC FREEPROCCACHE
go

isso acima para que a memoria esteja limpa e nao afetar nossos reultados

ele descreve cada tabela,


e quando tem 'Workfile' e 'Worktable'
indica que teve de criar internamentes em tempo de execuçao
um conjunto de dados temporario para poder armazenar informaçoes
para depois processar
criou em tempdb

----------------------------
Visualizar Estatísticas pelo SSMS
----------------------------

para ativar
Query->Include client Statistics ou Shift+alt +S

isso é muito importante

tem como resetar os dados


basta ir em query-reset client statiscs

é bom entender tudo mas o final já ajuda

+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++
se vc colocar rollback no final de tudo os dados não serao gravados
assim posso fazer meus testes uhullllllllllllllllll
Begin transaction
rollback

----------------------------
Monitorando os comandos pelo Profiler
----------------------------

Tools->Profiler

São ações criadas por um instância do SQL SERVER, como :

- Conexões, desconexões e falhas;


- Bloqueios criados e liberados;
- Aumento e Redução do banco de dados;
- Mensagens de erros e avisos.
- Execuções de comandos SELECT, INSERT, UPDATE e DELETE.
....

Os eventos são agrupados em classes de eventos.

A classe de eventos TSQL, por exemplo, tem os seguintes eventos:

Coluna de dados
---------------

Atributo de uma classe de eventos que foi rastreado pelo Profiler.


Nem todas as colunas são aplicadas para as classes de eventos.
Alguns colunas importantes para o evento "SQL:StmtCompleted"

select @@SPID --é a nossa conexao

SQL:StmtCompleted Indica que uma instrução Transact-SQL foi concluída.

Atributo de uma classe de eventos que foi rastreado pelo Profiler.


Nem todas as colunas são aplicadas para as classes de eventos.
Alguns colunas importantes para o evento "SQL:StmtCompleted"

SPID Identificação da Sessão


CPU Tempo da CPU (em milissegundos) usado pelo evento.
Duração Período de tempo (em microssegundos) utilizado pelo evento.
Reads Número de leituras de página emitidas pela instrução SQL.
RowCounts Número de linhas afetadas por um evento.
TextData Texto da instrução que foi executada.
Writes Número de gravações de páginas emitidas pela instrução SQL.

voce pode criar um template padrao, vc tem q colocar um filtro tbm


com a sua conexao atual
----------------------------
Olhando o desempenho do servidor com o Performance Monitor
----------------------------

Algumas caracaterísticas.

- Exibe os dados no formato gráfico em linha ao longo do tempo.


- Exibe os dados em formato barra ou texto em tempo real.
- Permite definir o intervalo de captura.
- Salva os dados em arquivo texto
- Permite a leitura de dados gravados.

windows->ferramenta administratisvas -permoformance monitor


vulgo monitor de desempenho

----------------------------
Plano de Execuçao. Como é a execucao fisica da query é feita
----------------------------

Plano de execução de uma consulta (Execution Plan) e o resultado de como o


Otimizador de Consulta calculou a maneira mais eficiente entre várias formas
de acessar o dados.
Um plano de execução pode ser visualizado em uma representação gráfica ou
textual,
apresentando as etapas físicas e a ordem como são executadas de acesso ao dados.

explicaçao das 3 etapas de tempo gasto

4 tapas

Parse-analisa sintex
Compilador-Compila alguns dados verifica se existem etc
Otimizador-gera plano de execuçao
Execucao

set statistcs xml on--vai mostrar nosso plano de execuçao no formato xml
podemos clicar nele para ver no modo grafico

no exemplo ele faz


o Index Seek depois Pesquisa de Chave
e depois junta numa junçao interna e depois

tem o plano estimado e real do Otimizador


o Plano estimado nao executa a consulta

tem um botao de quadradinho que cria um plano estimado de execuçao


tem um botao para o real tbm
vc pode por control+M e sele cionar parte do codigo e executar

leitura do plano é da esquerda para direita e de cima para baixo


Index Seek procura por dado pelo index
Key lookuo volta com o valor para recuperar os dados das outras colunas

- Plano de execução Estimado.


- Representa os valores fornecidos pelo Otimizador de Consulta.
- Ele não executa a consulta
- Selecione a consulta e pressione CTRL+L

- Plano de execução Real.


- Representa os valores pela execução do plano.
- Ele somente é obtido quando voce executa a instrução.
- Pressione CTRL+M para ativar e novamente para desativar

Interpretação da visualização do Plano de Execução

- Leitura é da Direita para a Esquerda e de Cima para Baixo


- Cada objeto representado são chamados de Operadores.
- As setas entre os operadores representam o fluxo de dados e
sua espessura reprenta a quantidade de linhas.
- O texto abaixo do Operador identifica:
- O nome do Operador
- O objeto de alocação de dados
- O custo (estimado ou real) em percentual do desse operador em
relação ao plano de execução.
se vc executa duas linhas ele vai fazer comparaçao e vai mostrar
a porcentagem no qual a que tiver a maio r porcentagem é pior

se as linhas estiverem grossa é que teve de fazer uma maior


leitura de linhas

Alguns operadores que podemos evitar

- Table Scan
- Index Scan
- Sort
- RID Lookup (Heap)
- Compute Scalar
*/

table scan é quando fazemos a leitura completa da tabela


clustered index scan é a mesma coisa- ele vai ler todos indices da tabela

em alguns casos ko operador sorte pode causar queda de desempenho


e as vezes vc nem precis e pode evitar

computer escalar-tbm

----------------------------
Utilizando Extended Events
----------------------------
VOLTAR

----------------------------
Monitorando com as DMVs
----------------------------
VOLTAR

------------------------------------------------------------------------
SECTION 5: Indices, os melhores amigos do homem
------------------------------------------------------------------------

----------------------------
O que o índice pode fazer pelo seu banco de dados
----------------------------

indices não sao balas de prata

o indice só pode ter um

agora vai existir paginas de indices de 8192bytes

Como visto na aula "Conceitos de Arvore Balanceada", uma b-tree é uma estrutura que
organiza
os dados a partir de um nó raiz (root), onde ele armazena as chaves e cria os
ponteiros para os nós
intermediários até chegar aos nós que não tem ponteiros ou nós folhas.
[procurar saber o funcionamento]

Create Index <Nome do Indice> on <Nome da tabela> (<Coluna1>,<Coluna2>,..)....


[outros comandos]
[padronizaçao de nome de indice procurar saber]
sp_spauceused 'nometabela'
nos diz o numero de linhas, dados reservados-de acordo com o numero de paginas
utilizadas
usado pelos dados, indices,nao usados

Checkpoint
go
dbcc DROPCLEANBUFFERS
Go

select * from sys.dm_os_buffer_descriptors


where database_id = DB_ID()
--quantas paginas temos de memoria para esse banco,tem q ser nenhuma,depois da
limpeza

--a abaixo tem de dar zerado tbm , ele mostra o que está na memoria
visando uma tabela em específico
/*
Alocação em memória
*/
select b.page_type as cTipoPagina,
count(b.page_id) as nQtdPaginas,
count(b.page_id) / 128.0 as nMemoriaMB
from sys.dm_os_buffer_descriptors b -- Contém as informações do Buffer
join sys.allocation_units a -- Informações de unidade de alocação dos
objetos
on b.allocation_unit_id = a.allocation_unit_id
join sys.partitions p -- Partições dos objetos de alocação.
on a.container_id = p.partition_id
where p.object_id = object_id('tMovimento')
and b.page_type in ( 'DATA_PAGE' , 'INDEX_PAGE')
and b.database_id = DB_ID()
group by b.page_type
go
--tem q dar zerado tbm

--a abaixo é no disco rígido, tbm por tabela


Alocação física dos dados
*/
select rows,
total_pages ,
used_pages ,
data_pages ,
p.data_compression_desc ,
p.index_id ,
i.name ,
i.type_desc
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.partition_id
join sys.indexes i
on p.index_id = i.index_id
and p.object_id = i.object_id
where p.object_id = object_id('tMovimento')
go
set statistics io on--para ligar estatisticas
set statistics xml on-para ligar o plano de execuçao

funciona indice nonclustered???Sim


e Pesquisa menos.
Mas a pesquisa das outras colunas foi heap

agora vai subir menos dads para memoria

+++++++++++++++++++++++++++++++++
FAZER O ROTEIRO

PARA VER SE A QUERY MELHORA A PERFORMANCE

----------------------------
Os tipo de índices suportados pelo SQL Server
----------------------------

Os tipos de indices suportados:


Hash
Não clusterizado com otimização de memória.
Clusterizado
Não Clusterizado
Exclusivo
ColumnStore
Indices com colunas incluídas
Indices com colunas computadas
Indices filtrados
Espacial
XML
Indice para Full Text Search

quando usamos indice clusterizado


transformamos nossa heap table em clustered table
é como se organizassemos nossa propria tabela
é como se reorganizassemos nossa propria tabela

a prpria tabela é organizada pelo index, sedo que é organizado pela coluna
atrelada ao index

tem que seguir boas praticaspara criacao de indices clustered

++++++++++++++++++++++++++++++
os non clustered e o clusted usam de b-tree
quando usado o clustered inx a tablea heap vira clustered table
vc pega a tabela e gorganiza pelo clustered index
todos os dados ficam dentro da tabela mas tudo dentro do nivel folha

somente um indice clusterizado pode ser criado na tabela


isso pq é feito uma organizaçao fisica, por isso se pode apenas
uma ?????????????????

o código abaixo vai trazer o endereço físico dos registros


select sys.fn_PhysLocFormatter(%%physloc%%), *
from tMovimento
where iIDMovimento = 127461
go

+++
quando é criado o indice clustorizado é modificado os endereços
fisicos das linhas
no indice nao clusterizado nao muda os endereços fisicos

a gente consegue ver os outputs

o indice non-clustered faz referencia ao indie clustered


já os indices non-clusterd pode ser criado ate 999

o indice não custorizado tem um ponteiro para recuperar o dado

para criar indice clustered, basta


Create Clustered Index idcID on tAluno(id)
dai a propria tabela é organizada de acordo com o index

vai mudar a posicao no disco, qual pagina tem cada row de data
pq a estrutura apos adicionar o indice clustered é mudada]

----------------------------
Chave primária tem de ter indice
----------------------------

de preferencia seja um int


inteiro , pode ser até 4 byte recomendaçao 2 bilhoes para uso de chave primaria
essa coluna nao necessita nao ter relacao com os dados da aplicaçao,
isso pq se o mundo externo muda,e a chave depende dele a chava deve mudar
ou seja se pude crie de modo artificial, numerica, crescente
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
nao é bom que a chave primaria tenha realçao com o mundo externo
o mundo externo muda , e mude a chave primaria de uma tabela, nao é simples
crie ela de preferencia :altificial, numeriaca ,artificial, crescente

O cpf poderia ser uma chave primária?Até poderia, mas imagina o governo
falando que a parti de hoje vai ter mais um caracter e chave então vc teria que
trocar ela
e todas relacionadas.Nao é uma boa opçao

Quando criamos em uma tabela uma constraint do tipo Primary Key, o SQL Server já
cria um índice
Clusterizado Único para manter essa restrição.

o fato de você criar um índice Clusterizado em uma tabela que não tem chave
primaria
a criaçao desse indice não significa a chave primaria foi criada
No SQL SERVER quando vc criaa chave primaria vc cria o indice clustered mas
como disse acima o contrario nao é verdade

sp_helpindex 'tClient'
sp_pkeys 'tClient' --diz quem é a chave primaria

se o negócio muda a tabela n vai mudar


pk ser int por conta do fator de preenchimento
evite colocar pk com mais de uma coluna

OBS
Atenção, o fato de você criar um índice Clusterizado em uma tabela que não tem
chave primária,
a criação desse índice não significa que a chave primária foi criada.

o PRIMARY no sp_helpindex nao é de primary key


tem que ser primary key para ter

----------------------------
Chave Estrangeira
----------------------------

Quando falamos em SQL SERVER, a FK (abreviação de Foreign Key) pode ser uma coluna
ou conjunto de colunas
que deve possuir o mesmo tipo e tamanho de dados da PK (abreviação de Primary Key)
da tabela que manterá o
relacionamento.

A ocorrência de uma entidade somente existirá se a chave estrangeira dessa entidade

se relacionar com a chave primária da outra entidade.

+++++++++++++++++++++++++++++++
Quando criamos um relacionamento entre duas tabelas, em algum momento do código em
SQL,
utilizaremos os comandos de Junções (JOIN) para acessar dados de ambas as tabelas
e o JOIN realizará a pesquisa na
tabela com a PK e a FK.

Uma boa pratica que é se tiver indice na tabela primary key


é uma boa ter tbm na que tem PK

stored procedure de sistema sp_fkeys @fktable_name='tItemMovimento' para ver


se tem FK na tabela

De forma semelhante, quando utilizarmos os comandos UPDATE e DELETE na tabela que


tem a PK, ocorrerá
uma consultas nas tabelas quem tem FK para garantir a integridade referencial.

para ver se tem foreign key


sp_fkeys @fktable_name = 'tItemMovimento'

para adicionar chave estrangeira


Alter Table tItemMovimento
add constraint FKProduto Foreign key (iidProduto) References
tProduto(iidProduto)

VOLTAR

----------------------------
Índice composto para pesquisas compostas
----------------------------
Clustered Index Scan
procura em todos os indeces aproveita
a estrutura

ele adiciounou um indice e a complementaçao dos dados


e a procura pela outra consi;cao fica no Key Lookup

Existe neste caso uma questao sobre a Seletividade da coluna


No caso da iIDCategoria ela apresenta uma baixa seletividade.
Isso quer dzer que os dados são altamente repetitivos
Estamos falando disso pq?pois tinhamos um clustered index e duas condiçoes
de colunas no qual uma tinha um indice nonclustered e no outro
nada. Acabou que um um fez uma clustered index table e a outra um
clustered index
O SQL tem statisticas de distribuiçao da coluna
Ai o sql escolhe fazer o scan ao inves da chave

um indice usando mais de uma coluna tem seletividade alta


ou seja retorna poucas linhas

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
para saber se a coluna tem alta , ou baixa seletividade entre elas
execute esse codigo e avalie

Select iidCategoria , COUNT(1) from tProduto


group by iidCategoria
order by COUNT(1) desc
o Indice composto vc vai usar quando na sua query tiver 2 ou 3 colunas
mas tem q avaliar

----------------------------
Índice com culunas calculadas
----------------------------

-O retorno da coluna deve ser deterministica


-nao pode ser do tipo REAL,FLOAT,TEXT,NTEXT ou IMAGE
(a nao deterministica, vc nunca sabe o valor que possa retornar)

em um exemplo e disse que uma coluna tinha resultado determinisco pq ele con
seguia descubrir o valor pela equaçao

coluna calculada tem yes na coluna computed

nao conseguimos criar um indice em uma varchar(max) até 2gb de dados


entao vc pode criar uma coluna

index vc só coloca até 90 bytes, por isso em dados grandes vc nao consegue
en'ão vc usa clunas, indices calculados

----------------------------
Colunas incluidas e índices de cobertura.Garanta performance máxima
----------------------------

Colunas incluídas no índices não são utilizadas como chave de pesquisa. Esse
recurso
existe para evitar o Key Lookup ou RID Lookup

Sintaxe:
Create NonClustered Index <Nome do Indice>
on <Nome da tabela> (<Coluna1>,<Coluna2>,...)
Include ((<Coluna3>,<Coluna4>,...)

se vc tem na sua query- select where e tive elas no seu indice


vc tem um indice de cobertura

----------------------------
O que é Page Splits e o Fator de Preenchimento
----------------------------
page split é caraaaaa
toda alocaçao
Sempre vai existir page split o que devemos fazer é dirimir

tem a page split natural, pois se acba tem que começar nova paginas
mas tem como diminuir, escolhendo indices menores

Fillfact diz quanto vai preencher a proxima pagina quando estrourar

com um fill factor menor seu select vai ter de ler um numero maior de paginas
mas o seu insert vai ser mais rápido update,

SARGS
nao entra NOT IN != existe
pois n levra a uma expressao de extatidao'
a expressao constante, (o valor) tem de ser do mesmo tipo da coluna

where, a expresssão não está clara para o sql server


tipo
where iidproduto*1=1 não está claro
e aí é um index scan
muito melhor seria um iidproduto=1

se vc mascara o dado pode acontecer isso

+++++++++++++++
se tiver expressao do lado direito pode

or deixa a expressao noSarq

++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
set statistics profile on
mostra a equivalencia dele, se faz conversao implicita e talz
legal para ver aquela proc lá
mas se for do lado direito não temproblema
continua sendo sarg

o problema é quando convert o cara da esquerda


dda para vee com
set statistics profile on
e o sql dicidi isso vendo a precedencia
o menor convert para o tipo maior

+++++++++++++++++++++++++
no JOIN todas as colunas devem ser do mesmo tipo de dados

Mas quando o JOIN é realizado em colunas que não tem essa integridade ou quando
temos que tratar dados em tabelas temporárias de dados importados.

zontrol+shift+R da um refresh no intellisense

erros de conversao
123 312 para int vai zebrar

outro erro vc cria uma coluna que vai fazer conversao para um tipo
de acordo com os predicados
mas se vc colocar sum e atigir um valor maior que suporta ,vai quebrar a
operaçao sum(nPreco*nEstoque )

+++++++++++++++++++
ESTUDAR CONVERSOES IMPLICITAS

NAO NOMEIE STORED PROCEDURES INICIADOS COM SP_

Você também pode gostar