Você está na página 1de 24

SQL Server

Melhores Práticas

Desempenho, Queries e
Outras Facilidades
Alvaro Pereira Neto
Tabelas Temporárias - TempDB

• TempDB – Banco de dados que armazena tabelas temporárias. É


um recurso global disponível para todos os usuários conectados no
SQL Server;
 Armazena tabelas temporárias criadas explicitamente (através
de create table, select into – com o nome precedido com # ou
##);
 Armazena tabelas de trabalho geradas para guardar
resultados intermediários de queries e sorting;
 Armazena cursores estáticos materializados;
• As Ferramentas da Microsoft, para o SQL Server (MS Enterprise
Manager, SQL Query Analyzer, SQL Management Studio, etc),
sempre criam tabelas temporárias;
• O TempDB é sempre recriado no start do SQL Server.

Alvaro Pereira Neto


Tabelas Temporárias - TempDB

Qual o tempo de vida de uma tabela temporária ?


Uma tabela temporária existe enquanto a conexão do
usuário que a criou existir, ou até que se efetue um DROP na
mesma.
OBS:
• tabelas temporárias são precedidas por #;
• podem ser criadas com CREATE TABLE ou com a operação
SELECT INTO;
• somente estão acessíveis na seção que as criou (salvo se for
uma global temporária, precedida por ## mas pouco utilizada –
esta é acessível a todas as conexões do SQL Server durante o seu
tempo de vida);
• não podem ser utilizadas internamente em Functions (se o retorno
da Function é do tipo TABLE, então o resultado já estará no
TempDB).

Alvaro Pereira Neto


Tabelas Temporárias - TempDB
Por que utilizar tabelas temporárias ?
• Desempenho muito superior para cursores, SELECTs com grau de
complexidade elevada (muitos subselects, joins, tratamento de
colunas com functions, etc);
• Devido ao grande desempenho, são utilizadas para carga de
informações via Bulk Insert (ou via cursores, insert selects, entre
outros);
• No SQL Server 2005, objetos temporários são colocados em
cache, o que melhora sensivelmente o desempenho;
OBS:
Tabelas temporárias não são colocadas em cache nos seguintes
casos: quando se usa query dinâmica, quando se usa constraints
nomeadas nas mesmas, ou ainda quando existe uma DDL de
alteração da mesma após a sua criação.

Alvaro Pereira Neto


Tabelas Temporárias - TempDB
Exemplos 1

CONCLUSÃO – Onde utilizar ?


•http://www.sqlteam.com/article/temporary-tables
•http://www.sqlservercentral.com/articles/T-SQL/temptablesinsqlserver/1279/

•http://
www.codeproject.com/KB/database/TempTable.aspx

Alvaro Pereira Neto


Índices Clusterizados e Não Cluserizados
O acesso às informações, por parte do SQL Server, através de uma
query, é feita por duas maneiras:
• varredura da tabela (Full Scan);
• através de Índices;

Índices Clusterizados –
• Funcionam como num dicionário ou uma agenda telefônica (as
informações estão ordenadas de forma ascendente, e são inseridas
ordenadamente no índice);
• Pode ocorrer apenas um por tabela;
• As PKs são criadas, por padrão (quando não se informa o
contrário), clusterizadas.
• Muito utilizados para colunas que possuem faixas de valores (por
exemplo: datas, anos, etc) ou que utilizam ordenações frequentes.

Alvaro Pereira Neto


Índices Clusterizados e Não Cluserizados

Índices Não Clusterizados –


• Informações são armazenadas na forma de um heap (não possuem
uma ordenação lógica – são gravados nas páginas que possuem
espaço disponível), e as linhas das tabelas são utilizadas como
identificadores das linhas do índice;
• Muito usado em colunas com alta densidade, ou seja, muita
repetição da mesma ocorrência.

Alvaro Pereira Neto


Índices Clusterizados e Não Cluserizados
Forçando Índices (a instrução WITH (INDEX=))
A instrução WITH INDEX permite que seja indicado o
melhor índice para o SQL Server, caso os planos do otimizador
tracem outras utilizações de índice (por exemplo, utilizando a
PK ao invés de um índice existente mais correto para o melhor
desempenho).
 (ou seja: você cria um índice não clusterizado, utiliza os
campos nas cláusulas WHERE e ORDER BY, e mesmo assim
o SQL traça planos que usam a PK).
Para verificar a não utilização de um índice, devemos
analisar o plano de acesso criado pelo otimizador de planos do
SQL Server.

Exemplos 

Alvaro Pereira Neto


Índices Clusterizados e Não Cluserizados
Por que forçar índices ?
Em algumas ocasiões, tabelas já possuem índices
definidos, entretanto o SQL Server sempre monta planos de
execução nos quais é utilizada a PK, que não é a melhor
opção de escolha em vista da cláusula restritiva ou de um sort.
E isto acontece com bastante frequência quando as
estatísticas internas do SQL Server não são utilizadas, ou
quando não são atualizadas periodicamente (para os bancos
de dados de produção, no DNPM, as estatísticas são
atualizadas diariamente  APOIO, ARREC2297, ARRECADACAO,
CADASTROMINEIRO, CODMINERACAO, CONTROLE_PROCESSO,
DBCREDITO, DBPLAN, FISICAJURIDICA, PORTALNOVO, SCM, SISMINE,
SISMINE_AMBR, X_MOD1).

Exemplos 
Alvaro Pereira Neto
Índices Clusterizados e Não Cluserizados

Conclusão

Alvaro Pereira Neto


Lock Hints – Esquemas de Locks do SQL Server

Locks Compartilhados -
Os bloqueios podem ser compartilhados, e este é o
caso que vamos tratar (compartilhamento de LOCKs em
SELECTs).
Os Locks, no SQL Server, podem ser: ROWLOCK,
TABLOCK, PAGLOCK, XLOCK (Exclusivo), UPLOCK,
HOLDLOCK (para Transações), NOLOCK.
O SQL Server disponibiliza um Handle Compartilhado
para SELECTs, o qual é compartilhado com as outras
conexões e é utilizado pelo gerenciador de Locks.

Para melhorar o desempenho de SELECTs, utilizamos


a instrução NOLOCK (sem bloqueio – UnReadCommited).

Alvaro Pereira Neto


Lock Hints – Esquemas de Locks do SQL Server

NOLOCK –
O resultado de leituras com nolock são as chamadas leituras
sujas, visto que poderão ser lidas linhas de um UPDATE que está
ocorrendo agora na tabela.

Exemplos
SELECT id_processo
FROM CONTROLE_PROCESSO..PROCESSO WITH (NOLOCK)
WHERE Proc_Ano_Processo BETWEEN 1999 AND 2008

Alvaro Pereira Neto


Trabalhando com Tipos, Conversão entre Tipos e
Identity no SQL Server -
Tipos para Campos, Variáveis, Procedures e Functions –
Basicamente, todos os tipos de variáveis também estão
disponíveis para colunas, parâmetros de Procedures e Functions
(tanto de entrada como de saída). A diferença mais significante está
no fato de que Functions podem ter retorno do tipo Table.

Exemplos (Exemplo 4)
Os tipos de dados do SQL Server serão mostrados na
documentação oficial da Microsoft (SQL Server Books-OnLine).

Alvaro Pereira Neto


Trabalhando com Tipos, Conversão entre Tipos e
Identity no SQL Server -

Os tipos VARCHAR, CHAR, NVARCHAR –


Para os tipos VARCHAR e CHAR, cada byte representa um
caracter. Quando usamos NVARCHAR, então estamos tratando de
Strings que são UTF8 e, portanto, cada caracter é representado por 2
bytes.
VARCHAR (400) => NVARCHAR (800)  NVARCHAR, para
guardar a mesma String de VARCHAR ou CHAR, terá que conter o
dobro da capacidade dos mesmos.

Alvaro Pereira Neto


Trabalhando com Tipos, Conversão entre Tipos e
Identity no SQL Server -
Os tipos DATA e HORA – DATETIME e SMALLDATETIME –
Para trabalhar com tipos DATA, todo o cuidado é pouco!
Comparações e operações de soma e subtração de DATAS, além
de referências em cláusulas WHERE (principalmente para VIEWs),
deverão ser sempre feitas com os tipos DATETIME e
SMALLDATETIME. Para isso, utilize sempre CONVERT (tipo a
converter=datetime ou smalldatetime, informação que se quer
converter, estilo=103 ou101 ou etc). Veja a tabela de estilos e a de
conversão entre tipos do MS SQL Server Books Online para o uso do
CONVERT.
Exemplo:
CREATE VIEW dbo.VWDatasInternationais AS
SELECT IDPedido, TotalCompra FROM
DBVendas.dbo.TB_Pedido
WHERE DTPedido < CONVERT(DATETIME,'20020501',101);
Alvaro Pereira Neto
Trabalhando com Tipos, Conversão entre Tipos e
Identity no SQL Server -

Exemplos 5

CONCLUSÃO
– Onde e como utilizar ? 
Procure por CAST e CONVERT
no Books Online.

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
O Operador LIKE –
O Operador LIKE (e ainda um NOT LIKE  excludente) tem
a função de pesquisar ocorrências de padrões de Strings em colunas
do tipo String.
Os Wildcards possíveis são:
%  Qualquer padrão de strings;
_  Qualquer caracter simples;
[]  Qualquer caracter presente na faixa ou lista entre colchetes;
[^ ]  Qualquer caracter que não esteja presente na faixa ou lista
indicada entre colchetes.
 E para utilizar um caracter Wildcard como um literal, na sua
pesquisa, utilize-o entre colchetes.

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
O Operador LIKE –
Diferenças de linhas retornadas – para ASCII e UTF8 LIKE pattern matching.
-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30));
INSERT INTO t VALUES ('Robert King');
SELECT * FROM t WHERE col1 LIKE '% King‘ -- returns 1 row

