Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

Prévia do material em texto

Prática 1 
 
1- Criando o Projeto Físico a partir do Projeto Lógico (Modelo Lógico) 
 
1.1 Objetivo 
 
Ao final desta prática o aluno deverá ser capaz de: 
 
• A partir de um modelo lógico fazer a implementação do Projeto Físico; 
• Criar e manipular o banco de dados de acordo com o DER.(uso de comandos da 
DDL e DML). 
 
1.2 Exercícios 
 
 1.2.1 Exercício 1: Criar um novo Banco de Dados 
 1º. Passo: Crie um novo banco de dados com o nome de “biblioteca”, de acordo com o 
modelo lógico da [Figura 1], use os comandos SQL. 
País
Usuário
Exemplar
Editora
Autor
ObraTem
Autoria
é
Pertence
Possui
Tipo Usuário
Empréstimo
N
1
N
N
1
N
N 1
N
1
N
N
@CodUsu
NomUsu
SexoUsu
TipUsu
@TipUsu
DesTipUsu
CodObr
NumExe
CodUsu
DatIni
DatFim
DatDev
@
@CodEdi
NomEdi
CodObr
NumExe
CodEdi
ValorExe
@
CodObr
CodAut
@CodObr
NomObr
@
@CodPai
NomPai
@CodAut
NomAut
CodPai
 
Figura 1: Projeto Lógico – Modelo Lógico DER 
 2º. Passo: Crie as tabelas de acordo com os tipos definidos a seguir: 
Tabela: Usuario 
Nome do Atributo Tipo Restrição 
CodUsu Smallint NOT NULL 
Nom Usu Char(80) NOT NULL 
SexoUsu Char(01) NOT NULL 
TipUsu Smallint NOT NULL 
 
Tabela: TipoUsuario 
 2 
Nome do Atributo Tipo Restrição 
TipUsu Smallint NOT NULL 
DesTipUsu Char(20) NOT NULL 
 
Tabela: Pais 
Nome do Atributo Tipo Restrição 
CodPais Smallint NOT NULL 
NomPais Char(30) NOT NULL 
 
Tabela: Autoria 
Nome do Atributo Tipo Restrição 
CodObr Smallint NOT NULL 
CodAut Smallint NOT NULL 
 
Tabela: Autor 
Nome do Atributo Tipo Restrição 
CodAut Smallint NOT NULL 
NomAut Char(80) NOT NULL 
CodPai Smallint NOT NULL 
 
Tabela: Obra 
Nome do Atributo Tipo Restrição 
CodObr Smallint NOT NULL 
NomObr Char(80) NOT NULL 
 
Tabela: Exemplar 
Nome do Atributo Tipo Restrição 
CodObr Smallint NOT NULL 
NumExe Smallint NOT NULL 
CodEdi Smallint NOT NULL 
ValorExe Float NOTNULL 
 
Tabela: Empréstimo 
Nome do Atributo Tipo Restrição 
CodObr Smallint NOT NULL 
NumExe Smallint NOT NULL 
CodUsu Smallint NOT NULL 
DatIni Date NOT NULL 
DatFim Date NOT NULL 
DatDev Date NULL 
 
Tabela: Editora 
Nome do Atributo Tipo Restrição 
CodEdi Smallint NOT NULL 
NomEdi Char(50) NOT NULL 
 
 3 
1.2.2 Exercício 2: Inserir dados no banco de dados 
1º. Passo: Incluir os dados de acordo com as tabelas a seguir: 
 
Tabela: Autor 
CodAut NomAut CodPai 
1 Ramez Elmasri 1 
2 Shamkant B. Navathe 1 
3 Henry F. Kort 2 
4 Abraham Silberchatz 3 
5 Valduriez Patrick 3 
6 Nívio Ziviani 4 
7 Marcos Viana Villas 5 
 
Tabela: Obra 
CodObr NomObr 
1 Sistemas de Banco de Dados Fundamentos e Aplicações 
2 Sistemas de Banco de Dados 
3 Princípios de Sistemas de Banco de Dados Distribuído 
4 Projeto de Algoritmos com Implementação em C e Pascal 
5 Estrutura de Dados 
 
Tabela: Autoria Tabela: Pais 
CodObr CodAut CodPai NomPai 
1 1 1 Canadá 
1 2 2 Portugal 
2 3 3 França 
3 4 4 Brasil 
3 5 5 Argentina 
4 6 
5 7 
 
Tabela: Editora Tabela: TipoUsuario 
CodEdi NomEdi TipUsu DesTipUsu 
1 LTC 1 Aluno 
2 Campus 2 Professor 
3 FTD 3 Funcionário 
4 Atlas 
5 Bookman 
 
Tabela: Exemplar 
CodObr NumExe CodEdi ValorExe 
1 1 1 99,00 
2 1 2 100,00 
3 1 3 50,00 
4 1 4 45,00 
4 2 4 50,00 
5 1 5 110,00 
5 2 5 110,00 
5 3 5 120,00 
 
Tabela: Usuário 
CodUsu NomUsu SexoUsu TipUsu 
 4 
