Quais objetos possuem alocações em um dispositivo de disco no SAP ASE?
Este é um método para responder a pergunta “Quais objetos estão (possuem alocações) em um dispositivo de disco Y?” no SAP ASE 15.x e superior.
SAP ASE divide cada dispositivo de disco em 256 páginas de unidades de alocação, cada unidade de alocação consiste de 32 extensões, de 8 páginas cada.
Cada extensão pode ser alocada para apenas um “id” de índice e para apenas um “id” de objeto ou partição.
Um “id 0” de índice é usado para páginas contento dados reais e não chaves de indices. Já um “id 255” de índice é usado para dados do tipo “LOB” (“Large Objects”), ou seja, objetos contendo dados extensões, cujos tipos de dados podem ser, “text”, “image”,”unitext” e “java class”.
SAP ASE possue um comando não documentado chamado “dbcc usedextents” que reporta informações sobre cada estrutura das extensões de um banco de dados.
A saída para uma estrutura de extensões se parece com o seguinte exemplo:
====
set switch on 3604
go
dbcc usedextents(dbname,0,0)
go
[…]
Allocation bitmap: 0xff ( 2384 2385 2386
OAMPG: 328 Extent ID 2384 on allocation page 2304
Object ID is 5
Index ID is 0
Partition ID is 52387 2388 2389 2390 2391 )
Dealloc bitmap: 0x00 ( )
Forward bitmap: 0x00 ( )
Reserve bitmap: 0x00 ( )
status: 0x00 (EX_DEALL_NOSTATUS )
Sort bit is off
Reference bit is off
Spacebits bitmap: 0x88888888
Page: 2384 (0x08 (Less than 100% occupied))
Page: 2385 (0x08 (Less than 100% occupied))
Page: 2386 (0x08 (Less than 100% occupied))
Page: 2387 (0x08 (Less than 100% occupied))
Page: 2388 (0x08 (Less than 100% occupied))
Page: 2389 (0x08 (Less than 100% occupied))
Page: 2390 (0x08 (Less than 100% occupied))
Page: 2391 (0x08 (Less than 100% occupied))
Buddy Page for extent (se_extbuddypage): 0
[…]
====
Se você executar o comando “dbcc usedextents (<database_name>,0,0)” e salvar a saída em um arquivo, você pode filtrar informações como “extentid”, “object id” e “indexid” usando um simples “script” criado em “awk” como no exemplo abaixo:
====
isql -Usa -P -o usedextents_output.txt << EOF
set switch on 3604
go
dbcc usedextents(mydatabase,0,0)
go
EOF
awk ‘$1==”OAMPG:” {printf (“%d\t”, $5) }\
$1==”Object” {printf (” %d \t”, $4)}\
$1==”Index” {printf (” %d \n”, $4)}’ usedextents_output.txt > usedextents_awk.txt
====
Esse “script” produz dados em forma tabular com uma linha por extensão
====
[…]
174064 591338140 2
174096 591338140 2
[…]
(extent 174064 is allocated to object 591338140 index 2)
====
Desta forma voce pode importar esses dados para uma tabela no SAP ASE e criar “queries” para responder perguntas como “Que tabelas estão no dispositivo de disco “datadev_1”
====
isql -Usa -P << EOF
use tempdb
go
create table usedextents (extent int, objectID int, indid tinyint)
go
exit
EOF
bcp tempdb..usedextents in usedextents_awk.txt -Usa -P -c
====
A “query” abaixo é para o SAP ASE 15.x ou superior, versões anteriores do SAP ASE usavam uma relação diferente entre as tabelas de sistema “sysusages” e “sysdevices”.
Quais tabelas de usuário no banco de dados “mydatabase” estão no dispositivo de disco “datadev1”?
====
declare @dbname varchar(255)
select @dbname = “mydatabase” — your db name here
declare @devicename varchar(255)
select @devicename = “datadev” — your device name here
select distinct
x.objectID as “objectID”,
object_name( objectID, db_id(@dbname) ) as “name”
from
tempdb..usedextents x,
master..sysusages u,
master..sysdevices d
where
u.dbid = db_id(@dbname)
and d.name = @devicename
and x.extent between u.lstart and (u.lstart+u.size)
and u.vdevno = d.vdevno
and x.objectID > 99 — User tables only
order by
object_name(x.objectID, db_id(@dbname))
====
Observação: Artigo original criado por Bret Halford