Guia de estudos DB2 - Prova 731 - Parte 3
Autor: Juliano Martins | Publicado: 2010-01-19T09:16:00-08:00


Esta parte de nosso estudo para a certificação DBA DB2 (731) cobre o Centro de Tarefas, gerência de índices, constraints, view e tabelas do catálogo do sistema.
Por favor, ignore erros de português. Esse guia foi escrito conforme eu ia estudando, portanto, a preocupação era aprender, e não escrever bem. :-)

3.1 Centro de tarefas
O centro de tarefas do DB2 permite que sejam criadas tarefas agendadas que podem executar comandos do DB2, comandos do SO, comandos JCL ou MVC e ainda uma combinação dos comandos anteriores. Para pode utilizar o centro de tarefas, o banco de dados tools catalog deve ser criado com o comando:

db2 create tools catalog cc create new database toolsdb

Para iniciar o centro de tarefas o comando é db2tc. As tarefas podem ser de vários tipo, podem por exemplo executar rotinas de backup, limpeza, cálculos, etc. Elas podem ser agendadas e usuários podem ser notificados via email ao final da execução.


3.2 Índices
Índices são utilizados para garantir valores únicos em tabelas e para melhorar a performance de consultas.

Podemos criar um index com o comando "create index" ou ainda quando criamos um tipo UNIQUE em uma tabela, quando criamos um campo referenciando outro campo em uma outra tabela ou ainda quando criamos uma tabela com mais que uma dimensão, um índice é criado.

Um DBA tem que pesar muito bem o benefício de se criar um índice. Quando qualquer dado de uma tabela á alterado, o índice tem que ser alterado também, e isso toma tempo de processador além de espaço em disco.

Um índice pode ser criado no momento da criação da tabela ou ainda criado a qualquer outro momento. As sintaxes são:

CREATE TABLE TEST (
&nbsp;column 1 definition, column 2 definition, ...
) IN  INDEX IN 
&nbsp;&nbsp;&nbsp; &nbsp; 
CREATE  INDEX  ON 
 ( column 1  , column 2  ... )
É possível adicionar colunas em um índice:
CREATE UNIQUE INDEX IX ON EMPLOYEE (EMPNO) INCLUDE(LASTNAME,FIRSTNME)

Normalmente cria-se 1 ou 2 índices por tabela em um banco OLTP, para um banco misto são 2 a 4, e finalmente para um DW são 5 ou mais.   As tabelas de índices são residentes no mesmo table space que a tabela reside por padrão, mas você pode especificar um outro table space, o que é até uma boa prática.  No momento de criar um indice UNIQUE em uma tabela existente o banco verifica se o mesmo pode ser criado, ou seja, verifica se não existe algum dado que quebre, caso exista uma quebra o indice não é criado.

3.3 Constraints
São restrições definidas pelo DBA para garantir integridade ao banco, por exemplo: validar se um campo chave não se repita, validar se um campo filho tem seu correspondente, validar o conteúdo a ser inserido, etc.  Podem ser definidos na criação da tabela ou na alteração da mesma:
&nbsp;
ALTER TABLE EMPLOYEE&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ADD CONSTRAINT check_job&nbsp; CHECK ( &nbsp;&nbsp;&nbsp;&nbsp; JOB IN ('Engineer','Sales','Manager'))&nbsp;&nbsp;&nbsp;   CREATE TABLE EMPLOYEE&nbsp; (&nbsp;&nbsp; &nbsp; EMPNO INT NOT NULL PRIMARY KEY,&nbsp;&nbsp; &nbsp; JOB VARCHAR(10) CONSTRAINT CHECK_JOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp; CHECK (JOB IN ('Engineer','Sales','Manager')),&nbsp;&nbsp; ...&nbsp; )

No momento de criar uma constraint o banco verifica se a mesma pode ser criada, vendo se não existe algum dado que a quebre. É possível criar uma constraint "not forced", o que quer dizer, que o valor não tem que ser obrigatoriamente o que está sendo inserido, alterado: &nbsp;

SEX CHAR(1) NOT NULL&nbsp;&nbsp;&nbsp; CONSTRAINT&nbsp; SEXOK&nbsp;&nbsp;&nbsp; CHECK (SEX IN ('M','F'))&nbsp;&nbsp;&nbsp; NOT ENFORCED&nbsp;&nbsp;&nbsp; ENABLE QUERY OPTIMIZATION,

O ENABLE QUERY OPTIMIZATION vai otimizar a query para os valores que estão no check, então, quando se efetuar um select filtrando por um valor diferente de M ou F, o resultado não será trazido, pois a query estará otimizada para os valores M e F. (Essa é fatal cair na prova de certificação)  É possível desabilitar a otimização:

ALTER TABLE EMPDATA&nbsp;  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION
&nbsp;
3.4 Views
Uma view é uma "tabela virtual" derivada de uma ou mais tabelas. Quando você altera os dados em uma view, o campo da tabela original, também é alterado, desde que o DB2 possa determinar a origem do dado, porém, você pode definir se a view poderá sofrer operações tais como update, delete, etc.  Sintaxe do comando:
&nbsp;
CREATE VIEW view-name (column list) AS (fullselect)

Exemplo de comando de criação:

CREATE VIEW TELEPHONE_BOOK AS&nbsp; (&nbsp; SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL&nbsp; )

Podemos criar views a partir da união de duas ou mais tabelas. É possível alterar dados de uma view, porém tenha em mente que ao fazer isso, você estará automaticamente alterando a tabela da qual a view é originada.Quando criamos uma view utilizando o parâmetro "WITH CHECK OPTION", garantimos que só será feito um update na mesma se for utilizado a cláusula where.  Uma View inoperante é uma view que não tem mais função, por exemplo, a tabela a qual a mesma se referencia foi deletada ou não se tem privilégios sobre a mesma.
&nbsp;
3.5 Tabelas do catálogo so sistema
Estas tabelas são utilizadas para manter nosso banco de dados e contem informações tais como definição das tabelas, permissões, etc. Elas ficam no esquema SYSCATSPACE. Quando um banco é criado, é dado permissão de select para todo mundo (public) nestas tabelas.Para remover o privilégio de select em uma tabela o comando é:  &nbsp;

REVOKE SELECT ON SYSCAT.DBAUTH FROM PUBLIC

Para dar permissão, trocamos o Revoke por Grant.  As tabelas do catálogo mais úteis são: 
SYSCAT.COLUMNS: Onde estão as colunas de TODAS as tabelas do banco.
SYSCAT.INDEXCOLUSE: Mostra as colunas que são índice.
SYSCAT.INDEXES: Mostra os índices de cada tabela.
SYSCAT.TABLES: Mostra todas as tabelas do sistema.
SYSCAT.VIEWS: Mostra todas as tabelas do sistema.
3.6 Forçando dados únicos
A clausula UNIQUE força que determinado campo em uma tabela tenha um valor único, por exemplo, o CPF, não será repetido nas outras linhas da tabela. Quando uma primary key é criada, o campo automaticamente será do tipo UNIQUE. Também pode-se criar um campo que não seja PK mas seja do tipo Unique, por exemplo:
CREATE TABLE EMPLOYEE&nbsp; (&nbsp; ....,&nbsp;  SOCINS CHAR(11) NOT NULL UNIQUE,&nbsp;  ...,&nbsp; )

Finalmente pode ser criado um índice único, como em:
CREATE UNIQUE INDEX UNIQUE_EMPLOYEE ON EMPLOYEE(EMPNO)

Voltar para o índice do guia.