1 Viviane Cristina Dias F 2 
2 André da Silva M 1 
3 Marcelo Andrade M 1 
4 Márcia Duarte F 1 
5 Joaquim Reis M 1 
6 Ana Maria Silva F 1 
7 Ana Luiza da Silva F 1 
8 Analuiza da Silva F 1 
9 Maria Ana dos Santos F 1 
10 Ana Marta Souza F 2 
11 Márcia Ana F 2 
12 Carla Rodrigues F 1 
13 Francisco Diniz M 2 
 
Tabela: Empréstimo 
CodObr NumExe CodUsu DatIni DatFim DatDev 
1 1 1 10/01/2003 20/01/2003 19/01/2003 
1 1 1 10/02/2003 20/02/2003 15/02/2003 
2 1 1 12/01/2003 23/01/2003 NULL 
3 1 2 08/01/2003 15/01/2003 16/01/2003 
3 1 3 16/01/2003 20/01/2003 22/01/2003 
3 1 4 23/01/2003 28/01/2003 25/01/2003 
3 1 4 28/01/2003 05/02/2003 NULL 
4 1 5 12/01/2003 19/01/2003 20/01/2003 
4 1 6 20/01/2003 28/01/2003 27/01/2003 
4 2 7 20/01/2003 28/01/2003 28/01/2003 
 
 5 
Prática 2 
 
2- Processamento de Consultas 
 
2.1 Objetivo 
 
Ao final desta prática o aluno deverá ser capaz de: 
• Compreender o processo de processamento de consultas; 
• Verificar o Tuning (Utilizar o Plano de Execução das Queries - Execution Plan); 
• Verificar as estatísticas 
 
2.2 Desenvolvimento 
O SQL Sever possui uma ferramenta para análise de performance: Plano de Execução Gráfico de 
Queries (Execution Plan). O Execution Plan corresponde a uma seqüência de etapas empregadas 
pelo SQL Server no processo de execução de queries. Se a query foi executada recentemente, o 
plano estará presente no cache do banco e será reutilizado; caso contrário será gerado um novo 
plano para a query em questão. 
 
No plano de execução gráfico, cada etapa do processamento da query é representada por um objeto 
diferente. O roteiro da execução é determinado por um conjunto de setas que ligam esses objetos; 
assim pode-se facilmente percorrer por todas as etapas. O componente do SQL Server responsável 
pela construção do plano é chamado de otimizador; e é ele quem decide que índices serão 
utilizados, o modelo interno de join, se serão criadas tabelas temporárias para processar o join, entre 
outras decisões (como vimos na aula teórica). 
 
Entendendo o Execution Plan 
A leitura do Execution Plan deve ser feita da direita para a esquerda, e de cima para baixo. Cada 
objeto sinaliza uma operação distinta, e existem setas indicando o caminho. 
 
 
Figura 2: Execution Plan 
 
Tabela 1: Tabela de Símbolos 
Símbolo Descrição 
 
indica que está sendo efetuada uma varredura sequencial na tabela Orders (=Clustered 
Index Scan) , tendo por base o índice cluster PK_Orders. 
 
indica que após o processo de varredura sequencial na tabela Orders , o resultado da 
seleção será apresentado ao cliente. 
 
representa um processo de Index Seek, e indica que a busca do empregado para 
employeeId=9 foi uma busca pontual, realizada com o auxílio de um índice não-cluster. 
 
Esse processo de busca da página de dados à partir de ponteiros localizados na estrutura 
do índice é conhecido por bookmark lookup. 
 6 
De acordo com a consulta efetuada na Tabela Orders [Figura 3], : 
 
Figura 3: Avaliação de execução de outra consulta 
 
Outras Análises 
Através do Execution Plan verifica-se que a consulta teve um alto custo para a execução da Query 
(Cost 100%) [Figura 4], ou seja, muito processamento para a busca da informação, isto pode estar 
acontecendo devido a uma falta de índices ou estatísticas desatualizadas. 
 
Figura 4: Informações do Plano de Execução 
O Medidor - Estimated Row Count: 999, 
• significa que o SQL Esperava desta tabela o retorno 999 registros. Essas informações 
são de armazenadas pelas estatísticas. 
O Medidor – Row Count: 2.499 
• porém na realidade está retornando muito mais registros do que o esperado. 
 
Neste caso, precisamos atualizar as estatísticas, que podem estar sofrendo interferências de algumas 
operações como: 
• Muitas alterações em índices; 
• Adição e remoção de muitos registros; 
 
2.3 Exercícios 
 
2.3.1 Exercício 1: Verificando o Plano de execução da Consulta 
1º. Passo: Inserir as Editoras: ‘Pearson’ e ‘Saraiva’. 
 
2º. Passo: Selecionar o código e o nome da editora que ainda não possui um exemplar cadastrado. 
Utilize o operador IN. 
 
3º. Passo: Verifique o plano de execução da Consulta. 
 
 7 
4º. Passo: Selecionar o código e o nome da editora que ainda não possui um exemplar cadastrado. 
Utilize o operador EXISTIS. 
 
Responda: 
a) Em termos de otimização de consultas aconteceu alguma 
diferença? 
 
