Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL Server 2005 PDF
SQL Server 2005 PDF
9 de Dezembro de 2009
Contents
1 Introdução 1
1.1 Introdução histórica 1
1.2 Notas sobre instalação do sistema 2
2 Cobertura do SQL 3
2.1 DDL 3
2.2 DML 5
2.3 Tipos de Dados 6
3 Armazenamento e file structure 9
3.1 O Buffer Pool 9
3.2 Acesso às páginas em memória 10
3.3 Gestão de páginas na cache de dados 10
3.4 Arquitectura NUMA 11
3.5 Read-ahead 11
3.6 Sistema de ficheiros 12
3.7 Páginas e Extents 12
3.8 Organização dos ficheiros 13
3.9 Mecanismo de partições 13
4 Indexação e Hashing 17
4.1 Estrutura B-tree 17
4.2 Tipos de Índices 20
4.2.1 Índices clustered 20
4.2.2 Índices non-clustered 21
4.3 Implementação de Índices 23
4.3.1 Índices com colunas incluídas 23
4.3.2 Indexação de views 23
4.3.3 Indexação full-text 23
4.3.4 Indexação XML 24
4.4 Criação de Índices 24
4.4.1 Argumentos do comando CREATE INDEX 25
4.4.2 Opções do comando CREATE INDEX 25
4.5 Indexação e Hashing - Oracle 10g vs MS SQL 2005 27
5 Processamento e Optimização de Queries 29
5.1 Algoritmos para Junções 30
5.1.1 Nested Loop 30
5.1.2 Merge 31
i
ii
5.1.3 Hash 32
5.1.4 Grace Hash 33
5.1.5 Join Remoto 33
5.2 Escolha de Índices e avaliação de sub consultas 34
5.3 Optimização de queries 34
5.3.1 optimizadores baseados em sintaxe 34
5.3.2 optimizadores baseados em custo 34
5.3.3 fases de optimização 34
5.4 Paralelismo 35
5.5 Estatisticas 35
5.6 Pistas em consultas 37
5.6.1 Pistas do tipo Join 37
5.6.2 Pistas do tipo Tabela 38
5.6.3 Pistas do tipo Query 39
6 Gestão de transacções e controlo de concorrência 41
6.1 Tipos de transacções 42
6.1.1 Autocommit 42
6.1.2 Transacções explícitas 42
6.1.3 Transacções implícitas 45
6.1.4 Batch-scoped 45
6.2 Locks 46
6.2.1 Níveis de granularidade 46
6.2.2 Modos de lock 47
6.2.3 Níveis de isolamento 49
6.2.4 Locking Hints 50
6.2.5 Deadlocks 50
6.3 Transacções de longa duração 50
7 Suporte para bases de dados distribuídas 53
7.1 Replicação 53
7.1.1 Funcionamento 54
7.1.2 Tipos 54
7.1.3 Agentes 54
7.2 Mirroring 55
7.3 Log Shipping 55
7.4 Transacções Distribuídas 56
7.5 Acesso a outras Bases de Dados 56
7.6 Federação 57
8 Outras características do sistema estudado 59
List of Figures
7.1 Replicação 53
7.2 Mirroring 55
7.3 log shiping 56
iii
1
Introdução
A sociedade moderna encontra-se inundada de dados - dados científicos, dados clínicos, da-
dos demográficos, dados financeiros, entre outros. Estes dados precisam de ser armazenados,
acedidos e alterados. Estas são as funções das bases de dados. Hoje em dia, poucas são as
organizações que conseguem funcionar sem esta tecnologia. Para ajudar na manutenção das
bases de dados, foram criados os Sistemas de Gestão de Bases de Dados (SGBD), que são um
conjunto de programas que controlam a organização, armazenamento e acesso aos dados.
Existem vários SGBD, sendo o sistema Oracle, considerado o melhor, pela indústria. No
entanto, o SGBD da Microsoft, SQL Server, tem vindo a ganhar terreno, principalmente por
oferecer uma elevada facilidade de instalação, para um SGBD do seu calibre.
Neste relatório, iremos apresentar algumas características do Microsoft SQL Server, que
mostram que este SGBD consegue concorrer com o seu rival comercial Oracle.
com que a Microsoft quisesse passar a desenvolver o SQL Server exclusivamente para o Win-
dows, usando as capacidades do seu sistema operativo. A Sybase, no entanto, queria continuar
a desenvolver software multi-plataforma, pelo que as duas empresas se separaram.
Assim, em 1995, a Microsoft lançou o SQL Server 6.0 que, pela primeira vez, estava com-
pletamente integrado com o Windows NT.
Na tentativa de tornara o seu SGBD cada vez mais intuitivo, foi lançado em 1998 o SQL
Server 7.0, o primeiro SGBD com uma verdadeira interface gráfica.
A marcha não ficou por aqui. Em 2000 foi lançado o SQL Server 2000 que dava con-
tinuidade a um produto que por esta altura já era bastante reconhecido no mercado empresarial
(em 2003 seria lançada a versão 64 bits - que também se tornaria na primeira versão deste
SGBD a fazer uso desta arquitectura).
Em 2005 foi lançado o SQL Server 2005 (a versão estudada neste relatório) e, recentemente,
em Agosto de 2008, foi lançada a versão 2008.
Para a realização deste trabalho foram consultados os manuais [10], [6], [5], [4], [8], [7],
[3], [2], [9] e o site [1].
Antes de instalar:
1. Desinstale a Framework .NET 1.2 (as versões 1.0 e 1.1 não têm de ser obrigatoriamente
desinstaladas). A seguir instale a Framework .NET 2.0.
2
2
Cobertura do SQL
2.1 DDL
DDL é um subconjunto de operações do SQL que contem os comandos para definir dados.
Os principais comandos deste conjunto são o CREATE, ALTER e DROP. O T-SQL tem su-
porte para criação, alteração e destruição de Base de Dados, Funções, Índices, Procedimentos,
Tabelas, Triggers, Utilizadores e Views. De entre estes o mais usado é o CREATE, nomeada-
mente para criação de tabelas, que iremos detalhar de seguida. Na sua forma mais simples,
CREATE TABLE table_name (column_name1 data_type, column_name2 data_type ,...), é cri-
ada uma tabela onde só estão definidos o seu nome, o nome das colunas e o tipo de dados que
cada coluna irá suportar, sem estar limitado por quais queres restrições. Para o caso de se dese-
jar ter uma base de dados mais poderosa e coesa o T-SQL disponibiliza, entre muitos outros, os
seguintes parâmetros e restrições:
• Database_Name: onde podemos indicar em que base de dados será criada a tabela, essa
cláusula remove a necessidade de usar o USE.
• Owner: poderá especificar outro dono para a tabela, caso não seja especificado o uti-
lizador actual fica como dono.
• Seed: se quiser que o ID da tabela não comece a 1, poderá indicar o valor neste argu-
mento.
3
2. C OBERTURA DO SQL 2.1. DDL
• Increment: poderá indicar que incremento usar em cada novo tuplo, por omissão este
valor é 1.
• Not for Replication: Se esta condição estiver activa, o sistema de base de dados não
irá tentar impor novos valores de ID aos dados inseridos por um processo replicante,
mantendo o ID original. Os dados inseridos por outros processos não serão afectados.
• Null: que indica se o valor de uma coluna poderá ser ou não Null.
• Primary Key: indica se uma coluna ou conjunto de colunas formam um valor identifica-
tivo de uma tabela, implica que os valores, ou pares de valores, sejam únicos.
Estes parâmetros também estão disponíveis para o ALTER. Para destruir estruturas, é usado o
comando DROP com a seguinte sintaxe básica: DROP type name. A quando da remoção de
uma tabela todas os tuplos, índices e triggers específicos dessa tabela irão ser removidos, mas
Views e Procedimentos que têm referencias para a tabela terão de ser removidos manualmente
usando o DROP View/Procedure. Como indicado anteriormente os tuplos de outras tabelas que
tem como Foreign Key alguma coluna desta tabela, só irão ser removidos caso esteja activa a
opção ON DELETE CASCADE.
4
2. C OBERTURA DO SQL 2.2. DML
2.2 DML
DML é o conjunto das operações que manipulam os dados. Quer isso dizer que serão us-
adas para inserir, remover e editar dados, nomeadamente com os comandos INSERT, UPDATE
e DELETE. Também está incluido nesse conjunto o comando SELECT, para acesso aos dados,
que será a longe prazo o mais usado. Para poder trabalhar com os dados temos de primeiro
inseri-los. O INSERT do T-SQL é muito versátil deixando, entre outros, inserir dados Null,
tuplos com menos dados que colunas, por diferentes ordens, através de tabelas temporárias e
views e até usar o SELECT e EXECUTE dentro do INSERT. Podemos posteriormente alterar
estes dados com o UPDATE. Este suporta copiar dados de outras tabelas, alterar só um valor
com o SET e indicando o nome da coluna, seleccionar que tuplos actualizar usando o WHERE
e podemos até inferir diferentes valores usando a cláusula CASE. A forma mais comum de
remover dados é indicando a tabela e que condições o tuplo precisa de ter, mas o T-SQL tam-
bém tem suporte para remover sem indicar condições, remover vários tuplos, remover o tuplo
onde se encontra um cursor e até remover tuplos seleccionados com uma sub consulta. Caso
não deseje editar os dados o T-SQL disponibiliza o comando SELECT, com suporte para a
estrutura do SELECT do standard SQL, para aceder aos dados. Dados esses que podem ser
Views, cursores, tabelas, subconjunto de tabelas e mesmo resultados de outro SELECT. Pode-
mos usar o SELECT desde a sua forma mais básica, SELECT ’Hello World’, que simplesmente
irá devolver ’Hello World’ ou SELECT (select_list) INTO (new_table) FROM (table source)
WHERE (search_condition) GROUP BY (group_by_expression) HAVING (search_condition)
ORDER BY (order_expression) [ASC / DESC], onde já se encontram algumas das muitas
clausulas para o qual há suporte. Iremos agora explicar algumas das cláusulas:
• AS: permite renomear as colunas.
• FOR XML: indica que o resultado da query deve ter o formato XML.
• JOINS: é o produto entre duas ou mais resultados. Tem suporte para INNER e [LEFT|RIGHT|TOTAL]
OUTTER JOIN.
• bigint
• int
• smallint
• tinyint
• bit
• decimal
• numeric
• money
• smallmoney
• float
• real
Data e hora:
• datetime
• smalldatetiem
Strings:
• char
• varchar
• text
• nchar
• nvarchar
• ntext
6
2. C OBERTURA DO SQL 2.3. Tipos de Dados
Strings binárias:
• binary
• varbinary
• image
Outros:
• cursor
• sql_variant
• table
• timestamp
• uniqueidentifier
• xml
7
3
Armazenamento e file structure
O principal componente de memória do SQL Server 2005 é o buffer pool. Toda a memória
que não esteja a ser usada por outros componentes de memória, permanece no buffer pool, onde
é usada como cache de dados para páginas lidas dos ficheiros da base de dados (em disco).
O gestor de buffer (buffer manager) controla as funções de I/O do disco, com o objectivo de
carregar as páginas para essa cache de dados (de modo a que essa informação possa ser ace-
dida por todos os utilizadores). Quando outros componentes necessitam de memória, podem
pedir um buffer (página em memória do mesmo tamanho que uma página de dados/índices) do
buffer pool. Após estes pedidos, os buffers são, normalmente, transferidos para outros tipos de
caches (como, por exemplo, a cache responsável por guardar as queries e procedimentos SQL
executados recentemente - procedure cache).
Ocasionalmente, o SQL Server precisa de blocos de memória contíguos superiores ao tamanho
máximo das páginas usadas pelo buffer pool (8 KB). Quando assim é, é reservada memória
fora do espaço de endereçamento deste. No entanto, o uso de grandes blocos de memória é
minimizado, de modo a que chamadas directas ao sistema operativo representem uma fracção
mínima do uso de memória.
O SQL Server, ao arrancar, calcula o tamanho do espaço de endereçamento virtual (virtual
address space - VAS) do seu processo, que depende da arquitectura (x86 ou x64) e do sistema
operativo. De notar que os sistemas x86 apenas podem endereçar (directamente) 4 GB de
memória. No entanto, o SQL Server pode fazer uso da API (do Windows) Address Windowing
Extensions (AWE) que, actuando como uma terceira área de memória, permite ultrapassar esta
9
3. A RMAZENAMENTO E FILE STRUCTURE 3.2. Acesso às páginas em memória
restrição. Nos sistemas x64 esta restrição não existe, pelo que é ignorada a configuração para
esta API.
Além do tamanho do VAS, é calculado o número de páginas que se espera ser possível
alocar (este valor é designado por Target Memory).
É possível ver estas informações, bem como outras relevantes ao buffer pool, na Dynamic
Management View (DMV) chamada sys.dm_os_sys_info. Colunas interessantes incluem:
physical_memory_in_bytes - memória física disponível.
virtual_memory_in_bytes - memória virtual disponível.
bpool_commited - número de páginas no buffer pool (não inclui memória reservada).
bpool_commit_target - Target Memory.
O SQL Server tenta manter o acesso às páginas, na cache de dados, rápido (não é eficiente
pesquisar em toda a cache) pelo que as páginas são guardadas numa hash table (implementada
como uma página que contém um array - que na verdade é uma lista ligada - de apontadores para
as páginas na cache), em que a combinação dos identificadores da base de dados (serve para
identificar a que base de dados o ficheiro pertence), do ficheiro e da página, são os argumentos
de entrada da função de hash.
No SQL Server, o mesmo mecanismo é responsável por escrever as alterações das páginas
em disco e por marcar como livre a memória ocupada por páginas que não sejam referenciadas
há algum tempo (sendo mantida uma lista ligada com os endereços das páginas "livres").
Cada buffer na cache de dados tem um cabeçalho que contém informação sobre as duas úl-
timas vezes que cada página foi referenciada, além de outras informações sobre o estado dessas
mesmas páginas, incluindo o facto de uma página estar ou não dirty (o seu conteúdo ter alterado
desde que foi lida de disco). Esta informação é usada na implementação da política de substitu-
ição de páginas, que usa o algoritmo LRU-K (Least Recently Used-K). Este algoritmo baseia-se
na filosofia do algoritmo LRU, mas mantém-se a par das últimas K vezes que a página foi refer-
enciada (sendo usado o valor 2 para K, na implementação do SQL Server). Assim, buffers que
contenham páginas consideradas mais importantes, mantêm-se no buffer pool activo, enquanto
buffers com páginas menos referenciadas acabam por regressar à lista de buffers livres.
O trabalho de percorrer o buffer, escrevendo páginas "dirty" em disco e adicionando buffers
à lista de buffers livres é feito por um processo assíncrono, denominado lazywriter. Este também
é responsável por diminuir ou aumentar a cache de dados, de modo a manter a memória física
livre do sistema operativo em cerca de 5MB, de modo a evitar paginação.
Existe outro processo também responsável por percorrer a cache de buffer, periodicamente,
10
3. A RMAZENAMENTO E FILE STRUCTURE 3.4. Arquitectura NUMA
O SQL Server 2005 é compatível com a arquitectura Non-Uniform Memory Access (NUMA).
A maior vantagem desta arquitectura é o facto de ser uma solução escalável para o aumento do
número de CPUs nos computadores.
Na arquitectura NUMA os CPUs estão agrupados em pequenos conjuntos, designados por
nós NUMA, sendo cada nó servido por um bus de sistema, além de ter a sua própria memória
interna. Cada CPU pode aceder à memória de outros nós, de forma coerente, embora seja
mais rápido aceder à memória local do seu nó. Assim, ao contrário da arquitectura Symmetric
Multiprocessing (SMP), onde todo o acesso a memória é feito pelo mesmo bus partilhado (o que
até funciona bem para um pequeno numero de CPUs), NUMA alivia este "bottleneck" limitando
o número de CPUs num mesmo bus.
O SQL Server tem ainda a vantagem de permitir subdividir um (ou mais) nós NUMA físicos
em nós mais pequenos, denominados software NUMA (soft-NUMA). Tipicamente, usa-se soft-
NUMA quando se está na presença de vários CPUs, mas não de hardware NUMA.
O uso de soft-NUMA permite reduzir o I/O e "bottlenecks" provocados pelo processo lazy-
writer. Por exemplo, num computador com oito CPUs e sem hardware NUMA, temos apenas
uma thread para I/O e um lazywriter (o que pode causar entupimentos). Configurando quatro
nós soft-NUMA, passamos a ter quatro threads para I/O e quatro lazywriters, o que ajuda na
performance.
3.5 Read-ahead
Uma base de dados no SQL Server 2005 pode ser vista como uma colecção de ficheiros que
contêm dados e meta-dados, correspondendo cada ficheiro da base de dados a um ficheiro do
Windows (no entanto, cada ficheiro tem um nome lógico e um nome físico). Esta dependência,
embora diminua a portabilidade deste SGBD, tem a vantagem de permitir fazer uso das fer-
ramentas disponibilizadas por esses sistemas de ficheiros (tal como encriptação e definição de
quotas/permissões) de modo totalmente transparente para o SQL Server.
Existem os seguintes três tipos de ficheiros no SQL Server:
Ficheiros de dados primários - contêm informação sobre todos os ficheiros na base de
dados, além de guardarem dados.
Ficheiros de dados secundários - guardam dados dos utilizadores (índices, vistas, tabelas
e procedimentos). Têm a função de replicar esta informação por vários discos.
Ficheiros Log - contêm informação necessária para a recuperação de todas as transacções
efectuadas.
Os ficheiros de dados podem ser atribuídos a um filegroup, uma característica que permite
agrupar ficheiros. Isto pode ser útil para colocar dados (e índices) numa unidade de disco
especifica ou para a criação de um regime de backup que apenas salvaguarda os ficheiros de
determinados filegroups. Os ficheiros log, no entanto, não podem ser atribuídos a um filegroup
porque são guardados separadamente dos ficheiros de dados.
Neste passo cria-se um esquema de partição. Este esquema define como as partições serão
fisicamente definidas na base de dados (se ficarão em filegroups diferentes ou não).
O comando para este passo é CREATE PARTITION SCHEME, cuja sintaxe é:
A diferença principal entre a criação de uma tabela particionada e uma tabela não-particionada
é a adição de partition_scheme_name (partition_column_name). Isto permite-nos especificar
qual a coluna em que a partição ocorrerá.
A sintaxe de CREATE INDEX é:
Tal como para criar uma tabela, a diferença principal entre a criação de um índice tradicional
e a criação de um índice particionado é a adição de ON partition_scheme_name ( column_name
).
14
3. A RMAZENAMENTO E FILE STRUCTURE 3.9. Mecanismo de partições
O SQL Server 2005 disponibiliza ainda comandos para alterar, arquivar e eliminar par-
tições. Existe também uma DMV para recolher informação sobre as partições, designada
sys.dm_db_partition_stats.
15
4
Indexação e Hashing
O SQL Server 2005 processa o acesso a dados de duas formas distintas. A primeira é através
de um table scan onde todas as páginas, começando no inicio da tabela, são varridas extraindo
assim a informação definida na query. A segunda é através de índices.
Os índices são estruturas que foram desenhadas para aumentar a velocidade de acesso ao
repositório de dados de um SGBD. Se simplificarmos a utilidade destes índices percebemos
que funcionam como o índice de um livro - ao usarmos índices podemos encontrar rapidamente
dados específicos sem termos que ler todo o conteúdo de uma tabela.
Os índices não são estruturas obrigatórias, afectam a performance das queries mas não
afectam a sua funcionalidade. No entanto, esta diferença de performance pode ter um impacto
muito grande no sistema. Esta performance é aumentada reduzindo o trabalho de pesquisa
às queries. Sem índices, é necessário ler todos os dados de uma tabela. De facto o uso dos
índices está directamente ligado aos movimentos de I/O. Quando é executado um table scan,
são gerados milhares de I/O, estas operações têm um custo elevado. Com o uso de índices
são necessárias menos leituras e consequentemente a performance aumenta e a utilização de
recursos diminui. Nesta secção explica-se como funcionam e como podem ajudar a melhorar a
performance de um sistema.
A estrutura de indexação é implementada por árvores B+. Uma árvore é constituída por
uma raiz (root), ramos (branch nodes) e folhas(leaf nodes). A árvore começa com a primeira
página do índice (nó raiz). Esta raiz contem a gama das chaves de pesquisa e os ponteiros para
17
4. I NDEXAÇÃO E H ASHING 4.1. Estrutura B-tree
outras páginas do índice. Os nós entre o nó raiz e os nós folha também contêm as chaves e
os ponteiros para nós inferiores e eventualmente nós folha. Os nós folha têm apontadores para
os dados na tabela ou guardam eles próprios os dados, dependendo do tipo de índice escolhido
(iremos falar sobre os tipos de índice posteriormente). É possivel navegar através dos ramos da
árvore até que seja alcançado um nó folha.
Como podemos ver na figura 4.1 cada nó da árvore está ordenado pela chave de pesquisa.
Os apontadores de cada entrada guiam a pesquisa para uma sub-árvore que contém entradas
consideradas menores que a entrada actual. O nó à direita do nó actual contém uma sub-árvore
em que todos os nós são considerados maiores que qualquer nó da sub-árvore do nó actual.
Desta forma garante-se a ordenação da árvore. Mantendo a árvore equilibrada e ordenada,
permite-se um acesso aos nós folha em poucas iterações. Para manter este equilibro é necessário
assegurar que cada nó ramo mantenha um número de sub-árvores que varie entre n e n/2, onde
n representa o número de níveis da árvore. A ordenação depende da forma como é criado o
índice. Como o índice já está ordenado, às vezes o sistema não precisa de ordenar os dados
quando é usado um ORDER BY (assumindo que o índice é usado e que a ordem pretendida é
igual à do índice).
Com o crescimento da base de dados, os nós da árvore do índice têm tendência a encher.
Quando há uma inserção sobre um nó cheio é necessário parti-lo em duas partes - este processo
denomina-se page split e implica reorganizar a estrutura para atingir um novo estado de equi-
líbrio, este processo tem um custo (overhead) indesejável. No entanto é possivel configurar o
parâmetro fill factor que indica qual o espaço livre que deve ser deixado quando um nó é cri-
ado. Iremos falar deste e de outros parâmetros mais à frente. No SQL Server as árvores B+ são
18
4. I NDEXAÇÃO E H ASHING 4.1. Estrutura B-tree
Neste exemplo podemos que o benificio do uso do índice depende da forma como as chaves
são usadas.
O SQL Server implementa índices de duas classes distintas -clustered index e non-clustered index.
Uma tabela pode ter apenas um índice clustered. A ordenação dos dados fisicamente é a
mesma do índice. Uma tabela que tenha um índice clustered denomina-se clustered table. A
20
4. I NDEXAÇÃO E H ASHING 4.2. Tipos de Índices
selecção das colunas para o índice clustered é muito importante e deve ter em conta a forma
como é normalmente feito o acesso aos dados. Num tipo de índice devem ser consideradas as
seguintes colunas:
• Aquelas que são normalmente alvo de queries que usam operadores como BETWEEN,
>, >=, <, <= ou dentro da cláusula WHERE.
• Aquelas que são frequentemente usadas por queries que fazem joins ou agrupam os re-
sultados.
Os índices non clustered não alteram a ordenação dos dados da tabela. Esta indepêndencia
dos dados permite que sejam criados vários índices deste tipo sobre a mesma tabela - o SQL
Server 2005 suporta até 249 indices non clustered sobre a mesma tabela.
As folhas da árvore de um indice non clustered guardam um apontador para os dados da
tabela e não os próprios dados como acontece num índice clustered. Embora os dados não
estejam guardados nas folhas, sempre que é feita uma alteração na tabela é preciso reorganizar
o índice. O facto do índice não conter os dados da tabela significa que o processamento da
query necessita de um passo adicional para encontrar os dados.
Uma tabela que tenha um índice non clustered denomina-se heap - os dados não têm uma
ordem lógica e são gravados nas páginas que têm espaço disponível.
A figura figura 4.4 mostra um diagrama simples de um indice non clustered definido sobre
a coluna firstname.
21
4. I NDEXAÇÃO E H ASHING 4.2. Tipos de Índices
A utilização de índices non clustered deve ser considerada nos seguintes casos:
• Colunas que são normalmente usadas na clausula WHERE e que retornam resultados
exactos.
É essencial ter uma noção clara sobre como é feito o acesso aos dados para serem criados
índices non clustered. O SQL Server tem ferramentas como o SQL Server Profiler e o Database
Engine Tuning Advisor que ajudam a avaliar o acesso aos dados e a determinar quais as colunas
candidatas.
É possivel definir um índice non clustered sobre um índice clustered. Neste caso, a pesquisa
por uma chave do índice non clustered resultará numa chave de pesquisa a ser utilizada no
índice clustered. Este processo é conhecido por bookmark lookup.
22
4. I NDEXAÇÃO E H ASHING 4.3. Implementação de Índices
A funcionalidade dos índices non clustered pode ser estendida se forem adicionados atrib-
utos que não são usados como chave de pesquisa. Assim é possivel guardar atributos extra no
nó folha da árvore do índice, aumentando a rapidez na disponibilização dos dados. O funciona-
mento é similar ao de um índice clustered, no entanto, nem todos os dados são guardados e
por isso mantém-se a independência física da tabela. Podem ser definidos vários índices com
colunas incluídas sobre a mesma tabela e o efeito de bookmark lookup é evitado.
A funcionalidade dos índices non clustered pode ser estendida se forem adicionados atrib-
utos que não são usados como chave de pesquisa. Assim é possivel guardar atributos extra no
nó folha da árvore do índice, aumentando a rapidez na disponibilização dos dados. O funciona-
mento é similar ao de um índice clustered, no entanto, nem todos os dados são guardados e
por isso mantém-se a independência física da tabela. Podem ser definidos vários índices com
colunas incluídas sobre a mesma tabela e o efeito de bookmark lookup é evitado.
Os índices mais usados no SQL Server são os indices clustered e non clustered que são
organizadados em estruturas B-tree. Estes índices podem ser criados sobre a maior parte das
colunas numa tabela ou view, no entanto, não podem ser criados sobre colunas com objectos
do tipo LOB. Quando é necessário fazer uma query sobre este tipo de colunas pode usar-se a
2 http://technet.microsoft.com/en-us/library/cc917715.aspx
23
4. I NDEXAÇÃO E H ASHING 4.4. Criação de Índices
A criação de índices pode ser feita através do Explorer do SQL Server 2005, no entanto,
descrevemos como é feita a criação atravéz do comando T-SQL CREATE INDEX.
3 http://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/
4 http://www.linfo.org/wildcard.html
5 http://www.w3schools.com/xquery/
24
4. I NDEXAÇÃO E H ASHING 4.4. Criação de Índices
INCLUDE (column [ ,... n]) Especifica as colunas não chave que serão adi-
cionadas ao nível folha do índice non clustered.
Abaixo é apresentada a lista das opções mais relevantes para o comando CREATE INDEX.
OFF - As páginas de nível intermediário são preenchidas quase até ao máximo da sua ca-
pacidade.
SORT_IN_TEMPDB = ON | OFF
Especifica se os resultados da classificação temporários devem ser armazenados no tempdb.
Por omissão é OFF. Esta opção pode aumentar a velocidade de criação do índice mas necessita
de mais espaço de disco.
STATISTICS_NORECOMPUTE = ON | OFF
Especifica se as estatísticas de distribuição (usadas pelo optimizador da query) são recom-
putadas. Quando é selecionada a opção ON as estatisticas não são recalculadas automatica-
mente. O padrão é OFF.
DROP_EXISTING = ON | OFF
Especifica se o índice nomeado clustered ou non clustered pré-existente é descartado e re-
criado. Se for seleccionada a opção ON o índice existente é descartado e recriado. O nome de
índice especificado deve ser igual ao índice existente actualmente; no entanto, a definição de
índice pode ser modificada. Por exemplo, pode ser especificadas colunas, ordens de classifi-
cação, esquemas de partição ou opções de índice diferentes. O Padrão é OFF - será exibido um
erro caso o nome de índice especificado já exista.
ONLINE = ON | OFF
Especifica se as tabelas subjacentes e os índices associados estão disponíveis para consultas
e modificação de dados durante a operação de índice. O padrão é OFF.
O sistema Oracle disponibiliza um índice extra em relação ao Microsoft SQL Server 2005,
esse é o grande trunfo do Oracle quando comparados os dois sistemas, o tipo de índice denomina-
se Bitmap. Os Bitmaps são excelentes escolhas para colunas com pouca selectividade devido
ao menor custo de armazenamento. Adicionalmente o Oracle fornece árvores B+ de leitura
invertida que são bastante úteis e eficientes nas inserções sequenciais.
Concluímos que no que no contexto da indexação, o sistema Oracle fornece mais mecan-
ismos do que o Sql Server 2005, fornecendo inclusivamente uma alternativa à utilização de
árvores B+, o que aumenta o leque de possibilidades para melhorar a eficiência das consultas.
27
5
Processamento e Optimização de Queries
Uma base de dados relacional consiste em várias partes, no entanto o seu núcleo é constituído
por dois elementos essenciais, o motor de armazenamento e o processador de consultas. Neste
capítulo vamos perceber como funciona o segundo elemento referido.
No SQL Server 2005 o utilizador especifica o resultado que pretende obter e o processador
de consultas determina como o obter. O processamento de consultas divide-se em duas fases
principais, primeiro a optimização e posteriormente a execução. A optimização de queries é
o processo que o SQL Server 2005 faz atravéz da análise individual de cada query. O SQL
Server faz uma análise individual da query para determinar qual a melhor forma de a executar -
o objectivo é determinar o plano de execução da query que seja executado em menos tempo. O
optimizador faz uma análise da query baseada na informação sobre os objectos envolvidos (por
exemplo, número de páginas de uma tabela, tipos de índice defiunidos, estatísticas dos índices)
e gera um plano de execução.
É importante perceber o funcionamento do optimizador de queries para aplicar técnicas que
facilitam o trabalho deste componente do SQL Server.
• Os índices a ser utilizados. São escolhidos após estimação dos túplos e avaliação dos
custos dos índices disponíveis em relação a um full scan das tabelas ou a consulta num
índice clustered. O custo de um Índice clustered é tipicamente menor comparado com o
29
5. P ROCESSAMENTO E O PTIMIZAÇÃO DE Queries 5.1. Algoritmos para Junções
custo de um índice non clustered que por sua vez é menor de que o custo de um full table
scan.
• Que algoritmos são escolhidos para assegurar a melhor eficiência, baseada no custo das
operações derivado das estatísticas armazenadas.
O SQL Server 2005 faz a pesquisa de dados através de índices clustered, non clustered,
pesquisa total no índice e full table scan. Seguidamente apresentamos os algorítmos usados
para processar junções.
Nesta abordagem, existe uma divisão entre os dois operandos da operação de junção em
tabela interior e tabela exterior. Para cada linha da tabela interior, é percorrida a tabela exterior e
feita a comparação segundo as condições de junção definidas na query. As linhas que satisfaçam
as condições são seleccionadas.
Existem três tipos de nested loops:
• Index Nested-loop - Acesso aos dados através da técnica de bookmark lookup, utilizando
um índice.
30
5. P ROCESSAMENTO E O PTIMIZAÇÃO DE Queries 5.1. Algoritmos para Junções
5.1.2 Merge
O algoritmo merge join é mais eficiente que o nested loop join quando usado para volumes
de dados maiores.
Num merge join as duas tabelas são ordenadas. Para cada linha da tabela exterior, considera-
se o grupo contíguo de linhas na tabela interior, cujo atributo da relação de junção coincide.
Cada linha nas condições supracitadas, que respeite as condições da consulta, será adicionada
ao conjunto resultado. Esta técnica pode ter um custo elevado devido às operações de ordenação
necessária, no entanto, se os atributos de junção pertenceram à chave de um índice, ou se, por
natureza, os túplos de pelo menos uma das tabelas estiver ordenado pelo atributo de junção,
então o utilizador tende a escolhê-la. Se excluirmos as operações de ordenação a complexidade
do algoritmo é baixa.
31
5. P ROCESSAMENTO E O PTIMIZAÇÃO DE Queries 5.1. Algoritmos para Junções
5.1.3 Hash
O algoritmo mais complicado é o hash join. Este algorimto é uma boa opção quando quer-
emos usar volumes de dados maiores em que os inputs não estejam ordenados. Também é um
algoritmo útil quando não há indices sobre as tabelas para aumentar a performance do join.
Neste caso uma tabela de dispersão pode ser criada se o tamanho de uma tabela for significati-
vamente mais pequeno do que o da outra. O hash join é executado em duas fases - construção e
prova. Durante a construção são gerados dois inputs, o input de prova e o input de construção.
A cada linha, existente no input de construção, será aplicado um algoritmo de dispersão sobre
atributo a ser ligado.
A tabela mais pequena funcionará como input de construção, consequentemente a tabela
maior funcionará como input de prova. A tabela de dispersão será composta por listas ligadas
que serão chamadas por pacotes de dispersão. Durante a execução, o input de prova é percorrido
32
5. P ROCESSAMENTO E O PTIMIZAÇÃO DE Queries 5.1. Algoritmos para Junções
e por cada linha é computado o valor de dispersão com o objectivo de encontrar correspondên-
cias com algum dos pacotes de dispersão computados anteriormente.
corre no local onde está definida a tabela do lado direito da operação. Esta junção é seleccionada
quando a tabela do lado esquerdo da operação é de tamanho reduzido em comparação com a
outra.
Quando existe mais do que um índice sobre a mesma tabela podem ser usadas duas técnicas:
intersecção de índices e união de índices.
• Intersecção de Índices - consiste na escolha de um conjunto formado pela aquisição dos
subconjuntos de cada índice da forma mais eficiente.
• União de Índices - consiste na utilização de um índice em específico para cada coluna
especificada na cláusula WHERE que o utilize. Uma terceira forma de combinação de
vários índices consiste na fusão num só índice que seja cobertor de várias colunas.
No SQL Server 2005 quando uma sub consulta é indicada no processamento de uma con-
sulta, esta pode ser materializada para que o acesso cíclico às mesmas seja reduzido e feito de
forma mais eficiente.
• Fase 0 : O optimizador baseia-se num conjunto limitado de regras para geração de planos
de execução para consultas com pelo menos quatro tabelas. Nesta fase são considera-
dos apenas alguns algoritmos para processamento de junções e um número reduzido de
ordens das mesmas é tido em conta. Após esta fase, caso seja encontrado algum plano
de execução cujo custo seja inferior a um treshold previamente definido, a optimização
termina.
• Fase 1: São avaliadas mais algumas ordens de execução de junções e são aplicadas as
regras de geração de planos de execução. Caso seja encontrado algum plano de execução
cujo custo seja inferior a um treshold previamente definido ou for encontrado algum plano
com um custo inferior a qualquer dos planos encontrados na fase 0, a optimização termina.
• Fase 2: Caso o valor para o custo continue a ser superior ao treshold anteriormente
referido, a optimização continuará, aplicando desta vez métodos que poderão ser menos
eficientes em termos de complexidade temporal, como são exemplo a recombinação de
vários índices, materialização de índices e de views. Esta fase tem um limite máximo de
tempo de execução e devolve o melhor plano encontrado até então.
5.4 Paralelismo
O SQL Server fornece consultas paralelas para optimizar a execução de consultas e oper-
ações de índice para computadores que têm mais de um microprocessador (CPU). O SQL Server
pode executar uma consulta ou uma operação de índice em paralelo usando vários threads do
sistema operacional, a operação pode ser executada de forma rápida e eficiente. O resultado
desta divisão é conhecido por nivelação de paralelismo. Esta nivelação é processada cada vez
que a consulta é invocada. Os critérios escolhidos pelo optimizador quando determina o nível
de paralelismo são os seguintes:
• Número de processadores
• Número de utilizadores activos concorrentes
• Quantidade de memória disponível
• Tipo de consulta
• Avaliação da necessidade de utilização do paralelismo considerando o número de túplos
a processar
5.5 Estatisticas
Um histograma é um conjunto que contém até 200 valores de uma determinada coluna - pelo
menos uma amostra dos dados, estão ordenados. A sequência ordenada é dividida no máximo
em 199 intervalos, de forma a que a informação mais significantiva seja capturada. Normal-
mente estes intervalos não têm a mesma dimensão. Os seguintes valores, ou a informação
necessária para os obter, estão guardados em cada degrau do histograma.
No Microsoft SQL Server 2005, os histogramas apenas são construídos para a primeira
coluna do conjunto de chaves do objecto a ser estimado.
36
5. P ROCESSAMENTO E O PTIMIZAÇÃO DE Queries 5.6. Pistas em consultas
Existem três tipos de pistas que podem ser utilizadas no Microsoft SQL Server 2005, através
da utilização da cláusula OPTION:
• Join - Definidas para forçar o uso de algoritmos de junção.
• Query - Definidas para forçar o comportamento das cláusulas INSERT, SELECT, UP-
DATE e DELETE.
• Table - Definidas para forçar o comportamento das formas de consulta sobre a tabela.
Neste capitulo iremos descrever cada um deles.
• ROWLOCK - Indica que devem ser definifos LOCKS nas linhas em vez de serem definidos
na tabela ou ao nível das páginas.
• PAGLOCK - Indica que devem ser definidos LOCKS ao nível das páginas.
• READPAST - As linhas que estejam bloqueadas por um LOCK não são lidas.
• KEEPDEFAULTS - Indica a utilização dos valores por defeito de uma determinada coluna
quando os atributos encontram-se a null.
• LOOP JOIN ou HASH JOIN ou MERGE JOIN - Força o funcionamento descrito para as
pistas de Junção.
• FORCE ORDER - Indica que a ordem das tabelas deve ser mantida durante a optimização
da consulta.
• ROBUST PLAN - Força o optimizador de consulta a tentar criar um plano que trabalhe
com o tamanho máximo de típlos. Os túplos podem ser tão grandes que, às vezes, o
operador particular não consegue processá-las. Se isso ocorrer, o Mecanismo de Banco
de Dados produzirá um erro durante a execução da consulta.
• KEEP PLAN - Permite reduzir o número de vezes que o plano de execução de uma
consulta é recompilado.
40
6
Gestão de transacções e controlo de
concorrência
O modo como as transacções são geridas é fundamental para qualquer SGBD. As transacções
são a unidade básica de trabalho do Microsoft SQL Server, consistindo num conjunto de oper-
ações (sobre a base de dados) que deverão ser completadas como um todo ou, no caso de falha,
deverão ser abortadas e rolled back, de modo a que nenhuma se realize.
De modo a garantir a integridade dos dados, o SQL Server garante que as suas transacções
satisfazem quatro características conhecidas como propriedades ACID:
• Consistência. Após o término de uma transacção (admitindo que não existem outras
transacções a ser executadas concorrentemente), todos os dados e estruturas internas de-
verão ficar num estado consistente e reflectir, correctamente, a transacção que acabou de
ser executada, quer esta tenha sido realizada com sucesso ou falhado, partindo do pressu-
posto que a base de dados já se encontrava num estado consistente aquando da ocorrência
da transacção. O SQL Server garante esta propriedade, permitindo, ainda, vários níveis
de consistência.
• Consistência. Após o término de uma transacção (admitindo que não existem outras
41
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.1. Tipos de transacções
6.1.1 Autocommit
No modo autocommit, o modo por omissão do SQL Server, cada comando T-SQL (select,
insert, update, etc.) é, automaticamente, committed quando termina ou rolled back quando
falha, ou seja, cada comando é visto como uma transacção completa. Eis um exemplo:
– início da transacção (implícito)
UPDATE contas
SET saldo = saldo + 200
WHERE iban = "PT50000201231234567890154"
– fim da transacção (rollback ou commit - implícito)
Se ocorrer algum erro durante a execução deste comando, este é rolled back, caso contrário, a
acção é completada, sendo gravados os seus efeitos.
Nested Transactions
O SQL Server permite que transacções (denominadas "interiores") ocorram dentro de out-
ras transacções (denominadas "exteriores"), chamando-se estas transacções nested transactions
(transacções aninhadas). Isto ocorre quando, por exemplo, um procedimento inicia uma transacção
na qual é chamado outro procedimento que também inicia uma transacção.
Pode-se determinar se ainda existem transacções a decorrer e quão aninhada uma transacção
se encontra, consultando a variável built-in @@TRANCOUNT. Quando não existem transacções
activas no sistema, @@TRANCOUNT possui o valor 0. Cada comando BEGIN TRANSAC-
TION incrementa o valor da variável em 1 e cada COMMIT diminui o seu valor nessa mesma
quantidade. Se @@TRANCOUNT tiver valor 1 quando um comando COMMIT é encontrado,
então é feito commit à transacção. No entanto, se o seu valor for superior a 1, @@TRAN-
COUNT é, apenas, subtraído de uma unidade (é assumida a existência de uma transacção exte-
rior).
Assim, quando se faz commit das transacções interiores, o SQL Server, na realidade, não
efectua quaisquer alterações até que a transacção exterior seja committed; apenas é subtraída
uma unidade ao valor de @@TRANCOUNT. Por esta razão, é imperativo que cada transacção
interior faça COMMIT, de modo a que @@TRANCOUNT seja devidamente actualizado e o
seu valor seja 1 quando a transacção exterior fizer COMMIT.
Se a transacção exterior ou uma das interiores falharem, então nenhuma transacção será
committed, ocorrendo o roll back de todas elas. Só é feito o commit de todas as transacções, se
43
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.1. Tipos de transacções
Savepoints
Os savepoints permitem que se faça o roll back de apenas uma parte das transacções. Todas
as modificações até esse savepoint são mantidas, mas os comandos seguintes, até ao ROLL-
BACK, são rolled back.
A sintaxe, para especificar um savepoint, é a seguinte:
SAVE TRAN[SACTION] savepoint_name
Para se fazer o roll back para o savepoint, usa-se o commando ROLLBACK TRANSACTION
com o nome do savepoint:
ROLLBACK TRAN[SACTION] savepoint_name
Os savepoints são úteis em situações em que é pouco provável que ocorram erros. Exemplo:
BEGIN TRANSACTION
UPDATE contas
SAVE TRANSACTION inicio_apagar_clientes
DELETE clients
IF @@error = -1
ROLLBACK TRANSACTION inicio_apagar_clientes
44
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.1. Tipos de transacções
COMMIT TRANSACTION
Assumindo que o erro é infrequente, pode ser mais eficiente fazer o roll back para o savepoint
do que testar a validade do DELETE (se este custo for muito elevado).
6.1.4 Batch-scoped
No modo de transacções batch-scoped, as queries, executadas via MARS (ver a seguir),
são executadas num ambiente dedicado. Apenas quando a execução de todos os trabalhos é
terminada, é que as alterações ocorridas no ambiente dedicado são copiadas para o ambiente
usual da base de dados.
6.2 Locks
Os protocolos usados pelo SQL Server para garantir o isolamento das transacções são basea-
dos em locks. Estes objectos permitem que múltiplos utilizadores acedam, simultaneamente e
de modo sincronizado, a um mesmo conjunto de dados.
A gestão dos locks é feita internamente pelo gestor de locks do SQL Server. Estes são
adquiridos e libertados, de acordo com as acções dos utilizadores, sem que seja necessário
programá-los explicitamente (embora seja possível "influenciar" o gestor de locks). A view
sys.dm_tran_locks contém o registo de todos os locks existente no sistema, bem como outras
informações pertinentes (recurso sobre o qual o lock está aplicado, modo do lock, etc.).
Nesta secção examinaremos algumas propriedades do sistema de locking disponibilizado
por este SGBD.
À medida que o nível de granularidade do lock se vai tornando mais grosseiro, a concorrên-
cia aos dados na base de dados diminui. Fazer lock a uma tabela completa impede o seu acesso
46
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.2. Locks
por parte de outros utilizadores, embora diminua o overhead criado pela gestão de locks, uma
vez que o número de locks em uso diminui. Em contrapartida, com um nível de granularidade
fino - tal como row level - a concorrência aumenta, com outros utilizadores a terem permissão
de acesso a diferentes tuplos, na mesma tabela, ao mesmo tempo. Mas, neste caso, também
aumenta o overhead relacionado com a gestão de locks. É, no entanto, responsabilidade do
SQL Server determinar, automaticamente, qual o nível de granularidade apropriado para cada
tarefa (embora se possa indicar, explicitamente, qual o lock que se prefere usar, através do uso
de hints).
Shared
Este modo é adquirido automaticamente, quando se procede à leitura de dados (e.g. co-
mando SELECT). Shared locks permitem a consulta do mesmo recurso, por várias transacções
concorrentes, mas não permitem que este seja alterado. Normalmente, neste modo, os locks são
libertados assim que os dados acabam de ser lidos, a não ser que o nível de isolamento ou hints
alterem este comportamento.
Exclusive
Exclusive locks são usados em operações onde há alterações de dados, devido à utilização
dos comandos INSERT, DELETE ou UPDATE. Quando um exclusive lock é aplicado a um re-
curso, nenhuma outra transacção pode lê-lo ou modificá-lo (na verdade é possível ler o recurso,
sem bloquear o exclusive lock, usando hints ou níveis de isolação).
Update
Este modo é usado quando o SQL Server executa uma operação de modificação de dados
mas, primeiro, necessita de pesquisar a tabela para encontrar os recursos que irão ser modifica-
dos. Se a transacção realmente fizer uma alteração (devido ao facto de terem sido encontrados
tuplos que satisfazem a condição de pesquisa, por exemplo) o lock passa para o modo exclu-
sive; caso contrário, passa para o modo shared. Este modo é importante para evitar deadlocks
(situação abordada mais à frente).
Intent
Intent locks são usados para qualificar os 3 modos já apresentados. Ou seja, pode-se ter
intent shared locks, intent exclusive locks e intent update locks (a lista completa encontra-se
47
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.2. Locks
em baixo). O objectivo do intent lock é proteger os locks de granularidade mais fina, tais
como row e page level, de locks exclusive de granularidade mais grosseira, de modo a que não
sejam bloqueados de vir a ser utilizados por outras transacções. Por exemplo, um intent lock de
granularidade table level adquirido por uma transacção, indica ao SQL Server a intenção dessa
transacção em adquirir um recurso dessa mesma tabela (e.g. uma página ou tuplo da mesma). Se
este intent lock for adquirido antes de outros locks de menor granularidade, prevenir-se-á uma
segunda transacção de adquirir um exclusive lock nessa tabela, o que poderia, potencialmente,
bloquear a primeira transacção.
Existem seis categorias de intent locks:
• Shared com intent exclusive. Indicam a intenção da transacção em ler todos os recursos
hierarquicamente inferiores e em modificar alguns desses recursos, usando intent exclu-
sive locks nesses recursos individuais.
• Intent update. Indica a intenção da transacção em colocar update locks nos recursos
hierarquicamente inferiores.
Schema
• Schema stability. Neste modo, o lock é bloqueado se uma query que vá usar a mesma
tabela ainda se encontre a ser compilada. (os outros locks não ficam bloqueados perante
esta situação).
• Schema modification. Neste modo, o lock é bloqueado se a transacção for usar uma
tabela cuja estrutura se encontre a ser alterada.
48
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.2. Locks
Bulk Update
Este modo permite que múltiplas threads façam bulk copies de dados, concorrentemente,
para a mesma tabela, impedindo outros processos que não estejam a realizar bulk copies de
aceder à tabela. Para entrar neste modo é necessário que a hint TABLOCK seja activada ou,
opcionalmente, que se active este modo usando o procedimento sp_tableoption.
Key-Range
• READ UNCOMMITTED. Nível mais fraco de isolamento. Uma transacção pode ler as
modificações feitas por outras transacções, mesmo antes de estas serem committed, pelo
que é possível ocorrerem dirty reads (corresponde às hints NOLOCK e READUNCOM-
MITTED).
• READ COMMITTED. Nível por omissão do SQL Server. Alterações feitas no interior
de uma transacção usam exclusive locks, não podendo as modificações ser vistas por
outros processos, até que a transacção termine. As leituras são feitas com shared locks
mas, após o término da leitura, não há garantia que os recursos lidos sejam alterados por
outros processos, pelo que podem ocorrer non-repeatable reads e phantom reads.
• REPEATABLE READ. Neste nível, à medida que os dados vão sendo lidos, locks vão
sendo colocados (e mantidos) nos dados, durante toda a transacção. Assim, previne-
se que outras transacções modifiquem os dados, não ocorrendo non-repeatable reads. No
entanto, não se previne a adição de novos tuplos or "tuplos fantasmas", pois o lock apenas
está aplicado sobre dados existentes.
• SNAPSHOT. Isolamento Snapshot especifica que os dados lidos por um comando dev-
erão apenas ver modificações que já tenham sido committed antes do início da transacção,
ou seja, os comandos SQL "vêem" snapshots dos dados committed, tal como existiam no
início da transacção. A opção ALLOW_SNAPSHOT_ISOLATION deverá estar a ON.
Locking hints são keywords que podem ser usadas com os comandos SELECT, INSERT,
UPDATE e DELETE, de modo a direccionarem o SQL a usar um tipo de locks preferido, numa
determinada tabela (ou view), podendo se sobrepor a um nível de isolamento.
Os locking hints que existem no SQL Server 2005 são: HOLDLOCK, NOLOCK, PA-
GLOCK, READCOMMITTED, READCOMMITTEDLOCK, READPAST, READUNCOM-
MITTED, REPEATABLEREAD, ROWLOCK, SERIALIZABLE, TABLOCK, TABLOCKX,
UPDLOCK e XLOCK.
6.2.5 Deadlocks
Sem intervenção, dois processos envolvidos num deadlock ficariam, indefinidamente, à es-
pera um do outro. No entanto, o SQL Server detecta, automaticamente, situações de deadlock
e resolve-as terminando o processo que considera menos dispendioso de fazer roll back, esti-
mando a partir da quantidade de trabalho que já foi realizado pelo processo (este também recebe
um erro 1205 que pode ser tratado pelo processo).
Por defeito, o gestor de locks, de 5 em 5 segundos procura por situações plausíveis de
ser deadlocks, variando este intervalo consoante a frequência com que deadlocks aparecem.
Como o número de deadlocks, em geral, é pequeno, este sistema diminui a carga do sistema, na
detecção de deadlocks.
O utilizador também pode definir qual o processo a ser terminado, definindo os valores
LOW, NORMAL (por omissão) ou HIGH para a opção DEADLOCK_PRIORITY.
Tal como já foi referido, os metadados referentes às transacções são guardados no transac-
tion log. No entanto, se uma transacção for de muito longa duração, poderá "entupir" o log, o
que coloca a recuperabilidade da base de dados em risco. Uma solução passa por fazer backup
do log e truncar a parte da qual já se fez o backup.
O SQL Server disponibiliza um comando que permite consultar e obter informação sobre a
50
6. G ESTÃO DE TRANSACÇÕES E CONTROLO DE CONCORRÊNCIA 6.3. Transacções de longa duração
transacção activa mais antiga no sistema: DBCC OPENTRAN. Este comando devolve o identi-
ficador do processo que iniciou a transacção, o identificador do utilizador, o nome da transacção,
entre outras informações.
Deste modo é possível identificar qual a transacção que, potencialmente, poderá causar
problemas no futuro e terminá-la, caso seja necessário.
51
7
Suporte para bases de dados distribuídas
O SQL Server tem um grande suporte para base de dados distribuídas homogéneas, disponibi-
lizando funcionalidades como replicação, mirroring, log shipping, transacções distribuídas e até
suporte para replicação heterogénea com sistemas de base de dados como o Microsoft Access,
Oracle e IBM.
7.1 Replicação
53
7. S UPORTE PARA BASES DE DADOS DISTRIBUÍDAS 7.1. Replicação
7.1.1 Funcionamento
O SQL Server utiliza um modelo de "Produtor - Distribuidor - Consumidor" para efectuar
as replicações 7.1. Para tal existem três tipos de servidores, o Publisher, que terá o papel de
produtor, o Subscriber, o consumidor, e o Distributor, que poderá ser o mesmo servidor que o
Publisher, e tem como funcionalidade guardar o histórico e metadata das replicações.
Antes de se criar as ligações para a replicação é necessário definir no Publisher articles
e posteriormente agrupa-los em publications. Articles são dados que podem ir desde tabelas
inteiras, determinadas colunas ou tuplos, views, procedimentos ou até funções definidas pelo
utilizador. Como foi indicado anteriormente, estes articles vão ser agrupados em publications,
sendo estas o que será, posteriormente, partilhado pelo Distributor.
O Subscriber depois necessita de criar subscriptions, que irão manter informação sobre que
publications irá replicar informação, onde irá receber e quando. O pedido de sincronização
entre os dois servidores pode ser feito pelo Subscriber, push subscrition, pelo Publisher, pull
subscrition, ou pode ainda suportar as duas.
7.1.2 Tipos
Existem três tipos de replicação no SQL Server:
• Merge: As alterações que vão ocorrendo são guardadas pelo próprio servidor e quando o
Subscriber conecta-se ao Publisher essas alterações são partilhadas e aplicadas em ambos
os servidores. Neste caso os servidores conseguem trabalhar de forma autónoma e pode
ficar offline. Recomendado para ambientes Servidor-Cliente.
• Snapshot: Neste tipo de replicação os servidores não registam as alterações realizadas
entre as sincronizações. Quando há uma sincronização o Publisher cria um snapshot de
todas as publications subscritas e envia-o para o Subscriber.
• Transactional: Neste caso o SQL Server, no Publisher, monitoriza as todas as alter-
ações relevantes para os Subscribers e propaga-as quando ocorrem, quase em tempo
real. O normal nesse tipo de replicação é que as alterações realizadas no Subscriber
são tratadas como read-only para o Publisher, no entanto há opções que deixam alterar
essa propriedade. Recomendado para ambientes Servidor-Servidor.
Em todos os tipos é enviado um snapshot global do Publisher para os Subscribers quando é
realizada a primeira sincronização.
7.1.3 Agentes
Para que o processo de replicação se possa realizar( 7.1), o SQL Server dispões de pequenos
programa, denominados agentes, que realizam tarefas como guardar o histórico das replicações
e copiar os dados entre os Publishers e os Subscribers. Os mais importantes são o Snapshot
Agent, Log Reader Agent, Distribution Agent, Merge Agent e o Queue Reader Agent.
54
7. S UPORTE PARA BASES DE DADOS DISTRIBUÍDAS 7.2. Mirroring
7.2 Mirroring
Mirroring é uma solução que o SQL Server disponibiliza que tem como intuito garantir
aa disponibilidade de uma base de dados. Para tal, por cada base de dados, irão existir dois
servidores (7.2). Um deles irá funcionar como principal, prestando serviços aos clientes, e o
outro será uma cópia de segurança da base de dados.
Quando o servidor principal falha, as aplicações dos clientes conseguem recuperar rapida-
mente, necessitando apenas de conectar se ao outro servidor.
Existem dois tipos de estado para o servidor secundário:
• "hot standby server": quando o servidor está sincronizado, onde não ocorrem perca de
dados caso o servidor principal falhar.
• "warm standby server": quando este não se encontra sincronizado e poderá levar a
perca de dados.
55
7. S UPORTE PARA BASES DE DADOS DISTRIBUÍDAS 7.4. Transacções Distribuídas
Nesta solução, também com o intuito de manter uma alta disponibilidade do sistema, o
servidor principal irá realizar automaticamente cópias de segurança dos registos de transacções
da sua base de dados. Estas cópias de segurança irão ser posteriormente copiadas para outros
servidores e aplicadas nas bases de dados secundárias. Opcionalmente poderá existir um ter-
ceiro tipo de servidor, o monitor, que mantém o estado e histórico de todos os servidores e se
houver alguma falha lançam um alerta (7.3)).
Ao contrário da solução anterior, nesta as aplicações, no caso de falha do servidor, não
tentam conectar-se automaticamente a um servidor secundário. Para que o sistema volte a
funcionar os servidores secundários tem de ser disponibilizados online manualmente.
O SQL Sever também permite a realização de transacções distribuídas. Para que estas
transacções possam ocorrer é necessário que o gestor de transacções de cada servidor tenha
suporte para o Microsoft Distributed Transaction Coordinator ou Open Group XA. Para garan-
tir a atomicidade das transacções é utilizado o protocolo 2-phase commit.
Como já referido, o SQL Server permite replicação de base de dados heterogénea, no entanto
replicação por merge não é possível. O sistema de base de dados com maior suporte é o Oracle,
neste é possível definir Publishers e Subscribers.
56
7. S UPORTE PARA BASES DE DADOS DISTRIBUÍDAS 7.6. Federação
7.6 Federação
O SQL Server permite estabelecer base de dados federadas. Este tipo de base de dados
consiste na fragmentação dos dados, neste caso por particionamento vertical, e dispersá-los por
diversos servidores. Todo esse processo é transparente para os clientes.
Esta acção ira levar a uma redução carga de processamento por servidor e a aumento de
rendimento do sistema em geral.
57
8
Outras características do sistema estudado
O Microsoft SQL Server 2005 tem suporte nativo para XML, é nos fornecido o tipo de dados
XML e com este podemos guardar documentos XML, ou só partes deste. Durante a realização
da query SELECT podemos indicar se desejamos que o resultado esteja no formato XML e
ainda há suporte para um conjunto de funções da XQuery, usadas para realizar queries sobre
dados XML. Também disponibilizam Native XML Web Services utilizando tecnologias como
http, SOAP e Web Services Definition Language. Através de mensagens SOAP enviadas via
HTTP podemos pedir que um servidor de SQL Server corra um script T-SQL ou mesmo correr
procedimentos.
59
Bibliography
[2] Kalen Delaney. Inside Microsoft SQL Server 2005: The Storage Engine. Microsoft Pres,
2006.
[3] Kalen Delaney. Inside Microsoft SQL Server 2005: Query Tuning and Optimization.
Microsoft Pres, 2007.
[4] Ken England and Gavinl Powell. Microsoft SQL Server 2005 Performance Optimization
and Tuning Handbook. Digital, 2007.
[5] Darril Gibson. MCITP SQL Server 2005 Database Developer All-in-One Exam Guide
(Exams 70-431, 70-441 & 70-442). McGraw-Hill, Inc., New York, NY, USA, 2008.
[6] David Gornshtein and Boris Tamarkin. Features, strengths and weaknesses comparison
between MS SQL 2005 (Yukon) and Oracle 10g databases. WisdomForce Technologies,
Inc, 2004. http://www.wisdomforce.com.
[7] Ross Mistry, Chris Amaris, and Alec Minty. Microsoft®sql server 2005 management and
administration. Sams, Indianapolis, IN, USA, 2007.
[8] Ray Rankins, Paul Bertucci, Chris Gallelli, and Alex T. Silverstein. Microsoft(R) SQL
Server 2005 Unleashed. Sams, Indianapolis, IN, USA, 2006.
[9] Jeffrey R. Shapiro. Microsoft SQL Server 2005: The Complete Reference. McGraw-
Hill,Osborne, 2007.
[10] Edward Whalen, Marcilina Garcia, Burzin Patel, Stacia Misner, and Victor Isakov. Mi-
crosoft SQL Server 2005 administrator’s companion. Microsoft Press, Redmond, WA,
USA, 2006.
61