Bok, tražimo bazaše i ljubitelje podataka.
Firma je Tune informacijske tehnologije i u pravilu se bavimo analitikom, optimizacijom i izradom podatkovnih sustava i konzultantskim uslugama vezanim uz SQL Server generalno. Trenutno imamo 6 zaposlenih i tražimo pojačanja na SQL Serveru, konkretno dvije pozicije:
[list]
[*]Database Developer
[*]Database Administrator[/list:u]
Dok su developeri fokusiraniji na dizajn baza, pisanje i optimizaciju upita, administratori rade generalni troubleshooting po SQL Serveru. Njihovi poslovi uključuju detektiranje sporih upita, izradu backup strategije i strategije visoke dostupnosti baze, automatizaciju čestih radnji, strukturiranje datoteka s podacima po diskovima, pametno indexiranje tablica, monitoring performansi, security, kompresiju, particioniranje ...
Imamo 2 Microsoft Certified Trainera koja drže SQL Server certifikaciju na Algebri i to je neki generalni smjer u kojem bi i vaše obrazovanje išlo: [url]https://www.microsoft.com/learning/en-us/mcsa-sql-certification.aspx[/url]
Odgovaraju nam i studenti i bivši studenti koji traže stalni posao. Ako osim SQL-a volite R ili neki drugi analitički alat, napomenite to u mailu.
Ured je na ulasku u Dubravu, radno vrijeme je relativno fleksibilno (dolazimo svi do 9:30). Više o tome na razgovoru ...
Web stranica nam je u izradi (nakon 2 godine odgađanja).
U nastavku je zadatak kojeg bi trebali odraditi umjesto slanja CV-a jer je ovako zabavnije :)
[b]Zadatak je optimizirati transakcijsku bazu. Materijali su na dnu.[/b]
Tablica
[img]http://www.deviantpics.com/images/2015/03/27/table.png[/img]
Podaci
[img]http://www.deviantpics.com/images/2015/03/27/data.png[/img]
[b]Činjenice o sustavu:[/b]
[list]
[*]Imamo SQL Server bazu koja se zove MyDB.
[*]Unutar te baze trenutno postoji samo jedna tablica Transakcije.
[*]U tablicu Transakcije dolaze podatci o korisničkim transakcijama u stvarnom vremenu i očekujemo da će u nju doći oko 1,000,000 zapisa mjesečno.
[*]Ovakav dizajn je očajan i upiti su spori.
[*]Pretpostavka je da će broj zapisa u budućnosti još narasti.
[*]Pretpostavka je da će broj korisnika narasti.
[*]Pretpostavka je da će se u nekom trenutku na bazi dodavati funkcionalnosti, odnosno da će se stvarati još objekata (tablica, view-a, procedura).
[/list:u]
[b]O kolonama:[/b]
[list]
[*]ID je jedinstveni identifikator zapisa kojeg generira baza podataka. Nema drugih tablica koje se vežu na ovu, pa je ove ID-eve moguće izbrisati i kreirati drugu logiku dodjele ID-a.
[*]Korisnici se moraju registrirati prije korištenja aplikacije.
[*]Preciznost vremena transakcije mora biti na razini milisekunde.
[*]Iznosi transakcija su u kunama i sadržavati lipe.
[*]Poslovnica je definirana regijom i adresom, odnosno, ne postoje 2 poslovnice koje u istoj regiji imaju istu adresu.
[*]Statusi transakcije mogu biti: Odobrena, Na čekanju, Stornirana
[*]Vrsta transakcije može biti: 1 - Uplata, 2 - Isplata.
[/list:u]
[b]Upute:[/b]
[list=1]
[*]Potrebno je napraviti redizajn baze kako bi se sustav optimizirao za upis transakcija i za izvještavanje, pri čemu je naglasak na upis transakcija (INSERT, UPDATE, DELETE operacije). Pod izvještavanje se misli na pisanje analitičkih upita (SELECT naredbe koje često uključuju grupiranja).
[*][b]Sve je dozvoljeno[/b]. Cilj je napraviti funkcionalnu bazu koja sprema transakcije. SVE je dozvoljeno mijenjati i dodavati. Optimizacija, naravno, uključuje i pametni dizajn indexa na tablicama.
[*]Ne postoji "točno" rješenje. Zanima me kako bi vi to optimizirali i zašto bi radili pojedine korake. Primjerice, ako dodajete index na tablicu, objasnite zašto je on potreban. Hoće li taj index eventualno usporiti upis listića ali istovremeno značajno ubrzati analitičke upite? Analizirajte vlastite postupke, dovoljno je dobro i napomenuti da je negdje moguće dodati index i usporediti stanje bez njega i s njim. Ovdje sam to napomenuo na primjeru dodavanja indexa, ali to vrijedi i za ostale izmjene (npr. redizajn ID kolone).
[*]U testnoj tablici imamo samo 6 zapisa. Bonus bodovi ako netko napravi pametnu skriptu za punjenje testnim podacima (napunite barem 100,000 transakcija za veljaču i 100,000 za ožujak).
[/list:o]
[b]Nad optimiziranom bazom, potrebno je napisati upite koji prikazuju:[/b]
[list=1]
[*]Ukupan broj transakcija na razini mjeseca. (pretpostavka je da su u bazi samo podaci od 2015. godine)
[*]Kumulativno stanje Iznosa na razini mjeseca imajući na umu vrste transakcije. Uplate su novac koji nam ulazi u sustav, a Isplate su novac koji izlazi iz sustava. Kumulativno stanje je razlika uplata i isplata.
[*]Korisnike koji su imali transakcije u veljači, a nisu imali u ožujku.
[*]Broj različitih korisnika na razini regije.
[*]Poslovnicu s najvećim brojem Odobrenih transakcija.
[/list:o]
Slijedi TSQL pomoću kojega je moguće kreirati testnu bazu, tablicu i napuniti ju s nekoliko redaka. Predlažem da, ako nemate SQL Server instaliran na računalu, skinete besplatnu Express verziju: [url]http://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx[/url]
[code:1]
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 3/27/2015 3:49:39 PM ******/
CREATE DATABASE [MyDB]
GO
USE [MyDB]
GO
/****** Object: Table [dbo].[Transakcije] Script Date: 3/27/2015 3:49:40 PM ******/
CREATE TABLE [dbo].[Transakcije](
[ID] [nvarchar](20) NOT NULL,
[Korisnik] [nvarchar](50) NULL,
[Datum] [date] NULL,
[Vrijeme] [time](4) NULL,
[Iznos] [float] NULL,
[Poslovnica] [nvarchar](1000) NULL,
[Regija] [nvarchar](50) NULL,
[StatusTransakcije] [nvarchar](30) NULL,
[VrstaTransakcije] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'1', N'Ivan Horvat', CAST(N'2015-02-18' AS Date), CAST(N'18:20:14' AS Time), 120, N'Ilica 19', N'Zagreb', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'3', N'Ana Anić', CAST(N'2015-02-18' AS Date), CAST(N'18:20:15' AS Time), 150, N'Ilica 19', N'Zagreb', N'Na čekanju', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'4', N'Ivan Horvat', CAST(N'2015-02-19' AS Date), CAST(N'14:22:15' AS Time), 95, N'Vukovarska 11', N'Split', N'Odobrena', 2)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'5', N'Mako Marković', CAST(N'2015-02-28' AS Date), CAST(N'15:21:45' AS Time), 60, N'Vukovarska 11', N'Split', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'6', N'Petra Petrić', CAST(N'2015-03-01' AS Date), CAST(N'11:11:11' AS Time), 800, N'Frankopanska 4', N'Zagreb', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'7', N'Ana Anić', CAST(N'2015-03-01' AS Date), CAST(N'13:13:13' AS Time), 200, N'Trg Trgova 22', N'Split', N'Na čekanju', 2)
GO
USE [master]
GO
ALTER DATABASE [MyDB] SET READ_WRITE
GO
[/code:1]
Rješenja (u obliku TSQL skripte koju je moguće pokrenuti na SQL Serveru) poslati na filip.rodik[at]tuneit.hr
Tekst, koji sadrži vaša razmišljanja i objašnjenja poteza, možete napisati u komentarima unutar samog koda ili u mailu ili u Word dokumentu.
Nema roka.
Bok, tražimo bazaše i ljubitelje podataka.
Firma je Tune informacijske tehnologije i u pravilu se bavimo analitikom, optimizacijom i izradom podatkovnih sustava i konzultantskim uslugama vezanim uz SQL Server generalno. Trenutno imamo 6 zaposlenih i tražimo pojačanja na SQL Serveru, konkretno dvije pozicije:
- Database Developer
- Database Administrator
Dok su developeri fokusiraniji na dizajn baza, pisanje i optimizaciju upita, administratori rade generalni troubleshooting po SQL Serveru. Njihovi poslovi uključuju detektiranje sporih upita, izradu backup strategije i strategije visoke dostupnosti baze, automatizaciju čestih radnji, strukturiranje datoteka s podacima po diskovima, pametno indexiranje tablica, monitoring performansi, security, kompresiju, particioniranje ...
Imamo 2 Microsoft Certified Trainera koja drže SQL Server certifikaciju na Algebri i to je neki generalni smjer u kojem bi i vaše obrazovanje išlo: https://www.microsoft.com/learning/en-us/mcsa-sql-certification.aspx
Odgovaraju nam i studenti i bivši studenti koji traže stalni posao. Ako osim SQL-a volite R ili neki drugi analitički alat, napomenite to u mailu.
Ured je na ulasku u Dubravu, radno vrijeme je relativno fleksibilno (dolazimo svi do 9:30). Više o tome na razgovoru ...
Web stranica nam je u izradi (nakon 2 godine odgađanja).
U nastavku je zadatak kojeg bi trebali odraditi umjesto slanja CV-a jer je ovako zabavnije
Zadatak je optimizirati transakcijsku bazu. Materijali su na dnu.
Tablica
Podaci
Činjenice o sustavu:
- Imamo SQL Server bazu koja se zove MyDB.
- Unutar te baze trenutno postoji samo jedna tablica Transakcije.
- U tablicu Transakcije dolaze podatci o korisničkim transakcijama u stvarnom vremenu i očekujemo da će u nju doći oko 1,000,000 zapisa mjesečno.
- Ovakav dizajn je očajan i upiti su spori.
- Pretpostavka je da će broj zapisa u budućnosti još narasti.
- Pretpostavka je da će broj korisnika narasti.
- Pretpostavka je da će se u nekom trenutku na bazi dodavati funkcionalnosti, odnosno da će se stvarati još objekata (tablica, view-a, procedura).
O kolonama:
- ID je jedinstveni identifikator zapisa kojeg generira baza podataka. Nema drugih tablica koje se vežu na ovu, pa je ove ID-eve moguće izbrisati i kreirati drugu logiku dodjele ID-a.
- Korisnici se moraju registrirati prije korištenja aplikacije.
- Preciznost vremena transakcije mora biti na razini milisekunde.
- Iznosi transakcija su u kunama i sadržavati lipe.
- Poslovnica je definirana regijom i adresom, odnosno, ne postoje 2 poslovnice koje u istoj regiji imaju istu adresu.
- Statusi transakcije mogu biti: Odobrena, Na čekanju, Stornirana
- Vrsta transakcije može biti: 1 - Uplata, 2 - Isplata.
Upute:
- Potrebno je napraviti redizajn baze kako bi se sustav optimizirao za upis transakcija i za izvještavanje, pri čemu je naglasak na upis transakcija (INSERT, UPDATE, DELETE operacije). Pod izvještavanje se misli na pisanje analitičkih upita (SELECT naredbe koje često uključuju grupiranja).
- Sve je dozvoljeno. Cilj je napraviti funkcionalnu bazu koja sprema transakcije. SVE je dozvoljeno mijenjati i dodavati. Optimizacija, naravno, uključuje i pametni dizajn indexa na tablicama.
- Ne postoji "točno" rješenje. Zanima me kako bi vi to optimizirali i zašto bi radili pojedine korake. Primjerice, ako dodajete index na tablicu, objasnite zašto je on potreban. Hoće li taj index eventualno usporiti upis listića ali istovremeno značajno ubrzati analitičke upite? Analizirajte vlastite postupke, dovoljno je dobro i napomenuti da je negdje moguće dodati index i usporediti stanje bez njega i s njim. Ovdje sam to napomenuo na primjeru dodavanja indexa, ali to vrijedi i za ostale izmjene (npr. redizajn ID kolone).
- U testnoj tablici imamo samo 6 zapisa. Bonus bodovi ako netko napravi pametnu skriptu za punjenje testnim podacima (napunite barem 100,000 transakcija za veljaču i 100,000 za ožujak).
Nad optimiziranom bazom, potrebno je napisati upite koji prikazuju:
- Ukupan broj transakcija na razini mjeseca. (pretpostavka je da su u bazi samo podaci od 2015. godine)
- Kumulativno stanje Iznosa na razini mjeseca imajući na umu vrste transakcije. Uplate su novac koji nam ulazi u sustav, a Isplate su novac koji izlazi iz sustava. Kumulativno stanje je razlika uplata i isplata.
- Korisnike koji su imali transakcije u veljači, a nisu imali u ožujku.
- Broj različitih korisnika na razini regije.
- Poslovnicu s najvećim brojem Odobrenih transakcija.
Slijedi TSQL pomoću kojega je moguće kreirati testnu bazu, tablicu i napuniti ju s nekoliko redaka. Predlažem da, ako nemate SQL Server instaliran na računalu, skinete besplatnu Express verziju: http://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx
Kod: |
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 3/27/2015 3:49:39 PM ******/
CREATE DATABASE [MyDB]
GO
USE [MyDB]
GO
/****** Object: Table [dbo].[Transakcije] Script Date: 3/27/2015 3:49:40 PM ******/
CREATE TABLE [dbo].[Transakcije](
[ID] [nvarchar](20) NOT NULL,
[Korisnik] [nvarchar](50) NULL,
[Datum] [date] NULL,
[Vrijeme] [time](4) NULL,
[Iznos] [float] NULL,
[Poslovnica] [nvarchar](1000) NULL,
[Regija] [nvarchar](50) NULL,
[StatusTransakcije] [nvarchar](30) NULL,
[VrstaTransakcije] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'1', N'Ivan Horvat', CAST(N'2015-02-18' AS Date), CAST(N'18:20:14' AS Time), 120, N'Ilica 19', N'Zagreb', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'3', N'Ana Anić', CAST(N'2015-02-18' AS Date), CAST(N'18:20:15' AS Time), 150, N'Ilica 19', N'Zagreb', N'Na čekanju', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'4', N'Ivan Horvat', CAST(N'2015-02-19' AS Date), CAST(N'14:22:15' AS Time), 95, N'Vukovarska 11', N'Split', N'Odobrena', 2)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'5', N'Mako Marković', CAST(N'2015-02-28' AS Date), CAST(N'15:21:45' AS Time), 60, N'Vukovarska 11', N'Split', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'6', N'Petra Petrić', CAST(N'2015-03-01' AS Date), CAST(N'11:11:11' AS Time), 800, N'Frankopanska 4', N'Zagreb', N'Odobrena', 1)
GO
INSERT [dbo].[Transakcije] ([ID], [Korisnik], [Datum], [Vrijeme], [Iznos], [Poslovnica], [Regija], [StatusTransakcije], [VrstaTransakcije])
VALUES (N'7', N'Ana Anić', CAST(N'2015-03-01' AS Date), CAST(N'13:13:13' AS Time), 200, N'Trg Trgova 22', N'Split', N'Na čekanju', 2)
GO
USE [master]
GO
ALTER DATABASE [MyDB] SET READ_WRITE
GO
|
Rješenja (u obliku TSQL skripte koju je moguće pokrenuti na SQL Serveru) poslati na filip.rodik[at]tuneit.hr
Tekst, koji sadrži vaša razmišljanja i objašnjenja poteza, možete napisati u komentarima unutar samog koda ili u mailu ili u Word dokumentu.
Nema roka.
|