Guia de estudos DB2 - Prova 731 - Parte 2
Autor: Juliano Martins | Publicado: 2010-01-11T04:22:00-08:00


Esta é a continuação do guia de estudos para o exame 731 (DBA DB2). Deve ser utilizado como um complemento para os estudos, e não como a fonte principal. Nesta parte focaremos na criação e gerenciamento de objetos do bancos de dados.

2.1 - Criação de banco de dados e table spaces
Comando "db2 create database"
Este comando tem N parametros, dentre eles, o Codeset (linguagem do banco), as tablespaces, o diretório onde o banco vai ficar, etc.
Por padrão, este comando cria 3 table spaces:
SYSCATSPACE: é onde se armazena o catálogo do sistema (system catalog), ou seja, onde as informações sobre o banco serão armazenadas. Não pode ser apagada.
TEMPSPACE1: Tabela temporária. Pode ser dropada desde que outra seja criada.
USERSPACE1: O padrão onde os objetos do usuário serão criados. Pode ser deletada se existir outro table space com a mesma finalidade.

Ao efetuar o comando create table, o banco de dados é criado no diretório apontado pela variável DFTDBPATH por padrão. Se esta variável for vazia e se o usuário não especificar manualmente a localização da base de dados, a mesma será criada exatamente onde o comando foi executado.

Para especificar o local de criação de uma base, a sintaxe é:
"db2 create database test on /home/julianom/base1"
no caso, /database é onde a mesma será criada.

Explorando os arquivos criados, vemos que o comando criou um diretório db2inst1 e dentro dele um chamado NODE0000 DENTRO do base1:

&nbsp;base1/db2inst1/NODE0000/

NODE0000 representa um diretório de uma base não particionada, se fosse algo particionado, seria um número correspondente a partição.
db2inst1 representa a instância na qual a base foi criada.

Dentro do diretório NODE0000 podemos observar outros 3 diretórios:

SQL00001&nbsp; sqldbdir&nbsp; TEST

Nossa base está dentro de SQL00001. Podemos ter inúmeras bases no mesmo diretório, então, este número corresponde a uma base, para ter certeza qual a sua base, efetuamos o comando "db2 list database directory on /home/julianom".

Uma table space pode ser do tipo DMS - Database Managed Space, onde, a mesma vai crescendo sob demanda e não tem interação do usuário neste crescimento, para se criar uma dessa forma sendo armazenada em dois arquivos diferentes (e até em diretórios diferentes):
create database sample2 user table space managed by database
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using(file '/dbfiles/cont0' 5000, file '/dbfiles/cont1' 5000)

Outro tipo de gerenciamento de Table Spaces é o SMS: System Managed Space, onde a adição de mais espaço deve ser feita manualmente, comando:

create database sample3 temporary tablespace managed by system
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using('/dbfiles/cont0', '/dbfiles/cont1')


2.2 Automatic Storage
Basicamente é a gerência de espaço em disco automaticamente pelo DB2. Você seta como automático, e quando vai criar uma table space, não precisa especificar localização, o DB2 cria automaticamente nos caminhos setados pelo usuário:
db2 create database db_name automatic storage yes
db2 create database db_name on db_path1, db_path2

Mesmo se um DB não está setado para Automatic Storage, podemos setar uma Table Space para ser gerenciada dessa forma:
db2 create tablespace ts_name managed by automatic storage

2.3 Schemas
É um meio lógico de gerenciar objetos do seu banco de dados. Por exemplo, podemos ter tabelas no esquema FINANCEIRO, onde somente determinados usuários poderão fazer insert, updates, etc. Nos referimos a um objeto do esquema da seguinte forma: esquema.objeto.
Alguns esquemas são criados por padrão quando se cria um DB:
SYSIBM: O esquema com os objetos básicos do BD.
SYSCAT: Views do catálogo públicas.
SYSSTAT: Views do catalogo que influenciam o otimizador.
SYSFUN: Funções definidas pelo usuário.

Normalmente temos um esquema com o nome do usuário no BD.

2.4 Tablespaces
Espaço em disco onde os dados são armazenados, o disco físico é também conhecido como container.
Para ver o estado das tablespaces, o comando é:
db2 list tablespaces show detail

2.5 Objetos do banco de dados
O DB2 tem alguns objetos muito importantes para seu funcionamento, e um DBA precisa conhecer muito bem estes objetos, seguem os principais:

2.5.1 Buffer pools: Área em memória onde ficam os dados em cache, ou seja, que estão sendo lidos do disco. O disco é lento, já a memória é rápida, então o BD tenta manter o máximo de dados possível em memória.

