Boas_praticas_de_programacao_transact_sql
Por: Miller.galdino • 14/5/2015 • Artigo • 6.973 Palavras (28 Páginas) • 172 Visualizações
[pic 1][pic 2][pic 3]
BOAS PRÁTICAS DE
PROGRAMAÇÃO
[pic 4]
TRANSACT-SQL
Versão 01.04.00
[pic 5]
Salvador (Ba), outubro de 2012
CONTROLE DE VERSÃO
Versão | Data | Responsável | Histórico |
01.01.00 | 29/12/2006 | Equipe AD (Padrões) |
|
01.02.00 | 15/01/2009 | Equipe AD (Padrões) |
|
01.03.00 | 18/04/2011 | Equipe AD (Padrões) | 1. Inclusão do item “Controle de Execução de Scripts” no tópico “OBSERVAÇÕES”. |
01.04.00 | 01/10/2012 | Equipe AD (Padrões) | 1. Inclusão do item “SET NOCOUNT ON” no tópico “OBSERVAÇÕES”. |
ÍNDICE
1. OBJETIVO
2. TABELAS TEMPORÁRIAS
3. TRANSAÇÕES
4. ÍNDICES
5. PLANOS DE EXECUÇÃO
6. VISÕES
7. VERTICALIZAÇÃO DE TABELAS
8. FUNÇÕES DEFINIDAS PELO USUÁRIO
9. REFERÊNCIA CRUZADA
10. TABELAS DE HISTÓRICO
11. TABELAS PARTICIONADAS
12. NOVOS TIPOS DE DADOS DO SQLSERVER 2005
13. SERVICE BROKER
14. CAMPOS XML
15. OBSERVAÇÕES
16. CONCLUSÃO
17. REFERÊNCIAS
- OBJETIVO
Este documento reúne um conjunto de técnicas de programação em Transact-SQL que devem ser adotadas para garantir um bom desempenho das aplicações no ambiente SEFAZ.
- TABELAS TEMPORÁRIAS
Recomendação: Não utilizar tabela temporária em estado de transação.
Quando uma tabela temporária é construída, são gerados bloqueios em tabelas do catálogo (sysobjects, sysindexes e syscolumns) no TEMPDB. O TEMPDB é um banco compartilhado por todos os usuários de um servidor SQL Server e é um recurso extremamente utilizado na geração de tabelas temporárias, cursores, etc. Se uma tabela temporária for criada em estado de transação, os bloqueios serão mantidos até o final da transação, bloqueando outros usuários e comprometendo a performance do servidor.
Tabelas temporárias podem ser substituídas por joins ou por tabelas derivadas em grande parte das situações, evitando os bloqueios no TEMPDB e melhorando a performance das aplicações. Seguem alguns exemplos de substituição de tabelas temporárias por joins e tabelas derivadas:
Com tabelas temporárias:
(solução não recomendada)
CREATE TABLE #tipo_operacao (
cod_operacao int not null,
des_operacao char(20) not null
)[pic 6]
INSERT INTO #tipo_operacao
SELECT * FROM tipo_operacao
WHERE cod_operacao > 10
SELECT *
FROM operacao O INNER JOIN #tipo_operacao TO
ON (O.cod_operacao = TO.cod_operacao)
DROP TABLE #tipo_operacao
Com JOIN:
(solução recomendada)
SELECT cod_operacao, des_operacao [pic 7]
FROM operacao O INNER JOIN tipo_operacao TO
ON (O.cod_operacao = TO.cod_operacao)
WHERE TO.cod_operacao > 10
A seguir, analisaremos um exemplo mais trabalhado, semelhante à geração de relatórios. Neste exemplo, a solução apresentada é o uso de uma tabela derivada que nada mais é do que a substituição de uma tabela na cláusula FROM por uma consulta. O exemplo abaixo, assim como outros exemplos e tópicos abordados podem ser encontrados no site
http://www.sql-server-performance.com
Com tabelas temporárias:
(solução não recomendada)
[pic 8]
-- CREATE OUR TEMPORARY TABLE
CREATE TABLE #Temp_Example (
[CategoryID] INT NOT NULL,
[Category_Count] INT NOT NULL
)
-- INSERT THE VALUES WE LATER NEED INTO THE TEMP TABLE
INSERT INTO #Temp_Example (CategoryID, Category_Count)
SELECT C.CategoryID, COUNT(*) AS Category_Count
FROM Categories C
INNER JOIN Products P ON C.CategoryID = P.CategoryID
GROUP BY C.CategoryID, C.CategoryName
-- JOIN ON THE TEMP TABLE TO GET OUR VALUES
...