4º. Passo: Certifique que as estatísticas estão atualizadas: Atualize a tabela Editora 
Sintaxe: UPDATE Statistics | [With FullScan] 
 
 
2.3.2 Exercício2: Verificando as Estatísticas 
1º. Passo: Mude o modo de exibição para Texto. Menu Query → Results in Text 
2º. Passo : Comando para “Ligar” as estatísticas. 
Sintaxe: Set Statistics IO ON 
 
Execute as consultas verificando os resultados em estatísticas: 
• Logical Reads: Informa o números de páginas lidas em memória. 
• Physical Reads: Número de páginas lidas em disco. Se as páginas requeridas por um 
comando não estão em memória, devem ser lidas do disco para a memória. 
• Read Ahead Reads: páginas lidas por antecipação. O SQL lê páginas adicionais para 
efeito de otimização, mantendo-as em cachê para agilizar sua utilização por outras 
queries. 
• Scan Count : Número de vezes que a tabela foi acionada. Dependendo da maneira como 
escrevemos a query, o mesmo pelo modelo do join, uma mesma tabela pode ser acessada 
repetidas vezes. 
 
2.3.3 Exercício 3: Verificando o plano de Consulta para as Consultas: 
 
a) Selecionar o nome dos usuários que já fizeram empréstimo da Obra “Sistemas de Banco de 
Dados”. Faça 2 consultas, a primeira passando por todas as tabelas, e a segunda excluindo a 
tabela exemplar. 
 
b) Altere a consulta anterior utilizando o distinct. 
 
c) Selecionar a quantidade de empréstimo feita por cada usuário. 
 
d) Selecionar o nome dos usuários que fizeram mais de um empréstimo na biblioteca 
 8 
Prática 3 
 
3- Consultas 
 
3.1 -Objetivo 
 
Ao final desta prática o aluno deverá ser capaz de: 
 
• Usar os operadorares: UNION, UNION ALL, INTERSECT, EXCEPT; 
• Criar uma VIEW a partir de uma tabela; 
• Criar uma VIEW a partir de múltiplas tabelas; 
• Criar uma VIEW a partir de uma VIEW; 
 
3.2 -Desenvolvimento 
 
Operador UNION ALL 
O operador UNION ALL é usado para combinar os resultados de duas instruções SELECT que 
incluem linhas duplicadas as mesmas regras que se aplicam a UNION se aplicam a UNION ALL. Os 
operadores UNION e UNION ALL são praticamente iguais, só que um retorna linhas de dados 
duplicados e outro não. 
Sintaxe: 
SELECT Coluna1[,Coluna2] 
FROM Tabela1[,Tabela2] 
[WHERE] 
UNION ALL 
SELECT Coluna1[,Coluna2] 
FROM Tabela1,[Tabela2] 
[WHERE] 
 
 
Operador INTERSECT (Alguns SGBDs não têm suporte a esse operador) 
O operador INTERSECT é usado para combinar duas instruções SELECT, mas retorna somente as 
linhas da primeira instrução SELECT que sejam idênticas a uma linha da segunda instrução 
SELECT. Exatamente como ocorre com o operador UNION, as mesmas regras se aplicam quando se 
usa o operador INTERSECT. 
Sintaxe: 
SELECT Coluna1[,Coluna2] 
FROM Tabela1[,Tabela2] 
[WHERE] 
INTERSECT 
SELECT Coluna1[,Coluna2] 
FROM Tabela1,[Tabela2] 
[WHERE] 
 
Operador EXCEPT (Interbase não tem suporte a esse operador) 
O operador EXCEPT combina duas instruções SELECT e retorna linhas da primeira instrução 
SELECT que não são retornadas pela segunda instrução SELECT. Novamente, as mesmas regras 
que se aplicam ao operador UNION se aplicam ao operador EXCEPT. 
Sintaxe: 
SELECT Coluna1[,Coluna2] 
FROM Tabela1[,Tabela2] 
[WHERE] 
EXCEPT 
 9 
SELECT Coluna1[,Coluna2] 
FROM Tabela1,[Tabela2] 
[WHERE] 
 
VIEW(Visões) 
Do ponto de vista do negócio, visões são elementos estratégicos que normalmente limitam o poder 
de acesso a informações. Do lado técnico, uma visão é uma tabela virtual: uma tabela resultante de 
uma consulta efetuada sobre uma ou mais tabelas. Em outras palavras parece uma tabela e age 
como uma tabela no que diz respeito ao usuário. 
 
Uma VIEW(Visão) na verdade é uma composição de uma tabela na forma de uma consulta 
predefinida. 
 
As VIEWs (Visões) suprem várias funções. Podem por exemplo, substituir consultas longas e 
complexas por algo mais fácil de ser entendido e manipulado. Visões também são elementos de 
segurança, a partir do momento que conseguem limitar o acesso dos usuários a determinados grupos 
de informações armazenadas em um banco de dados. 
 
Uma Visão não replica dados, ou seja, não gera uma cópia dos dados armazenados em outras 
tabelas. Quando os dados das tabelas são atualizados, as visões automaticamente refletem essas 
mudanças. 
 
