SQL SERVER Com Máximo Desempenho-Aprenda T-SQL TUNNING
SQL SERVER Com Máximo Desempenho-Aprenda T-SQL TUNNING
------------------------------------------------------------------------
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
----------------------------
Memória da instancia do SQL Server. A configuraçao ideal
----------------------------
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
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
----------------------------
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 :
/*
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.
*/
----------------------------
Armazamento e tipos de dados. Dados certos nos lugares certos
----------------------------
----------------------------
Criando as melhores tabelas
----------------------------
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
o famoso permited
----------------------------
Compactando meus dados
----------------------------
compactando dados conseguimos ler mais dados em uma mesma pagina
no buffer pool continua compactado
+++++++++++
existe compactaçao por linha e compactaçao por página
----------------------------
Gestão de desempenho com visoes de gerenciamento dinamicos DMV
----------------------------
Select *
From sys.dm_exec_sessions
login, qual maquina fez acesso
++++++++++++++++++++++++++++++++++
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
----------------------------
Set statistics io on
----------------------------
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.
----------------------------
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
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
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).
----------------------------
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
----------------------------
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 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')
----------------------------
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
----------------------------
Visualizar Estatísticas pelo SSMS
----------------------------
para ativar
Query->Include client Statistics ou Shift+alt +S
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++
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
Coluna de dados
---------------
Algumas caracaterísticas.
----------------------------
Plano de Execuçao. Como é a execucao fisica da query é feita
----------------------------
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
- Table Scan
- Index Scan
- Sort
- RID Lookup (Heap)
- Compute Scalar
*/
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
----------------------------
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]
Checkpoint
go
dbcc DROPCLEANBUFFERS
Go
--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
+++++++++++++++++++++++++++++++++
FAZER O ROTEIRO
----------------------------
Os tipo de índices suportados pelo SQL Server
----------------------------
a prpria tabela é organizada pelo index, sedo que é organizado pela coluna
atrelada ao index
++++++++++++++++++++++++++++++
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
+++
quando é criado o indice clustorizado é modificado os endereços
fisicos das linhas
no indice nao clusterizado nao muda os endereços fisicos
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
----------------------------
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
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.
----------------------------
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.
+++++++++++++++++++++++++++++++
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.
VOLTAR
----------------------------
Índice composto para pesquisas compostas
----------------------------
Clustered Index Scan
procura em todos os indeces aproveita
a estrutura
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
para saber se a coluna tem alta , ou baixa seletividade entre elas
execute esse codigo e avalie
----------------------------
Índice com culunas calculadas
----------------------------
em um exemplo e disse que uma coluna tinha resultado determinisco pq ele con
seguia descubrir o valor pela equaçao
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>,...)
----------------------------
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
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
+++++++++++++++
se tiver expressao do lado direito pode
++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
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
+++++++++++++++++++++++++
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.
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