-- Unicode pattern matching with nchar column


CREATE TABLE t (col1 nchar(30));
INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1
LIKE '% King' -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM


CREATE TABLE t (col1 nchar (30));
INSERT INTO t VALUES ('Robert King');
SELECT * FROM t WHERE RTRIM(col1) LIKE '% King' -- returns 1 row

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
A Tecnologia FullText Search –

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
O Predicado CONTAINS –
Após a criação de um Full-Text Index para um ou mais
campos do tipo text, image, entre outros, poderemos então, ao invés
de usar o operador LIKE utilizar o predicado CONTAINS.
A utilização de CONTAINS na cláusula WHERE pode ser
uma nova cláusula restritiva em sua parametrização, visto que
poderemos utilizar: { AND | & } | { AND NOT | &! } | { OR | | }
Além de ANDs e ORs, podemos pesquisar palavras que
estejam próximas de outras (NEAR), prefix_term, generation_term, e
weighted_term )

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
O Predicado CONTAINS –
Exemplos:

SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance')
GO

SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')
GO -- servirão os valores ride, riding, ridden, e todas as flexões deste verbo.

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ')
GO

Alvaro Pereira Neto


Trabalhando com FullText Index – Utilizando CONTAINS
ao invés do operador LIKE -
O Predicado CONTAINS –
Exemplos:

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' ("chain*" OR "full*") AND "nothing*" ')
GO

Alvaro Pereira Neto


Por que devemos utilizar STORED PROCEDURES
em RDBMSs (SGBDRs) ? -
• Manutenção muito mais simplificada –
Desenvolvedores, Analistas, DBAs;
• Utilização e reutilização por diversos sistemas bastante
acentuadas – através de documentação, cada
Desenvolvedor conhece as procedures e functions
disponíveis para os bancos de dados que ele deseja
realizar consultas e atualizações em seus sistemas;
• Controle sob a performance de queries – DBA;
• Entre outras vantagens.

Alvaro Pereira Neto


SQL Server

Melhores Práticas
(Apresentar Cursores)
Conclusões, Perguntas e
Finalização.
Alvaro Pereira Neto