WITH CHECK OPTION 
WITH CHECK OPTION é uma opção da instrução CREATE VIEW. O objetivo de WITH CHECK 
OPTION é assegurar que todos os Updats e Inserts satisfaçam às condições na definição da visão. 
Se eles não satisfizerem às condições, o Update ou Insert retornará um erro. 
 
Exercícios 
 
1) Selecionar o nome dos usuários que leram obras do autor Navathe. Faça a consulta usando join 
utilizando todas as tabelas. Verifique o plano de execução da consulta. 
 
2) Altere a consulta 1) resolva por subconsulta – utilize IN 
Responda: 
a) Em termos de Processamento da Consulta aconteceu alguma 
diferença? 
 
3) Altere a consulta 2) resolva por subconsulta – utilize EXISTS 
Responda: 
a) Em termos de Processamento da Consulta aconteceu alguma 
diferença? 
 
4) Selecionar o nome dos usuários que já leram Obras do autor Navathe e do autor Korth. 
 
5)Crie uma View ‘VUsuario’ com todos os dados da tabela usuário. 
 
6) Apresente em SQL as editora que possuem uma quantidade de obras menor que a média da 
quantidade de Obras de cada Editora. 
 
10)Verifique os dados da View VUsuario. Verifique os dados da tabela usuário. 
 
Responda: 
O que você observa? 
 10 
 
 
11) Essa View VUsuario é atualizável? Insira o seguinte registro na View Vusuario: 
(14,’testeviewusu’,'F',2) 
Responda: 
Selecione os dados da View e depois da tabela usuario. Observe os dados. 
 
12)Crie uma View ‘VNomUsuario’com o nome do usuario da tabela usuario. 
 
13)Insira o seguinte registro na View VNomUsuario: 
(15,’testeviewnomusu’,'F',2) 
 
Responda: 
O que aconteceu? Por quê? 
 
15) Crie uma View ‘VFeminino’ com todos os atributos da tabela usuario, cujo sexo é igual a 
feminino. 
 
16)Insira o registro a seguir na View VFeminino: 
(16,’testeviewfeminino’,'M',2) 
Responda: 
O que aconteceu? Por quê? 
 
17)Insira o registro a seguir na View Vfeminino 
(17,’testeviewfeminino2’,'F',2) 
 
18)Insira o registro a seguir na tabela usuario: 
(18,’testeviewfeminino3’,'F',2) 
 
19) Crie uma View ‘VFemProf’ que tenha todos os atributos da tabela usuário, que são professores 
e cujo sexo é feminino. 
Observe as dependências da tabela usuário e da View VFemProf. 
 
20)Insira o registro a seguir na View VfemProf: 
(19,’testeviewfemProf’,'F',2) 
Responda: 
O que aconteceu? Por quê? 
 
21)Insira o registro a seguir na tabela usuário: 
(19,'testeviewfemProf','F',2) 
 
 
 
 
 
 
 
 
 
 
22)Criar as Views de acordo com a estrutura proposta na figura5.Observe as dependências em 
propriedades. 
 
VUsuario 
VVUsuFem VVUsuMas 
VVNomUsu
Fem 
VVNomUsu
Mas 
Figura5: Demonstrativo da hierarquia das Views 
 11 
22.1)Criar uma View ‘VVUsuFem’ com todos os atributos da Vusuario, que sejam do sexo 
feminino. 
 
22.2)Criar uma View ‘VVUsuMas’ com todos os atributos da Vusuario, que sejam do sexo 
Masculino. 
 
22.3)Criar uma View ‘VVNomUsuFem’ com o nome do usuário da VVUsuFem. 
 
22.4)Criar uma View ‘VVNomUsuMas’ com o nome do usuário da VVUsuMas. 
 
23) Criar uma View ‘VFemChkOption’ com todos os atributos da tabela usuário cujo sexo é 
feminino, use a opção ‘With Check Option’. 
 
24)Insira o registro a seguir na View VFemChkOption: 
(20,'testeVFemChkOption','M',2) 
Responda: 
O que aconteceu? Por quê? 
 
25)Insira o registro a seguir na View VFemChkOption 
(20,'testeVFemChkOption','F',2) 
 12 
Prática 4 
 
4- Índices 
 
4.1 Objetivo 
 
Ao final desta prática o aluno deverá ser capaz de: 
 
• Criar índices para o Banco de Dados Biblioteca. 
 
4.2 Desenvolvimento 
A criação de índices é uma ferramenta poderosa para projetistas de Banco de Dados. Um índice 
é uma estrutura auxiliar que melhora o desempenho das consultas. O SQL-Server tem dois tipos 
de índices: Clustered Index e Nonclustered Index. 
 
