Joulupähkinä #11 – Mikä on paras indeksi?

SQL-ongelma: Luo parhaat mahdolliset indeksit kyselylle. Kyselyä et saa muuttaa muilta osin, kuin lähdetaulujen nimien suhteen, koska joudut luomaan kopion olemassa olevista tauluista. Yritä saada mahdollisimman tehokas indeksi niin, että levyoperaatiot jäävät mahdollisimman pieniksi.

Kysely, josta saat siis muuttaa vain taulujen nimiä niiltä osin, kuin olet ottanut kopion alkuperäisistä tauluista:

select sum(SalesAmount),
c.CurrencyName,d.DayNumberOfWeek
from
dbo.FactInternetSales –tätä riviä saa muuttaa
as f inner join
dbo.DimCurrency –tätä riviä saa muuttaa
as c ON
f.CurrencyKey=c.CurrencyKey
inner join
dbo.DimDate –tätä riviä saa muuttaa
as d ON f.OrderDateKey=d.DateKey where d.EnglishMonthName=’April’
group by c.CurrencyName,d.DayNumberOfWeek;

Ongelma on taas siellä tutulla palvelimella

Palvelin: qsql.database.windows.net
Käyttäjätunnus: joulu
Salasana: kalenteri123!
Tietokanta: AdventureWorksLT

Kun ajat komentoa, laita tilastot näkyviin komennoilla:

set statistics io on;
set statistics time on;

Silloin saat messages-välilehdelle näkyviin montako loogista levy-io:ta kysely teki. Ilman mitään muutoksia tulos näyttää tältä:

Eli kysely teki yhteensä: 0+56+0+1439+40 = 1535 levy-io:ta. Tuon alle pitäisi päästä mahdollisimman paljon.

Saat luoda tauluista kopion ottamalla select * into jouludelete.omataulu… Eli Esimerkiksi: select * into jouludelete.FactInternetSales_vesa from dbo.FactInternetSales

Sen jälkeen sinulla on oikeus luoda indeksejä tuohon luomaasi tauluun ja tietenkin sitten muutat selectiä niin että se kyselee siitä sun versiosta, eikä alkuperäisestä. Palauta tuo levy-io listaus ihan sellaisenaan ja mielellään valmiiksi laskettuna summa noista loogisista levy-io:sta.

Palauta tehtävä taas Microsoft Formsiin

Joulupähkinä #10 vastaus

Vastauksia tuli 6 kpl, joten nyt oli taas tylsä tai jotain… Mutta harmittavasti ei ainoatakaan oikeaa vastausta. Pähkinän vaikea knoppi oli se, että Azure Data Factory laskuttaa jokaisesta laatikosta jonka se suorittaa käytetyn ajan, tai vähintään 1 minuutin. Tämä 1 minuuttia voi näytellä tällaisissa loopeissa tosi isoa merkitystä.

Tein esimerkkiajon niin että tuo lookupin palauttava objekti oli 10 riviä, jolloin suoritusaika oli seuraava:

External activities on noita stored proceja. Niitä on siis 20, koska 10 kertaa 2 procia. Se on 0,333h, eli 0,333*60 = 20 minuuttia. Lisäksi tulee pipeline aktiviteetteja 0,016h, eli 0,16*60 = 1. Tämä tarkoittaa siis sitä ekaa lookupia.

Jos tuon olisi pyöräyttänyt 500 objektille, olisi kustannus ollut

  • 1 min pipeline
  • 1000 min external activities

yhteensä 1001 minuuttia, eli 16,7 tuntia, vaikka suoritus olisi ollut ohi 2 minuutissa. Kustannuksia tämä testi olisi aiheuttanut (1000/60)*0,085eur + (1/60)*0,211 eur = 1,4 euroa.

Tämä on yksi Data Factoryn väärin ymmärretyin ominaisuus. Se on tosi hyvä vekotin siirtämään dataa paikasta toiseen, mutta jos sitä käytetään kuten SSIS:ää on aina käytetty, mennään metsään ja pahasti.