Un segment peut s’étaler sur plusieurs fragments. Les segments sont listés dans syssegments.
Un fragment peut supporter plusieurs segments. Les fragments sont listés dans master..sysusages.
La jointure entre ces deux tables aurait donc du faire intervenir une troisième table assurant la liaison.
Au lieu de cela, Sybase opte pour une jointure par bitmask.
Dans la table syssegments, chaque segment possède un numéro.
Dans la table master..sysusages, chaque fragment possède une valeur numérique qui s’appelle segmap. Ce nombre est la somme des puissances de deux correspondant aux segments attachés à ce fragment.
Exemple A : Si un fragment est attaché aux segments 0 et 1, le segmap = 2^0+ 2^1 = 3.
Exemple B : Si un fragment est attaché aux segments 2 et 5, le segmap = 2^2 + 2^5 = 36.
Se pose donc le problème de la lisibilité d’une telle méthode. La jointure nécessaire pour décoder cela est la suivante :
select * from syssegments, master..sysusages
where segmap & power(2,segment) = power(2,segment)
On peut rétrécir son résultat pour ne voir que ce qui concerne la base courante :
select * from syssegments, master..sysusages
where segmap & power(2,segment) = power(2,segment)
and dbid=db_id()
Enfin, on peut rajouter les noms des devices pour être plus complet :
select s.name segment, d.name device, phyname
from syssegments s, master..sysusages f, master..sysdevices d
where segmap & power(2,segment) = power(2,segment)
and dbid=db_id()
and f.vdevno = d.vdevno
order by s.name
Continuez votre lecture sur le blog :
- Partitionnement sémantique (Capdata team) [Sybase]
- Fragmentation sur des tables stockées en S-GAM (David Baffaleuf) [SQL Server]
- Direct i/o, dsync on/off, raw device (David Baffaleuf) [SybaseVintage]
- Sybase Ribo (Capdata team) [Sybase]
- Attention : publication transactionnelle et indexes non clusters (David Baffaleuf) [SQL ServerVintage]