4.2.1 ClusteredIndex 
Um Clustered Index ordena os dados de acordo com os valores do campo onde o índice está 
sendo ordenado. 
Ao criar um Clustered Index é necessário considerar: 
• Cada tabela pode conter apenas um Clustered Index. 
• A ordem física das linhas das tabelas (Leaf Nodes) e das linhas do índice (Non-Leaf 
Nodes) é a mesma. Caso queira utilizar um Clustered Index e um Nonclustered Index 
na mesma tabela, deve-se criar o Cluestered Index primeiro, uma vez que isso 
modifica a ordem dos registros na tabela. 
• Os valores da chave em um Clustered Index devem ser únicos. Isto é possível com a 
utilização da palavra UNIQUE, na criação do índice. Se não utilizarmos a palavra 
UNIQUE o SQL-Server adicionará um identificador interno, o qual será o único para 
cada chave do índice. Este identificador interno é de 8 bytes e é somente para uso do 
SQL-Server, não podendo seus valores serem acessados pelo usuário através de um 
comando SELECT. 
• O espaço ocupado por um Clustered Index é cerca de 5% do tamanho da tabela. Este 
percentual varia, dependendo da coluna que está sendo indexada. 
• Durante o processo de criação do índice o SQL-Server ocupara, temporariamente, 
espaço em disco. A criação de um Clustered Index requer cerca de 1,2 vezes o 
tamanho da tabela que está sendo indexada. Este espaço é liberado após a criação do 
índice. Caso o Banco de Dados não permita crescimento automático dos arquivos 
que o compõem e não exista este espaço disponível, o índice não poderá ser criado. 
4.3.2 Nonclustered Index 
Este tipo de índice cria uma estrutura separada das páginas da tabela. A ordem dos registros na 
tabela não é alterada com a criação de um Nonclustered Index. Com isso, os registros ficam 
armazenados em uma ordem aleatória. 
Observações sobre Nonclustered Index: 
• Nonclustered Index é o default para a criação de índices no SQL-Server. 
• Podemos ter um máximo de 249 Nonclustered Indexes por tabela. 
• A partida da versão 2005 do SQL-Server foi incluída uma novidade ao Nonclustered 
Index. É possível ampliar a funcionalidade de um Nonclustered Index, através da 
inclusão de colunas que não são chave, como parte das páginas Leaf do índice. Esta 
opção pode melhorar consideravelmente o desempenho das consultas, 
principalmente em casos onde todas as colunas do comando T-SQL fazem parte do 
Nonclustered Index, sejam estas colunas do tipo chave ou não. Isso ocorre porque, 
sendo todas as colunas de uma consulta parte do índice, bastará o SQL-Server 
pesquisar diretamente no índice, o que é muito mais rápido, do que, após localizar o 
 13 
registro no índice, ainda ter que percorrer a página de dados para a qual aponta o 
valor encontrado no índice. 
 
4.2.3 FillFactor Option 
Ao criarmos um Clustered Index, os dados da tabela são armazenados em páginas de dados de 
acordo com a ordem dos valores da coluna indexada. Ao inserirmos novos registros na tabela, 
estes precisam ser inseridos na ordem definida pelo campo que compõe o índice. 
 
Nestas situações pode acontecer de registros terem que ser deslocados para outras páginas para 
que o registro que está sendo inserido seja colocado na ordem correta. Esse procedimento 
também acontece quando utilizamos um Nonclustered Index, ao adicionarmos ou alterarmos os 
registros da tabela. 
 
Ao criarmos um índice podemos especificar um valor para a opção FillFactor. Este valor define 
um percentual a ser deixado em branco, sem registros gravados, em cada página de dados. O 
objetivo deste espaço em branco é agilizar as operações de Inserção, alteração e inclusão de 
dados, evitando que tenham que ser feitas movimentações de registros entre páginas. Com isso 
obtém-se um melhor desempenho nestas operações. O valor do FillFactor é um percentual que 
pode variar de 0 a 100%, um valor 100% significa que as páginas de dados serão ocupadas 
completamente. O valor 100% deve ser utilizado apenas se a tabela for usada somente para 
consulta. 
4.2.4 DBCC – Database Consistency Checker 
No SQL-Server temos uma série de comandos para manutenção e otimização de tabelas e 
índices, comandos conhecidos como “DBCC”. A maioria desses comandos é utilizada para 
verificação de consistência física e lógica de um banco de dados e de seus elementos, tais como 
tabelas e índices. Em muitos situações, o comando, além de fazer a verificação, é capaz de 
corrigir problemas encontrados. 
 
3.3 Exercícios 
3.3.1 Exercício 1: Entendendo a definição do índice 
 1º. Passo: Duplo clique na opção de índice a [Figura 5] será exibida: 
 
 14 
Figura 5: Tela Visualização e inclusão dos índices 
 2º. Passo: Duplo Clique no índice na tabela Pais, a tela será exibida [Figura 6]: 
 
Figura 6: Tela de Edição do Índice. 
Responda: Qual é o tipo do índice? 
As informações dos índices também podem ser visualizadas através do comando digitado no SQL 
SQL Server Management Studio: 
Sintaxe: exec sp_helpindex 
 
exec sp_helpindex Pais ou sp_helpindex Pais 
 
3.3.2 Exercício 2: Criando um Nonclustered Index Simples com o SQL Server Management 
Studio 
 1º. Passo: Clique com o botão direito na Tabela Pais, escolha a opção Indexes →New Index, 
