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);