Jointure entre syssegments et sysusages

Jeudi, février 21, 2013
By Lionel BOLNET in Sybase (lbolnet@capdata.fr) [3 article(s)]

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 :




Cliquer pour partager cet article sur Viadeo
Cliquer sur "CAPTURER" pour sauvegarder cet article dans Evernote Clip to Evernote

Leave a Reply