a [Figura 5] , será exibida. 
 
 2º. Passo: Dê o nome para o índice de IndexNome e marque a coluna NomPais, que será a 
coluna referência para o índice [Figura 7]. 
 15 
 
Figura 7: Tela de Inclusão do Índice na Tabela Pais. 
 3º. Passo: Clique no botão ADD, para selecionar a coluna. 
 
 4º. Passo: Clique no botão OK. Observe que o índice foi criado de acordo com a 
especificação. 
 
 5º. Passo: Verifique a especificação do índice criado com o comando a seguir: 
 sp_helpindex Pais 
 
 6º. Passo: Selecione todos os dados da Tabela Pais. 
 
3.3.3 Exercício 3: Criando um Nonclustered Index com T-SQL 
 1º. Passo: Crie um índice do tipo Nonclustered para o Nome da Editora na Tabela 
Editora. 
Sintaxe: Create Nonclustered Index On() 
 
 2º. Passo: Verifique se o índice foi criado 
sp_helpindex Editora 
 
3.3.4 Exercício 4: Excluir um Índice com T-SQL 
 1º. Passo: Excluir o índice IndexNome da Tabela Pais 
Sintaxe: Drop index . 
 
 2º. Passo: Verifique se o índice foi excluído 
sp_helpindex Pais 
 16 
 
3.3.5 Exercício 5: Manipulando as propriedades do Índice com T-SQL 
 1º. Passo: Crie um índice com o Nome IndexNomePais na Tabela Pais para o atributo 
NomPais, do tipo Nonclustered e a ordenação DESC. 
Sintaxe: 
Create Nonclustered Index On 
( ); 
 
 2º. Passo: Selecione os dados da Tabela Pais. 
 
 3º. Passo: Excluir o IndexNomePais da Tabela Pais. 
 
 4º. Passo: Crie um índice com o Nome IndexNomePais na Tabela Pais para o atributo 
NomPais, do tipo Nonclustered e a ordenação ASC. 
 
 5º. Passo: Selecione os dados da Tabela Pais. 
 
 6º. Passo: Execute o 3º. Passo. Crie um índice para a coluna NomPais como UNIQUE. 
 
 7º. Passo: Inserir o País - Brasil com o código 6. 
Responda: 
a) Ocorreu erro? Por quê? 
 
2.3.3 Exercício 1: Verificando as Estatísticas usando Índices 
1º. Passo: Mude o modo de exibição para Texto. Menu Query → Results in Text 
2º. Passo : Comando para “Ligar” as estatísticas. 
Sintaxe: Set Statistics IO ON 
 
Execute as consultas verificando os resultados em estatísticas: 
• Logical Reads: Informa o números de páginas lidas em memória. 
• Physical Reads: Número de páginas lidas em disco. Se as páginas requeridas por um 
comando não estão em memória, devem ser lidas do disco para a memória. 
• Read Ahead Reads: páginas lidas por antecipação. O SQL lê páginas adicionais para 
efeito de otimização, mantendo-as em cachê para agilizar sua utilização por outras 
queries. 
• Scan Count : Número de vezes que a tabela foi acionada. Dependendo da maneira como 
escrevemos a query, o mesmo pelo modelo do join, uma mesma tabela pode ser acessada 
repetidas vezes. 
 
2º. Passo : Verifiquese existe um índice do tipo NonCluster para a coluna Nome da Editora na 
Tabela Editora. Caso não exista crie esse índice. 
 
3º. Passo : Execute o comando: 
Sintaxe: dbcc show_statistics(,) 
 
O Ponteiro do índice é representado pela coluna CodEdi que é o índice cluster da 
tabela. Portanto a coluna CodEdi foi anexada a tabela à estrutura da tabela na forma de ponteiro. 
 
3.3.6 Exercício 6: Reconstrução de Índices com T-SQL 
Um índice é gravado fisicamente dentro do banco de dados em uma página de índices (Index Page). 
As páginas de índice são criadas seqüencialmente através de ponteiros que indicam o local da 
próxima página. Quando campos-chave são alterados e conseqüentemente o índice, as páginas de 
índices ficam fragmentadas. É aconselhável que se reconstrua o índice com o comando Create 
 17 
Index e a opção With Drop_Existing, que aproveita a ordem dos dados já existentes para acelerar o 
processo. 
 
 1º. Passo: Reconstruir o índice com o Nome – IndexNome, na Tabela Pais para o atributo 
NomPais, esse índice é do tipo Nonclustered. Utilize o comando Create Index com a opção With 
DROP_Existing. 
Sintaxe: 
Create Nonclustered Index On 
(NomeColuna) With DROP_Existing 
 
3.3.7 Exercício 7: Usando a Opção - FillFactor Option 
 1º. Passo: Crie um índice para o atributo NomAut na Tabela Autor, use a opção With 
FillFactor 65%. 
Sintaxe: 
Create Nonclustered Index On 
(NomeColuna)With FillFactor = 
 
Create Nonclustered Index IndexNomeAutor On Autor(NomAut)With 
FillFactor = 65 
 
