On olukordi, kus vaja hoida kirje kohta staatusi; ala töödeldud, viga (võib olla mitu viga), täiendavat infot.
Variandid:
- teha tabelile kõvasti bit välju, muudaks tabeli suht koledaks
- teeks teise tabeli, mis hoiaks antud kirje staatusi. Raiskame ketast ning muudame päringud kohmakaks
DOS ajast külge jäänud komme bitte kasutada. Jaotasin ära bitid loogilisse vahemikku, mis on väga tähtis
Veabitid jätke alati viimaseks !
Kokku 32 staatus, kui 0 ka arvestada :
0 – siis tähendas, et kirjet pole üldse töödeldud
– töödeldud edukalt
2^0=1
– milline programm muutis/töötles kirjet (4 programmi sai muuta)
2^1=2
2^2=4
2^3=8
2^4=16
– reserveeritud
2^5=32
2^6=64
2^7=128
2^8=256
– kirje täiendavad infobitid
2^9=512
2^10=1024
2^11=2048
2^12=4096
2^13=8192
2^14=16384
– töötlemisel tekkinud vead (16 tk), 7 reserveeritud
2^15=32768
2^16=65536
2^17=131072
2^18=262144
2^19=524288
2^20=1048576
2^21=2097152
2^22=4194304
2^23=8388608
2^24=16777216
2^25=33554432
2^26=67108864
2^27=134217728
2^28=268435456
2^29=536870912
2^30=1073741824
Näiditabel siis:
create table bitmaania
(vagavajalikudandmed varchar(255),
staatused int not null default 0)
go
create index bitmaaniatavalineindx on bitmaania(staatused)
Paneme mõned kirjed ka:
insert into bitmaania(vagavajalikudandmed,staatused)
values(‘JAMA 1′,2|32768 )
go
insert into bitmaania(vagavajalikudandmed,staatused)
values(‘JAMA 2′,8|2097152|134217728 )
go
insert into bitmaania(vagavajalikudandmed,staatused)
values(‘ÜKS ÕNNESTUNUD KIRJE’,1|4|8192 )
Tulemus tabelis…
Päringu tulemus:
JAMA 1 32770
JAMA 2 136314888
ÜKS ÕNNESTUNUD KIRJE 8197
Teeme päringu, anna kõik korrektsed kirjed
Teoorias nagu kõik õige, kui bitmaskide loogikat kasutada. Aga tegelikkuses pole lood nii ilusad, sest mõlema näite puhul ei kasutata indeksit (forced index ei anna ka midagi).
SELECT [vagavajalikudandmed]
,[staatused]
FROM [test].[dbo].[bitmaania]
where staatused & 1=1
või mittekorrektsed
SELECT [vagavajalikudandmed]
,[staatused]
FROM [test].[dbo].[bitmaania]
where staatused & 1!=1
Nüüd peame esitama küsimuse, kas me teeme ainult otsingut ainult stiilis anna kõik korrektsed ja mittekorrektsed kirjed või tahame otsida ka veakoodide järgi.
Kui tõesti vaid esimene variant, siis võib bitmaaniatavalineindx kasutada. See olukord eeldab, et kirjel peab alati olema töödeldud staatus. Sest suvaline infobit märgiks, et kirje töödeldud.
SELECT [vagavajalikudandmed]
,[staatused]
FROM [test].[dbo].[bitmaania] with (index (bitmaaniatavalineindx))
where staatused>0 and staatused<32768
Aga saab ka kavalamalt teha,
et kas ikka reaalselt ka töödeldud bit olemas !
alter table [test].[dbo].[bitmaania]
add okrecs as cast(staatused & 1 as bit)
go
create index okbit on [test].[dbo].[bitmaania](okrecs)
– anname indeksi ette,
– et mssql server ennast üle ei mõtleks !
SELECT [vagavajalikudandmed]
,[staatused]
FROM [test].[dbo].[bitmaania] with (index (okbit))
where okrecs =1
Näiteks soovime ainult kirjeid, millel viga:
2^21=2097152
SELECT [vagavajalikudandmed]
,[staatused]
FROM [test].[dbo].[bitmaania] with (index (bitmaaniatavalineindx))
where staatused>=2097152 and staatused<=4194303
Bitmask pole paha stiil andmebaasinduses, aga seda tuleb osata kasutada !
Lõppu hariv sql lause, millega saate 2 astmete väärtustega tutvuda
set nocount on
declare @btmasks table (temp varchar(255))
declare @cnt int
set @cnt=0
while @cnt<31
begin
insert into @btmasks
select ‘ 2^’+CAST(@cnt as varchar)+’='+cast(power(cast(2 as bigint),@cnt) as varchar)
set @cnt=@cnt+1
end
– 2^31 – 1 viimane bait on negatiivsuse lipp, seda kasutada ei ole hea
select temp as bmaskval from @btmasks