Para criar um buffer pool: db2 create bufferpool , onde você estabelece nome, tamanho, entre outros, exemplo:
create bufferpool BP1 size 25000

2.5.2 Tabelas: São onde as informações residem. Você pode especificar manualmente em qual tablespace sua tabela vai ser alocada, além disso você pode colocar os índices e certos tipos de dados como long, em outras table spaces.
O comando para se criar uma tabela é "create table".

Mais comandos úteis:
list tables - Lista as tabelas do usuário
list tables for all - Listar todas as tabelas de uma base
list tables for schema x - Listar todas as tabelas do esquema X
describe table tablename - Mostra a estrutura de uma determinada tabela

2.5.3 Índices
São a chave de busca/acesso aos dados em uma tabela. Alguns exemplos:
create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics

2.5.4 Colunas identidade (identity)
São as conhecidas chaves sequenciais. Podem ser gerados pelo DB2 ou passados pelo usuário (caso não seja passado, o DB2 irá gerar automaticamente). Não pode ser repetido em uma tabela. Comando de criação:
create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (START WITH 100 INCREMENT BY 1), description CHAR(20) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2.5.5 Views
Uma view é uma espécie de tabela derivada de uma consulta em uma ou mais tabelas/views. 

Quando uma alteração é feita em uma view, a alteração é feita na tabela correspondente a ela também.

Os dados de uma view não são armazenados separadamente dos dados de uma tabela. As definições de uma view ficam no catálogo do sistema.

Exemplo de criação de uma view:
create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PERSONNEL WHERE EMPNO=EMPNUMB
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2.5.6 Constraints
Como o nome diz, RESTRINGE algo. Uma constraint não pode ser alterada. Ela deve ser removida e criada em caso de necessidade de alteração. Existem diferentes tipos de constraints:

a) Integridade referencial: Pode ser primary key, unique, foreign e references. 
b) Unique: não permite repetir um valor para uma coluna.
c) Check: Força que um valor de um campo obedeça a um padrão.
d) Informational: São regras utilizadas pelo otimizador para definir comportamento, por exemplo, se uma chave será verificada num load de dados.

2.5.7 Triggers
Define-se como uma série de ações que serão disparadas por uma ação. Pode ser disparada antes ou depois de inserts, updates ou deletes. 

2.6 Multi-dimensional clustering
Fazendo uma analogia é como se armazenar dados, ao invés de em estruturas como uma planilha (tabela), numa matriz multidimensional. Para se criar uma tabela MDC, utilizamos o organize by:

CREATE TABLE MDCTABLE(
Year INT,
Nation CHAR(25),
Colour VARCHAR(10),
... )
ORGANIZE BY(Year, Nation, Color)

2.7 Particionamento de tabelas
Basicamente consiste em dividir tabelas para obter maior desempenho. Por exemplo, podemos ter uma tabela de vendas dividida por data, no caso abaixo, estamos dividindo de dois em dois anos:

CREATE TABLE fact
(txn_id char(7), purchase_date date, ...)
IN tbsp1, tbsp2, tbsp3, tbsp4
PARTITION BY RANGE (purchase_date)
(
STARTING FROM ('2005-01-01')
ENDING ('2006-12-31')
EVERY 1 MONTH
)

Não podemos particionar uma tabela utilizando campos Logs ou Long Varchar. Podemos utilizar múltiplos campos na partição.

É possível atachar uma partição a uma tabela com o comando ATTACH:
ALTER TABLE FACT_TABLE ATTACH PARTITION
STARTING '06-01-2006'
ENDING '06-30-2006'
FROM TABLE FACT_NEW_MONTH

2.8 Compactação de tabelas (compression)
Basicamente Strings repetidas são substituídas e colocadas num dicionário. Sintaxe:
create table table_name ... compress yes
Ou
alter table tablename compress yes

Na primeira vez que for compactar uma tabela, utilizamos a sintaxe para criar o dicionário:
reorg table table_name resetdictionary

Nas próximas vezes, não precisamos criar o mesmo:
reorg table table_name keepdictionary

É possível estimar o quanto de espaço liberaremos com a compactação com o comando:
db2 inspect rowcompestimate table name table_name results keep file_name
E então (para converter o arquivo de binário para texto):
db2inspf file_name output_file_name

2.9 XML
DB2 trabalha com XML como um tipo de dados NATIVO. Para se criar uma tabela com um tipo XML:
create table table_name (col1 data_type, ..., xml_col_name XML)

É possível que um campo XML seja um index.

Para ver o índice do guia de estudos, clique aqui.