3.3.8 Exercício 8: Criando um Nonclustered Index Composto com T-SQL 
 1º. Passo: Crie um índice composto do tipo Nonclustered para o Código da Obra e Código 
da Editora na Tabela Exemplar. 
Sintaxe: Create Nonclustered Index On 
{,',,[]) 
 18 
Prática 5 
 
5 - Criação de um atributo com numeração automática 
 
5.1 Objetivo 
 
Ao final desta prática o aluno deverá ser capaz de: 
a. Gerar um atributo como autoincremento 
 
5.2 Desenvolvimento 
A grande maioria dos SGBDs populares possuem o recurso de auto numeração para colunas, como é o caso 
das SEQUENCES para Oracle, ou da propriedade AUTO_INCREMENT para o MySQL. 
 
O SQL Server disponibiliza a propriedade IDENTITY para as colunas do tipo inteiro, permitindo a criação 
de uma coluna auto numerável. 
 
Algumas condições devem ser observadas para trabalhar com esta propriedade: 
• Apenas colunas do tipo INT, TINYINT, SMALLINT e BIGINT podem ser auto numeráveis 
• Somente uma única coluna pode ser auto numerável em uma tabela 
A propriedade IDENTITY é utilizada para atributos (campos/colunas) das tabelas nas funções CREATE 
TABLE e ALTER TABLE, e tem como finalidade incrementar um valor a cada nova inserção. 
Sintaxe: 
IDENTITY [ (início , incremento ) ] 
• Início: Valor a ser utilizado para o primeiro valor inserido na coluna. 
• Incremento: Valor a ser incrementado a cada nova inserção. 
Exemplo para criação de uma tabela utilizando um campo auto incremento: 
Create Table RamoAtividade2 
( CodRamAti smallint Identity(1,1) not null, 
DesRamAti varchar(100) not null, 
Constraint pk_RamoAtividade2 primary key(CodRamAti) 
); 
Nesse exemplo a tabela RamoAtividade possui dois atributos, sendo CodRamAti a chave primária e tendo 
seu primeiro valor válido igual a 1 e se auto incrementando de 1 em 1, ou seja, primeiro registro igual a 1, o 
segundo igual a 2 e assim sucessivamente. 
A inserção em tabelas que possuem campos auto incrementos deve-se suprimir da sintaxe INSERT os 
mesmos, conforme exemplo a seguir: 
Insert into RamoAtividade2 (DesRamAti) values ('Agrícola'); 
Insert into RamoAtividade2 (DesRamAti) values ('Mineração'); 
Insert into RamoAtividade2 values ('Papelaria'); 
 19 
Observe que o atributo CodRamAti foi suprimido, devido a funcionalidade de auto incremento, assim os 
valores serão gerados automaticamente conforme suas configurações. 
O que acontece quando um comando de exclusão de dados é executado? 
Delete from RamoAtividade2 where CodRamAti = 3; 
insert into RamoAtividade2 values ('Gráfica'); 
Para saber o valor atual do IDENTITY, basta usar o seguinte comando: 
SELECT IDENT_CURRENT(''); 
SELECT IDENT_CURRENT('RamoAtividade2'); 
Portanto, em uma nova instrução INSERT, o registro gerado, terá o valor de acordo com a sequência, ou 
seja, descartando o valor que foi excluído. 
Supondo que em um determinado momento torna-se necessário inserir um novo registro, porém com valor 
retroativo ao IDENTITY, ou seja, um valor que já foi inserido e deletado. Nos exemplos esse valor é o “3”. 
Utilizando a situação descrita é possível “desligar” o IDENTITY em uma instrução de INSERT. 
Sintaxe: 
SET IDENTITY_INSERT (,) VALUES (,) 
SET IDENTITY_INSERT OFF 
 
SET IDENTITY_INSERT RamoAtividade2 ON 
INSERT INTO RamoAtividade2(CodRamAti,DesRamAti) VALUES (3,'Química') 
SET IDENTITY_INSERT RamoAtividade2 OFF 
Essa forma de execução do comando, o SQL Server não gera o valor de auto incremento para o atributo 
CodRAmAti, permitindo que o usuário informe manualmente o valor para o mesmo. (ON: desabilita a 
funcionalidade do auto incremento, OFF: habilita a funcionalidade). 
Suponha que ocorra uma exclusão de todos os dados da tabela: 
Delete from RamoAtividade2; 
Insert into RamoAtividade2 values ('Industrial'); 
Observe que mesmo com a exclusão de todos os registros da tabela, ao fazer a inclusão de um novo registro a 
sequência para o auto incremento continua de onde parou. 
Em caso de necessidade é possível “reiniciar” a sequência de auto incremento. 
DBCC Checkident( , reseed, 0); 
DBCC Checkident( RamoAtividade2, reseed, 0); 
Insert into RamoAtividade2 (DesRamAti) values ('Agrícola'); 
Insert into RamoAtividade2 (DesRamAti) values ('Mineração'); 
Insert into RamoAtividade2 values ('Papelaria'); 
A sequência foi alterada para 0, logo a próxima inserção terá valor igual a “1”. Não é obrigado iniciar a 
sequência do 0, podendo alterar esse valor conforme as necessidades vigentes. 
9.2.1 Definindo um atributo como identity via interface gráfica 
 20 
Em designer crie uma tabela RamodeAtividade3, com o atributo CodRamAti como identity, mude na janela 
propriedades “Especificação de Identidade” -> É identidade para SIM. 
 
Figura: Visão propriedades da Tabela. 
9.2.2 Diferença entre IDENTiTY e SEQUENCE 
Uma das diferenças entre SEQUENCE e IDENTITY está no fato de que as SEQUENCES são acionadas 
sempre quando forem necessárias, sem dependência de tabelas e campos no banco, onde pode ser chamada 
diretamente por aplicativos. 
 
Outra diferença está que nas SEQUENCES, nós podemos obter o novo valor antes de usá-lo em um 
comando, diferente do IDENTITY, onde não podemos obter um novo valor. Além disso, com o IDENTITY 
não podemos gerar novos valores em uma instrução UPDATE, enquanto que com SEQUENCE, já podemos. 
 
Com SEQUENCES, podemos definir valores máximos e mínimos, além de podemos obter mais valores em 
sequencia de um só vez, utilizando para isso a procedure SP_SEQUENCE_GET_RANGE, onde então é 
permitido atribuirmos os valores individuais para aumentar então o desempenho no uso da SEQUENCE. 
 
Uma das grandes utilidades em IDENTITY está no fato de podermos trabalhar com o mesmo na utilização 
de TRANSAÇÕES de INSERT, pois, só iremos gerar um próximo valor a partir do momento que o comando 
for executado, ou seja, que a transação for aceita,ao contrário de uma SEQUENCE, que uma vez chamado 
seu próximo valor, mesmo que ocorra um erro de transação, o valor é alterado. 
 
- MINVALUE e MAXVALUE: delimitam o limite da SEQUENCE com seu respectivo valor máximo e 
mínimo. Caso o valor não seja inserido, será atribuído o valor do DataType escolhido. 
 
- INCREMENT: define em quantos números serão incrementadas as sequencias. No exemplo da imagem 
acima, será realizado o incremento de 1 em 1. 
 
- CYCLE: A propriedade do objeto CYCLE permite começar novamente um ciclo a partir do momento que a 
propriedade MINVALUE e MAXVALUE for atingida. 
 
- CACHE: pelo fato de desempenho, o SQL Server pré-aloca os números sequencias pela propriedade 
CACHE, sendo que o valor padrão para esta é 15, significando que valores de 1 a 15 serão disponibilizados 
na memória a partir do último valor armazenado em cache. 
 
Create table Localidade2 
 21 
( 
 CodLoc smallint not null, 
 NomLoc varchar(100) not null, 
 Constraint pk_Localdiade2 primary key(CodLoc) 
) 
Os objetos SEQUENCES não estão vinculados a tabela. Este vinculo irá ocorrer, por exemplo, se utilizando 
de PROCEDURES. 
CREATE SEQUENCE dbo.SEQCodLoc 
 START WITH 1 
 INCREMENT BY 1 
 NO CACHE 
 NO CYCLE 
 
Em seguida é necessário criar um procedimento. 
 
Create Proc PRC_Sequencia 
 ( 
 @NomLoc varchar(100) 
 ) 
 AS 
 BEGIN 
 INSERT INTO Localidade2 
 values( NEXT VALUE FOR dbo.SEQCodLoc, @NomLoc ) 
 END 
 
exec PRC_Sequencia 'Belo Horizonte'; 
 
 Select * from localidade2; 
 
 exec PRC_Sequencia 'São Paulo'; 
9.3 Inserindo Dados em uma tabela proveniente de uma consulta (Combinação de Insert e Select) 
Insert into RamoAtividade2 (DesRamAti) Select DesRamAti from RamoAtividade; 
9.4 Combinação de Update e Select 
Pode-se combinar o comando SELECT e UPDATE. No exemplo, os contratos de menor valor receberão um 
aumento de 10%. 
UPDATE Contrato 
SET ValTotCon = ValTotCon * 1.1 
WHERE VAlTotCon = (SELECT MIN(ValTotCon) FROM Contrato) 
Utilização do SELECT como valor para o UPDATE 
UPDATE Contrato 
SET ValTotCon = (SELECT MAX(ValTotCon) FROM Contrato) 
WHERE NumCon = 1 
9.5 Diferença entre primary key e unique 
Após a escolha entre os atributos que são candidatos a serem chave primária, aquele que será a chave 
primária, os demais atributos com a característica de ser único deverão se definidos como UNIQUE. 
Create Table Empregado 
( 
 22 
 MatEmp smallint identity not null, 
 NomEmp varchar(200) not null, 
 CPFEmp smallint unique not null, 
 Constraint pk_Emp primary key(MatEmp) 
) 
Execute os comandos: 
Insert into empregado values( 'Viviane Cristina Dias',11); 
 
Select * from Empregado; 
 
Insert into empregado values( 'Ana Maria Silva Duarte',11);

Mais conteúdos dessa disciplina