SQL ja pisut teistmoodi Partitioned View

Selle loo kirjutan nii eesti kui inglise keeles.

Sel nädalal pidin mängima uue vana vahendiga: Partitioned Views. Ja jäin hätta. Õnneks ainult natukeseks.

Hakatuseks meenutus, mis on partitioned view. See on tehnika, mis võimaldab mitu ühesugust tabelit liita näiliselt üheks. Igal võivad olla omad tugiindeksid, nad võivad paikneda erinevates (ka lugemiseks vaid) failigruppides.

Partitioned view hea omadus on, et kui ta on päringu sihmärk ja päringus on sobiv where-fraas, siis päringu täitmisplaani lülitatakse ainult vajalikud tabelid. Mõnede tingimuste täitmisel on partitioned view ka uuendatav, sel juhul ta “paistab” nagu “päris tabel”, aga on palju paindlikum ja kiirem.

Väike näide:

create table T1 (kood int primary key (check kood between 1 and 100, .... )
create table T2 (kood int primary key (check kood between 101 and 200, .... )
create table T3 (kood int primary key (check kood between 201 and 300, .... )
GO
create view TT as
select * from T1
union all
select * from T2
union all
select * from T3
GO

Saadud view TT ongi partitioned view. Päring:

select ... from TT where kood = 107

puudutab vaid tabelit T2 ja päring

select ... from TT where kood between 170 and 210

puudutab vaid tabeleid T2 ja T3.

Tavaliselt tükeldatakse tabel mingi kuupäeva järgi, siis saab lausa vanemad kirjed paigutada lugemiseks ainult (read only) failigruppi ja päringud lähevad kordi kiiremaks.

Seda vigurit õpetan ja kasutan ma juba ammu. Eelduseks on, et mul on osalistel tabelitel veerg, mille kaupa tükeldada ja sellel veerul on korrektne check-constraint, mis jaotab suure pildi mittekattuvateks ja kontrollitud osadeks.

Ja see eeldab, et andmemudel on minu käes ja minu kontrolli all. Aga kui ei ole?

Sattusin lahendama ülesannet, kus osalisi tabeleid on sadu, nende andmemudelit ma muuta ei saa ning nad on jaotatud ettevõtete ja aastate kaupa. Tabeli nimi määrab, millise ettevõtte ja millise aasta andmed seal on. Aruandluse jaoks on aga vaja teha vaade, mis haarab kokku andmed mõnedest või kõigist sellistest tabelitest.

Lihtsuse mõttes teen näited väikese arvu tabelitega: TabXX2012, TabXX2013, Tabxx2014, TabYY2012, TabYY2013, TabYY2014.

Kui ma panen kokku union view kujul

create view TabAll
as
select 'XX' as Ettevote, 2012 as Aasta, * from TabXX2012
union all
select 'XX' as Ettevote, 2013 as Aasta, * from TabXX2013
union all
select 'XX' as Ettevote, 2014 as Aasta, * from TabXX2014
union all
select 'YY' as Ettevote, 2012 as Aasta, * from TabYY2012
union all
select 'YY' as Ettevote, 2013 as Aasta, * from TabYY2013
union all
select 'YY' as Ettevote, 2014 as Aasta, * from TabYY2014

siis sellest pole palju kasu. Päring


select * from TabAll where Aasta = 2013

päringuplaan näitab, et läbi käiakse kõik tabelid. Päringu optimeeria “ei näe”, et aasta 2013 sialdub ainult kahes tabelis. Leidsin aga vahva lahenduse, kõnealune view tuleb teha pisut keerukam (neid viewsid teeb mulle 1 script – ise ma neid ei tee)

create view TabAll
as
select * from (select 'XX' as Ettevote, 2012 as Aasta, * from TabXX2012) T where Ettevote = 'XX' and Aasta = 2012
union all
select * from (select 'XX' as Ettevote, 2013 as Aasta, * from TabXX2013) T where Ettevote = 'XX' and Aasta = 2013
union all
select * from (select 'XX' as Ettevote, 2014 as Aasta, * from TabXX2014) T where Ettevote = 'XX' and Aasta = 2014
union all
select * from (select 'YY' as Ettevote, 2012 as Aasta, * from TabYY2012) T where Ettevote = 'YY' and Aasta = 2012
union all
select * from (select 'YY' as Ettevote, 2013 as Aasta, * from TabYY2013) T where Ettevote = 'YY' and Aasta = 2013
union all
select * from (select 'YY' as Ettevote, 2014 as Aasta, * from TabYY2014) T where Ettevote = 'YY' and Aasta = 2014

Selline view töötab samamoodi nagu “klassikaline” partitioned view. Päring

select * from TabAll where Aasta = 2012

puudutab vaid tabeleid TabXX2012 ja TabYY2012. Saladus peitub selles where lauses. Päringu optimeerija näeb where lauses olevat predikaati ja oskab optimeerida nii, et pöördutakse vaid nende osade poole, kus where predikaadid “kattuvad”.

Lisan peagi ka jätkupostituse, kus kirjeldan, kuidas sellist viewd ja tehnikat veel ära kasutada saab.

Rubriigid: MS SQL Server, sildid: . Salvesta püsiviide oma järjehoidjasse.

Lisa kommentaar