Communities
[PL] Wydarzenie – Jubileuszowe spotkanie PLSSUG Warszawa!
Nov 26th
Ależ ten czas leci :-) Ani się obejrzałem a tu wybiła 3-cia rocznica powstania Polskiej Grupy Użytkowników SQL Server (PLSSUG). Okazja do świętowania nadarzy się 4 grudnia we Wrocławiu (SQLDay 2010), ale wcześniej świętowanie rozpocznę w Warszawie na jubileuszowym 50. spotkaniu PLSSUG Warszawa. Spotkanie odbędzie się w czwartek, 2 grudnia, (tradycyjnie już) w siedzibie firmy Microsoft (Al. Jerozolimskie 195A). Wstęp wolny po wcześniejszej rejestracji. Jak impreza, to zgodnie z hasłem: “wino, śpiew, kobiety” ;-) Nie wiem, jak ze śpiewem i trunkami (na pewno będzie przekąska w postaci pizzy!), ale kobiet z pewnością na spotkaniu nie zabraknie, ponieważ PLSSUG Warszawa organizuje wspólne spotkanie z grupą Women in Technology :-)
Co się tam będzie działo? Będzie na pewno wesoło – będą konkursy, nagrody, ważni ludzie z Microsoftu (co najmniej jeden zadeklarował swoją obecność). Będzie “miękka” sesja o savoir-vivre w pracy oraz lekka prezentacja techniczna o nowinkach w SSIS w SQL Server “Denali”. Przemęczenia umysłu na pewno nie będzie, ponieważ sporo osób z Warszawy wybiera się już w następną sobotę do Wrocławia na wspomniany SQLDay 2010. Więc, żeby nie było za dużo SQL-a na tydzień, spotkanie w Warszawie to raczej okazja do integracji.
Zapraszam serdecznie w imieniu liderów PLSSUG Warszawa – Krzysiów Stachyry i Bąka – oraz swoim. Do zobaczenia w czwartek. Start imprezy o 18:00. Tego nie można przegapić ;-)
[PL] Wydarzenie – Ruszyła rejestracja na SQLDay 2010
Nov 18th
Ruszyła rejestracja na konferencję SQLDay 2010 organizowaną przez Polską Grupę Użytkowników SQL Server (PLSSUG). Konferencja odbędzie się 4 grudnia we Wrocławiu. Udział jest bezpłatny. To już trzecia konferencja z tej serii (konferencja jest organizowana raz do roku na okoliczność powstania grupy).
Miło mi też zakomunikować, że wraz z moim przyjacielem, Markiem Adamczukiem (SQL Server MVP), wystąpię w roli prelegenta na SQLDay 2010. Nasza sesja nosi tytuł "Optymalizacja SQL Server – Demo Power Hour". Jak sugeruje tytuł sesji, zamierzamy w jej trakcie pokazać wybrane techniki optymalizacyjne. Serdecznie zapraszam!
Jeżeli masz wątpliwości, czy warto 4 grudnia być we Wrocławiu, to myślę, że choćby lista prelegentów rozwieje Twoje wątpliwości. Naprawdę, warto tam być. A jak już tam będziesz, nie zawahaj się do mnie podejść i porozmawiać :-) Wiedza i technologia to jedno, ale nawiązywanie kontaktów i znajomości są zawsze największą wartością w czasie podobnych wydarzeń.
Do zobaczenia we Wrocławiu!
[PL] Wydarzenie – O mitach na spotkaniu PLSSUG
Oct 26th
Z wielką przyjemnością zapraszam na moją prezentację poświęconą mitom w SQL Server. Prezentacja będzie jedną z dwóch sesji w ramach 49. spotkania warszawskiego oddziału Polskiej Grupy Użytkowników SQL Server (PLSSUG). Spotkanie odbędzie się 4 listopada (czwartek) w warszawskiej siedzibie firmy Microsoft (Al. Jerozolimskie 195A). Rozpocznie się o godzinie 18:00. Wstęp na spotkanie wolny (link do rejestracji na stronie wydarzenia).
Moja sesja będzie bazowała na dokumencie przygotowanym przez znanego eksperta – Paula S. Randala. Drugą prezentację w czasie spotkania poprowadzi Mariusz Koprowski (temat – VS nie tylko dla programistów .NET).
Zapraszam!
[PL] Konkurs T-SQL – Wyniki
Oct 6th

Po długich testach pora na ogłoszenie wyników konkursu T-SQL “Liga piłkarska”. W konkursie wzięło udział 17 osób, które nadesłały ponad 60 rozwiązań. Rekordzista – Leszek Gniadkowski – nadesłał 15 rozwiązań. Ale zdarzały się też osoby, które nadesłały jedno, ale za to całkiem nieźle wypadające w testach zapytanie.
Na początek słowo o teście finałowym skierowane głównie do finalistów. Polegał on na uruchamianiu Waszych skryptów na trzech zestawach danych – 20, 50 i 100 drużyn. Dwa z finałowych rozwiązań musiałem wykluczyć z testów już po pierwszym podejściu do zestawu 20 drużyn, ponieważ nie mogłem doczekać się wyników… Pozostałe zostały poddane testom wielokrotnym (na każdym zestawie puszczałem skrypty w pętli po 10 razy, a same pętle były puszczone po 5 razy – czyli w sumie każdy skrypt był uruchomiony 50 razy na każdym zestawie danych). Przed każdym uruchomieniem skryptu czyściłem bufor danych i plan cache, żeby uniknąć przypadkowości. Całość testu przeprowadziłem na laptopie o parametrach: Core 2 Duo (ale tylko jeden procesor używany przez SQL Server) + 4 GB RAM (1 GB przydzielony na bufor danych). Zapytania były monitorowane przez SQL Trace, z którego następnie wyciągałem średnie wartości czterech kryteriów (duration, CPU, reads, writes) dla poszczególnych testów (“20”, “50” i “100”). Dla każdego testu robiłem osobną tabelę. Oto owe tabele:
Test “20”
| Lp | Rozwiązanie | D | C | R | W | RD | RC | RR | RW | T |
| 1 | Gniadkowski_Leszek_v15.sql | 42602 | 41 | 22 | 0 | 1 | 1 | 1 | 1 | 4 |
| 2 | Gniadkowski_Leszek_v10.sql | 52062 | 45,2 | 25 | 0 | 2 | 2 | 2 | 1 | 7 |
| 3 | Gniadkowski_Leszek_v12.sql | 52642 | 45,8 | 25 | 0 | 3 | 3 | 2 | 1 | 9 |
| 4 | Nowakowski_Marcin_v04.sql | 121766 | 108,4 | 161 | 0 | 4 | 4 | 9 | 1 | 18 |
| 5 | Powichrowski_Marek_v12.sql | 177409,4 | 146,8 | 37 | 0 | 7 | 7 | 4 | 1 | 19 |
| 6 | Przeliorz_Tomek_v02.sql | 156648,2 | 135,6 | 325 | 0 | 6 | 6 | 11 | 1 | 24 |
| 7 | Zmuda_Katarzyna_v01.sql | 125126,2 | 113,6 | 633 | 0 | 5 | 5 | 14 | 1 | 25 |
| 8 | Nowakowski_Marcin_v03.sql | 255193,6 | 226,8 | 314 | 0 | 8 | 11 | 10 | 1 | 30 |
| 8 | Sliwa_Krzysiek_v02.sql | 262054 | 223,6 | 126 | 0 | 11 | 10 | 8 | 1 | 30 |
| 10 | Pater_Rafal_v03.sql | 278655,4 | 251,6 | 84 | 0 | 12 | 13 | 5 | 1 | 31 |
| 11 | Poniatowski_Aleksander_v01.sql | 282295,2 | 241,4 | 120 | 0 | 13 | 12 | 7 | 1 | 33 |
| 12 | Pater_Rafal_v04.sql | 300416,4 | 257,8 | 84 | 0 | 14 | 14 | 5 | 1 | 34 |
| 13 | Powichrowski_Marek_v13.sql | 261114 | 213,2 | 1123 | 0 | 10 | 9 | 17 | 1 | 37 |
| 14 | Przeliorz_Tomek_v01.sql | 258753,8 | 212,6 | 4771 | 0 | 9 | 8 | 20 | 1 | 38 |
| 15 | Gailard_Pawel_v02.sql | 423823,2 | 389,8 | 581 | 0 | 15 | 15 | 13 | 1 | 44 |
| 16 | Pakulski_Maciej_v03.sql | 1207088,2 | 998,2 | 578 | 0 | 17 | 18 | 12 | 1 | 48 |
| 17 | Kulczynski_Przemyslaw_v04.sql | 1109802,6 | 942,6 | 3066 | 0 | 16 | 16 | 18 | 1 | 51 |
| 18 | Kulczynski_Przemyslaw_v01.sql | 1225069,2 | 983 | 3120 | 0 | 18 | 17 | 19 | 1 | 55 |
| 19 | Grabowska_Katarzyna_v04.sql | 1680515,2 | 1327,6 | 1092 | 0 | 20 | 19 | 16 | 1 | 56 |
| 20 | Pakulski_Maciej_v02.sql | 3367231,6 | 2823,8 | 694 | 0 | 22 | 22 | 15 | 1 | 60 |
| 21 | Sowa_Piotr_v10.sql | 1901548 | 1603 | 6652 | 0 | 21 | 21 | 21 | 1 | 64 |
| 22 | Cerekwicki_Cezary_v01.sql | 1677855 | 1425 | 64485,8 | 2,8 | 19 | 20 | 22 | 22 | 83 |
| 23 | Waluszko_Bartlomiej_v02.sql | - | - | - | - | - | - | - | - | - |
| 24 | Jacewicz_Lukasz_v02.sql | - | - | - | - | - | - | - | - | - |
Legenda:
D – średnie duration
C – średnie CPU
R – średnie reads
W – średnie writes
RD – miejsce w kryterium duration
RC – miejsce w kryterium CPU
RR – miejsce w kryterium reads
RW – miejsce w kryterium writes
T – suma miejsc z wszystkich kryteriów (im mniejsza, tym lepiej)
Test “50”
| Lp | Rozwiązanie | D | C | R | W | RD | RC | RR | RW | T |
| 1 | Gniadkowski_Leszek_v15.sql | 71823,2 | 64,2 | 40 | 0 | 1 | 1 | 1 | 1 | 4 |
| 2 | Gniadkowski_Leszek_v10.sql | 78343,8 | 69,8 | 49 | 0 | 2 | 2 | 2 | 1 | 7 |
| 3 | Gniadkowski_Leszek_v12.sql | 78464 | 73,8 | 49 | 0 | 3 | 3 | 2 | 1 | 9 |
| 4 | Nowakowski_Marcin_v04.sql | 179449,6 | 160,4 | 85 | 0 | 4 | 4 | 4 | 1 | 13 |
| 5 | Sliwa_Krzysiek_v02.sql | 317637,4 | 293,2 | 121 | 0 | 6 | 6 | 6 | 1 | 19 |
| 6 | Poniatowski_Aleksander_v01.sql | 332818,2 | 295,4 | 103 | 0 | 7 | 7 | 5 | 1 | 20 |
| 7 | Przeliorz_Tomek_v02.sql | 201770,8 | 181,4 | 925 | 0 | 5 | 5 | 13 | 1 | 24 |
| 8 | Zmuda_Katarzyna_v01.sql | 414422,8 | 386,2 | 135 | 0 | 8 | 8 | 9 | 1 | 26 |
| 9 | Pater_Rafal_v03.sql | 604693,6 | 544,2 | 132 | 0 | 11 | 11 | 7 | 1 | 30 |
| 10 | Nowakowski_Marcin_v03.sql | 450784,6 | 404,4 | 733 | 0 | 9 | 9 | 12 | 1 | 31 |
| 11 | Gailard_Pawel_v02.sql | 499387,8 | 459 | 366 | 0 | 10 | 10 | 11 | 1 | 32 |
| 11 | Pater_Rafal_v04.sql | 605213,6 | 570,2 | 132 | 0 | 12 | 12 | 7 | 1 | 32 |
| 13 | Grabowska_Katarzyna_v04.sql | 2113640 | 1714,6 | 254,2 | 0 | 15 | 15 | 10 | 1 | 41 |
| 13 | Powichrowski_Marek_v12.sql | 753222 | 589,4 | 1597 | 0 | 13 | 13 | 14 | 1 | 41 |
| 15 | Powichrowski_Marek_v13.sql | 1063860 | 877 | 5019 | 0 | 14 | 14 | 15 | 1 | 44 |
| 16 | Przeliorz_Tomek_v01.sql | 2205305 | 1838,8 | 34441 | 0 | 16 | 16 | 17 | 1 | 50 |
| 17 | Pakulski_Maciej_v03.sql | 7804265,2 | 6686,8 | 27196 | 0 | 19 | 19 | 16 | 1 | 55 |
| 18 | Pakulski_Maciej_v02.sql | 39569582,4 | 36671,4 | 199326 | 0 | 22 | 22 | 21 | 1 | 66 |
| 19 | Sowa_Piotr_v10.sql | 6398825 | 5377,8 | 56028 | 39,8 | 17 | 17 | 18 | 20 | 72 |
| 20 | Kulczynski_Przemyslaw_v01.sql | 11576081,4 | 10360 | 133432 | 29,6 | 20 | 20 | 19 | 19 | 78 |
| 21 | Cerekwicki_Cezary_v01.sql | 7629655,6 | 6561,2 | 598566,4 | 409,6 | 18 | 18 | 22 | 22 | 80 |
| 22 | Kulczynski_Przemyslaw_v04.sql | 11873518,2 | 10476 | 152408 | 41,8 | 21 | 21 | 20 | 21 | 83 |
| 23 | Waluszko_Bartlomiej_v02.sql | - | - | - | - | - | - | - | - | - |
| 24 | Jacewicz_Lukasz_v02.sql | - | - | - | - | - | - | - | - | - |
Test “100”
| Lp | Rozwiązanie | D | C | R | W | RD | RC | RR | RW | T |
| 1 | Gniadkowski_Leszek_v15.sql | 169068,6 | 153,4 | 112 | 0 | 1 | 1 | 1 | 1 | 4 |
| 2 | Gniadkowski_Leszek_v10.sql | 192850,2 | 158,8 | 145 | 0 | 2 | 2 | 2 | 1 | 7 |
| 3 | Gniadkowski_Leszek_v12.sql | 202850,6 | 165,4 | 145 | 0 | 3 | 3 | 2 | 1 | 9 |
| 4 | Nowakowski_Marcin_v04.sql | 364540 | 316,8 | 277 | 0 | 4 | 4 | 4 | 1 | 13 |
| 5 | Poniatowski_Aleksander_v01.sql | 548570,2 | 446,6 | 343 | 0 | 7 | 6 | 7 | 1 | 21 |
| 6 | Sliwa_Krzysiek_v02.sql | 497087,6 | 456,4 | 409 | 0 | 6 | 7 | 8 | 1 | 22 |
| 7 | Przeliorz_Tomek_v02.sql | 411842,6 | 368,2 | 3165 | 0 | 5 | 5 | 14 | 1 | 25 |
| 8 | Pater_Rafal_v03.sql | 1078200,8 | 928,2 | 324 | 0 | 11 | 11 | 5 | 1 | 28 |
| 9 | Gailard_Pawel_v02.sql | 834646,8 | 767,4 | 673 | 0 | 9 | 9 | 11 | 1 | 30 |
| 9 | Pater_Rafal_v04.sql | 1123663,2 | 949,6 | 324 | 0 | 12 | 12 | 5 | 1 | 30 |
| 9 | Zmuda_Katarzyna_v01.sql | 909931 | 813,6 | 423 | 0 | 10 | 10 | 9 | 1 | 30 |
| 12 | Nowakowski_Marcin_v03.sql | 804165 | 530,4 | 464,2 | 0,2 | 8 | 8 | 10 | 13 | 39 |
| 13 | Grabowska_Katarzyna_v04.sql | 3773755 | 3151,2 | 734,4 | 0 | 16 | 16 | 12 | 1 | 45 |
| 14 | Pakulski_Maciej_v03.sql | 1716357,2 | 1425,4 | 736,8 | 0,6 | 13 | 13 | 13 | 14 | 53 |
| 15 | Powichrowski_Marek_v12.sql | 1990753 | 1704,4 | 23022 | 32 | 14 | 15 | 15 | 15 | 59 |
| 16 | Powichrowski_Marek_v13.sql | 2326372,4 | 1690,6 | 23814,6 | 32 | 15 | 14 | 16 | 15 | 60 |
| 17 | Przeliorz_Tomek_v01.sql | 12467972,4 | 11131,4 | 266163 | 78 | 17 | 17 | 18 | 18 | 70 |
| 18 | Sowa_Piotr_v10.sql | 27219956 | 25120,2 | 304784 | 411,8 | 18 | 18 | 19 | 20 | 75 |
| 19 | Pakulski_Maciej_v02.sql | 72426161,8 | 68060,4 | 522223 | 52 | 20 | 20 | 21 | 17 | 78 |
| 20 | Kulczynski_Przemyslaw_v01.sql | 73221107 | 68773,2 | 239710,4 | 308,2 | 22 | 22 | 17 | 19 | 80 |
| 21 | Cerekwicki_Cezary_v01.sql | 40562959,2 | 37802,4 | 2496637,8 | 3024 | 19 | 19 | 22 | 22 | 82 |
| 22 | Kulczynski_Przemyslaw_v04.sql | 73103680,2 | 68496,4 | 322134,4 | 458,6 | 21 | 21 | 20 | 21 | 83 |
| 23 | Waluszko_Bartlomiej_v02.sql | - | - | - | - | - | - | - | - | - |
| 24 | Jacewicz_Lukasz_v02.sql | - | - | - | - | - | - | - | - | - |
Dla każdego rozwiązania przy każdym teście uzyskałem sumę pozycji w poszczególnych kryteriach (ostatnia kolumna wg której ustalałem kolejność rozwiązań w powyższych tabelach wynikowych dla poszczególnych testów). Do uzyskania pozycji w końcowej tabeli wynikowej zsumowałem te wartości ze wszystkich trzech testów i tak wyszła mi tabela końcowa konkursu:
| Lp | Rozwiązanie | T20 | T50 | T100 | Total |
| 1 | Gniadkowski_Leszek_v15.sql | 4 | 4 | 4 | 12 |
| 2 | Gniadkowski_Leszek_v10.sql | 7 | 7 | 7 | 21 |
| 3 | Gniadkowski_Leszek_v12.sql | 9 | 9 | 9 | 27 |
| 4 | Nowakowski_Marcin_v04.sql | 18 | 13 | 13 | 44 |
| 5 | Sliwa_Krzysiek_v02.sql | 30 | 19 | 22 | 71 |
| 6 | Przeliorz_Tomek_v02.sql | 24 | 24 | 25 | 73 |
| 7 | Poniatowski_Aleksander_v01.sql | 33 | 20 | 21 | 74 |
| 8 | Zmuda_Katarzyna_v01.sql | 25 | 26 | 30 | 81 |
| 9 | Pater_Rafal_v03.sql | 31 | 30 | 28 | 89 |
| 10 | Pater_Rafal_v04.sql | 34 | 32 | 30 | 96 |
| 11 | Nowakowski_Marcin_v03.sql | 30 | 31 | 39 | 100 |
| 12 | Gailard_Pawel_v02.sql | 44 | 32 | 30 | 106 |
| 13 | Powichrowski_Marek_v12.sql | 19 | 41 | 59 | 119 |
| 14 | Powichrowski_Marek_v13.sql | 37 | 44 | 60 | 141 |
| 15 | Grabowska_Katarzyna_v04.sql | 56 | 41 | 45 | 142 |
| 16 | Pakulski_Maciej_v03.sql | 48 | 55 | 53 | 156 |
| 17 | Przeliorz_Tomek_v01.sql | 38 | 50 | 70 | 158 |
| 18 | Pakulski_Maciej_v02.sql | 60 | 66 | 78 | 204 |
| 19 | Sowa_Piotr_v10.sql | 64 | 72 | 75 | 211 |
| 20 | Kulczynski_Przemyslaw_v01.sql | 55 | 78 | 80 | 213 |
| 21 | Kulczynski_Przemyslaw_v04.sql | 51 | 83 | 83 | 217 |
| 22 | Cerekwicki_Cezary_v01.sql | 83 | 80 | 82 | 245 |
| 23 | Waluszko_Bartlomiej_v02.sql | - | - | - | - |
| 24 | Jacewicz_Lukasz_v02.sql | - | - | - | - |
Legenda:
T20 – suma miejsc z testu “20”
T50 – suma miejsc z testu “50”
T100 – suma miejsc z testu “100”
Total – suma miejsc ze wszystkich testów
A zatem… Jednogłośnym zwycięzcą konkursu ogłaszam Leszka Gniadkowskiego. Drugie miejsce wśród uczestników (choć Leszek zdominował konkurs totalnie) zajął Marcin Nowakowski, a trzecie – Krzysztof Śliwa. Postanowiłem też nagrodzić miejsca 4. i 5. – a więc Tomka Przeliorza oraz Aleksandra Poniatowskiego. Ze zwycięzcami będę kontaktował się indywidualnie drogą mailową.
Dziękuję wszystkim, którzy wzięli udział w moim konkursie. Wszyscy, którzy zakwalifikowali się do finału oprócz słów uznania otrzymają ode mnie mały prezent (szczegóły niebawem w mailu). Szczególnie gratuluję zwycięzcom. Dobra SQL-owa robota :-)
Tym samym konkurs uznaję za zamknięty. Dla wytrwałych i ciekawskich publikuję pełen zestaw rozwiązań finałowych w pliku ZIP.
[PL] Konkurs T-SQL – Lista finalistów
Oct 4th

Parę minut temu zamknąłem listę finalistów konkursu T-SQL “Liga piłkarska”. Do finału dostały się poniższe rozwiązania:
Cerekwicki_Cezary_v01.sql
Gailard_Pawel_v02.sql
Gniadkowski_Leszek_v10.sql
Gniadkowski_Leszek_v12.sql
Gniadkowski_Leszek_v15.sql
Grabowska_Katarzyna_v04.sql
Jacewicz_Lukasz_v02.sql
Kulczynski_Przemyslaw_v01.sql
Kulczynski_Przemyslaw_v04.sql
Nowakowski_Marcin_v03.sql
Nowakowski_Marcin_v04.sql
Pakulski_Maciej_v02.sql
Pakulski_Maciej_v03.sql
Pater_Rafal_v03.sql
Pater_Rafal_v04.sql
Poniatowski_Aleksander_v01.sql
Powichrowski_Marek_v12.sql
Powichrowski_Marek_v13.sql
Przeliorz_Tomek_v01.sql
Przeliorz_Tomek_v02.sql
Sliwa_Krzysiek_v02.sql
Sowa_Piotr_v10.sql
Waluszko_Bartlomiej_v02.sql
Zmuda_Katarzyna_v01.sql
Gratuluję finalistom i dziękuję wszystkim osobom, które wzięły udział w konkursie. Najdalej w środę wieczór powinny ukazać się wyniki konkursu, o czym poinformuję też uczestników drogą mailową.
[PL] Konkurs T-SQL – liga piłkarska
Sep 19th
Obiecałem, że jak tylko będę miał możliwość, zorganizuję konkurs T-SQL inspirowany cyklicznymi konkursami T-SQL Challenge. I słowa dotrzymuję :-)
Dane wejściowe
Dane są dwie tabele o strukturach, jak poniżej:
Tabela dbo.Teams:
TeamId TeamName
----------- --------------------
1 Poland
2 San Marino
3 Ivory Coast
4 Luxemburg
Tabela dbo.Games:
HomeId VisitorId HomeGoals VisitorGoals
----------- ----------- ----------- ------------
1 2 0 0
1 3 2 0
1 4 1 0
2 1 1 1
2 3 1 1
2 4 2 1
3 1 2 0
3 2 1 0
3 4 0 1
4 1 0 1
4 2 0 0
4 3 2 0
Tabela dbo.Teams zawiera identyfikatory (TeamId) oraz nazwy (TeamName) drużyn piłkarskich rywalizujących ze sobą na zasadzie klasycznej ligi (każdy z każdym po dwa mecze – mecz u siebie i mecz na wyjeździe). Tabela dbo.Games zawiera wyniki meczów – identyfikator drużyny gospodarzy (HomeId), identyfikator drużyny gości (VisitorId), liczbę bramek strzelonych przez gospodarzy (HomeGoals) oraz liczbę bramek strzelonych przez gości (VisitorGoals).
Opis zadania
- Wynikiem działania zapytania stworzonego w ramach konkursu ma być tabela wyniku rywalizacji drużyn zawierająca kolumny:- Position – pozycja drużyny w tabeli – nie ma miejsc ex-aequo,- Team – nazwa drużyny,- P – liczba rozegranych przez drużynę spotkań,- W – liczba zwycięstw drużyny,- D – liczba remisów drużyny,- L – liczba porażek drużyny,- F – liczba bramek zdobytych przez drużynę,- A – liczba bramek straconych przez drużynę,- Points – liczba punktów zdobytych przez drużynę zgodnie z regułą: 3 punkty za zwycięstwo, 1 punkt za remis oraz 0 punktów za porażkę.
- O kolejności drużyn w tabeli decydują kolejno:- liczba punktów – im więcej, tym lepiej,- różnica między bramkami strzelonymi a straconymi – im większa, tym lepiej,- liczba bramek strzelonych – im większa, tym lepiej,- liczba bramek straconych – im mniejsza, tym lepiej,- tabela wyników bezpośrednich spotkań – jeśli dwie lub więcej drużyn mają taką samą pozycję w oparciu o powyższe kryteria, o kolejności decyduje tabela wyników zbudowana wyłącznie o wyniki bezpośredniej rywalizacji między zainteresowanymi drużynami (i stosujemy w tej tabeli takie same kryteria, jak powyżej – czyli zaczynamy od punktów, potem bramki etc.), w tabeli tej bramki strzelone na wyjazdach liczymy podwójnie (ale do liczenia punktów oczywiście bramki liczymy normalnie, bez podwajania tych strzelonych na wyjazdach),- jeżeli dwie lub więcej drużyn po zastosowaniu powyższych kryteriów kwalifikują się do zajęcia tego samego miejsca, o kolejności decyduje TeamId – zespół o mniejszym TeamId w tabeli znajdzie się przed zespołem o większym TeamId (załóżmy, że TeamId to miejsce w rankingu federacji piłkarskiej).
Oczekiwany wynik
Position Team P W D L F A Points -------- ----------- - - - - - - ------ 1 Poland 6 3 2 1 5 3 11 2 San Marino 6 1 4 1 4 4 7 3 Luxemburg 6 2 1 3 4 4 7 4 Ivory Coast 6 2 1 3 4 6 7
Skypt generujący przykładowe dane
Skrypt do wygenerowania przykładowych danych:
IF OBJECT_ID(N'dbo.Games', 'U') IS NOT NULL DROP TABLE dbo.Games; IF OBJECT_ID(N'dbo.Teams', 'U') IS NOT NULL DROP TABLE dbo.Teams; CREATE TABLE dbo.Teams ( TeamId int NOT NULL, TeamName varchar(20) NOT NULL ); CREATE TABLE dbo.Games ( HomeId int NOT NULL, VisitorId int NOT NULL, HomeGoals int NOT NULL, VisitorGoals int NOT NULL ); INSERT INTO dbo.Teams (TeamId, TeamName) VALUES (1, 'Poland'); INSERT INTO dbo.Teams (TeamId, TeamName) VALUES (2, 'San Marino'); INSERT INTO dbo.Teams (TeamId, TeamName) VALUES (3, 'Ivory Coast'); INSERT INTO dbo.Teams (TeamId, TeamName) VALUES (4, 'Luxemburg'); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (1, 2, 0, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (1, 3, 2, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (1, 4, 1, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (2, 1, 1, 1); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (2, 3, 1, 1); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (2, 4, 2, 1); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (3, 1, 2, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (3, 2, 1, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (3, 4, 0, 1); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (4, 1, 0, 1); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (4, 2, 0, 0); INSERT INTO dbo.Games (HomeId, VisitorId, HomeGoals, VisitorGoals) VALUES (4, 3, 2, 0);
Zasady konkursu
- Rozwiązaniem ma być pojedyncze zapytanie T-SQL rozpoczynające się od słowa “SELECT”, “WITH” lub “;WITH”.
- W zapytaniu można używać podzapytań i wszystkich elementów języka T-SQL dostępnych w SQL Server 2008 R2.
- W zapytaniu można użyć tabeli liczb, której definicja jest podana tutaj. W skrypcie nie umieszczaj definicji tabeli liczb (załóż, że będzie ona dostępna w bazie testowej).
- Zapytania, które przejdą próbę poprawności zwracanego wyniku (testy będą prowadzone na nieco większej ilości danych), będą klasyfikowane wg następujących kryteriów: czas wykonania (duration), zużycie procesora (CPU), ilość odczytów (reads) oraz ilość zapisów (writes). Zwycięży rozwiązanie, które łącznie zdobędzie najwięcej punktów we wszystkich czterech kryteriach.
- Rozwiązanie (możesz ich wysłać więcej niż jedno) wyślij mailem w postaci skryptu o rozszerzeniu .sql na adres: pawel.potasinski[małpa]sqlpass.org. W tytule maila wpisz “Konkurs T-SQL”. Otrzymasz ode mnie potwierdzenie (e-mail), jeżeli otrzymam od Ciebie rozwiązanie.
- W razie pytań lub uwag użyj podanego powyżej adresu e-mail lub dodaj komentarz do tego wpisu.
- Na rozwiązania czekam do 3 października 2010 do końca dnia. Ogłoszenie wyników przewiduję najdalej tydzień później.
- Konkurs w całości organizuję sam (sam wymyśliłem zadanie, sam będę testował rozwiązania, sam przyznawał nagrody etc.), a co za tym idzieTwoje ewentualne dane osobowe oglądam wyłącznie ja – Paweł Potasiński (konkurs nie ma sponsorów).
Nagrody
Nagrody to prawdopodobnie najmniej istotna część konkursu, ale chyba dobrze wiedzieć, o co walczysz :-)
1. miejsce – subskrypcja MSDN + dysk przenośny 2,5 cala o pojemności 500 GB
2. miejsce – subskrypcja MSDN
3. miejsce – książka pt. “Serwer SQL 2008. Usługi biznesowe. Analiza i eksploracja danych” z autografem Marcina Szeligi
PS. Zastrzegam sobie prawo do zmiany zestawu nagród bez uprzedzenia – np. w sytuacji, gdy uznam, że należy wyróżnić więcej niż 3 uczestników konursu :-)
Jest o co walczyć? Myślę, że tak! A i tak nie ma to jak satysfakcja z samego działającego rozwiązania! ;-)
Powodzenia i czekam na Wasze rozwiązania!
[EDYCJA: 2010-09-20]
Na prośbę uczestników i osób postronnych załączam bardziej rzeczywiste dane testowe: Primera Division 2009/2010. Visca el Barca!
[/EDYCJA]
[EDYCJA: 2010-09-21]
Udostępniam zestaw danych, który powinien pomóc Wam w przetestowaniu Waszych rozwiązań pod kątem poprawności algorytmu sortowania tabeli wynikowej. Grupa śmierci normalnie :-)
[/EDYCJA]
[EDYCJA: 2010-09-22]
Zmyłka ;-) Dzisiejszy alarm podniesiony przeze mnie po interwencji Marka Powichrowskiego (ech, mąciwoda!) okazał się fałszywy. Oczekiwany wynik we wpisie jest OK. W tym miejscu dziękuję Leszkowi Gniadkowskiemu za to, że nie dał się zasugerować ani Markowi, ani mnie, i podjął własne śledztwo :-) Walczymy dalej! Póki co zanotowałem ledwie 4 uczestników. Czyżby wszyscy czytelnicy mojego bloga mieli już własne subskrypcje MSDN i przenośne dyski 500 GB??? ;-)
[/EDYCJA]
[EDYCJA: 2010-09-26 {BASIC TESTING}]
Przeprowadziłem test basic na wszystkich rozwiązaniach, które dotąd otrzymałem. Poniżej rozwiązania, które przeszły test, a zarazem zwróciły poprawne wyniki dla kilku prostych zestawów danych (darujcie brak polskich liter w nazwiskach):
Gniadkowski_Leszek_v05.sql
Gniadkowski_Leszek_v06.sql
Gniadkowski_Leszek_v07.sql
Gniadkowski_Leszek_v09.sql
Gniadkowski_Leszek_v10.sql
Gniadkowski_Leszek_v12.sql
Grabowska_Katarzyna_v02.sql
Jacewicz_Lukasz_v01.sql
Pakulski_Maciej_v01.sql
Poniatowski_Aleksander_v01.sql
Powichrowski_Marek_v07.sql
Powichrowski_Marek_v10.sql
Przeliorz_Tomek_v01.sql
Waluszko_Bartlomiej_v01.sql
Każdy pewnie wie, ile wersji wysyłał, więc nie powinniście mieć problemów z odnalezieniem tych właściwych :-) Gratuluję tym sześciu osobom, którym się udało, a tych, którzy nie dali rady lub jeszcze nie nadesłali swoich rozwiązań (?), zachęcam do działania. Czasu jeszcze jest sporo ;-) Wszelkich odpowiedzi na Wasze pytania udzielam indywidualnie na maila. Test na “tricky data” już niebawem. Stay tuned!
[/EDYCJA]
[EDYCJA: 2010-09-28 {BASIC TESTING UPDATE}]
Poniżej lista rozwiązań, które pomyślnie przeszły basic testing do dzisiaj (28.09):
Cerekwicki_Cezary_v01.sql
Gniadkowski_Leszek_v05.sql
Gniadkowski_Leszek_v06.sql
Gniadkowski_Leszek_v07.sql
Gniadkowski_Leszek_v09.sql
Gniadkowski_Leszek_v10.sql
Gniadkowski_Leszek_v12.sql
Gniadkowski_Leszek_v13.sql
Grabowska_Katarzyna_v02.sql
Jacewicz_Lukasz_v01.sql
Nowakowski_Marcin_v01.sql
Pakulski_Maciej_v01.sql
Pater_Rafal_v03.sql
Poniatowski_Aleksander_v01.sql
Powichrowski_Marek_v07.sql
Powichrowski_Marek_v10.sql
Powichrowski_Marek_v11.sql
Przeliorz_Tomek_v01.sql
Rozycki_Grzegorz_v01.sql
Sowa_Piotr_v05.sql
Sowa_Piotr_v06.sql
Waluszko_Bartlomiej_v01.sql
[/EDYCJA]
[EDYCJA: 2010-09-29 {TRICKY DATA}]
Panie i Panowie, zaczynamy tricky data testing! Poniżej oddaję w Wasze ręce kolejny zestaw spreparowanych wyników. Tym razem ex-aequo jest sporo i trzeba mieć w kodzie odpowiedzi na wiele pułapek. Sprawdziłem nadesłane do dziś rozwiązania i z niekrytą satysfakcją oznajmiam, że 17 rozwiązań stworzonych przez 9 zawodników spełniło rygorystyczne wymogi tego testu :-) Poniżej lista szczęśliwców. Niewykluczone, że wymyślę jeszcze jakiś zestaw testowy, by dokładnie sprawdzić, czy mnie nie nabieracie w swoich “dziełach sztuki SQL-owej” ;-)
Cerekwicki_Cezary_v01.sql
Gniadkowski_Leszek_v07.sql
Gniadkowski_Leszek_v09.sql
Gniadkowski_Leszek_v10.sql
Gniadkowski_Leszek_v12.sql
Gniadkowski_Leszek_v13.sql
Gniadkowski_Leszek_v15.sql
Grabowska_Katarzyna_v02.sql
Nowakowski_Marcin_v01.sql
Pater_Rafal_v03.sql
Powichrowski_Marek_v07.sql
Powichrowski_Marek_v10.sql
Powichrowski_Marek_v11.sql
Przeliorz_Tomek_v01.sql
Sowa_Piotr_v05.sql
Sowa_Piotr_v06.sql
Waluszko_Bartlomiej_v01.sql
*** Pobierz zestaw danych “tricky data” ***
[/EDYCJA]
[EDYCJA: 2010-09-29 {TRICKY DATA} ]
WAŻNE!!! W tabeli dbo.Teams mogą znaleźć się drużyny, które nie rozegrały żadnego spotkania (ich identyfikatory nie występują w dbo.Games). W takiej sytuacji drużyny te mają pojawić się w tabeli wynikowej z zerami w odpowiednich kolumnach i z zachowaniem kolejności zgodnie z podanym algorytmem (czyli po prostu decyduje ranking). A jeśli takich drużyn bez rozegranego meczu jest więcej niż jedna, o ich kolejności decyduje pozycja w rankingu (TeamId).
Na razie żadne (!) z nadesłanych przez Was rozwiązań nie spełnia tej reguły, więc proszę o szybkie poprawienie kodu!
Zmieniłem w związku z tym ostatnio zamieszczony zestaw TRICKY DATA.
Poniżej będę publikował aktualną listę rozwiązań, które pomyślnie przeszły basic + tricky data test.
Cerekwicki_Cezary_v01.sql
Gailard_Pawel_v02.sql
Gniadkowski_Leszek_v10.sql
Gniadkowski_Leszek_v12.sql
Gniadkowski_Leszek_v15.sql
Grabowska_Katarzyna_v04.sql
Jacewicz_Lukasz_v02.sql
Kulczynski_Przemyslaw_v01.sql
Kulczynski_Przemyslaw_v04.sql
Nowakowski_Marcin_v03.sql
Nowakowski_Marcin_v04.sql
Pakulski_Maciej_v02.sql
Pakulski_Maciej_v03.sql
Pater_Rafal_v03.sql
Pater_Rafal_v04.sql
Poniatowski_Aleksander_v01.sql
Powichrowski_Marek_v12.sql
Powichrowski_Marek_v13.sql
Przeliorz_Tomek_v01.sql
Przeliorz_Tomek_v02.sql
Sliwa_Krzysiek_v02.sql
Sowa_Piotr_v10.sql
Waluszko_Bartlomiej_v02.sql
Zmuda_Katarzyna_v01.sql
[/EDYCJA]
[PL] Moje wrażenia z 1st Silesian Code Camp
Sep 12th
Wczoraj spędziłem cały dzień w Katowicach na pierwszej w historii konferencji Silesian Code Camp zorganizowanej przez Śląską Regoinalną Grupę Microsoft (ŚRGM). Czy warto było jechać na Śląśk? Przedstawiam moje wrażenia z konferencji.
Początek konferencji to przywitanie uczestników i prelegentów w wykonaniu Damiana Widery (SQL Server MVP), jednego z liderów ŚRGM i PLSSUG Katowice. Damian w zabawnym stylu wprowadził wszystkich w dobry nastrój i opowiedział o genezie wydarzeń z serii Code Camp oraz o ideach przyświecających grupom pasjonackim w Polsce. Potem było już samo mięsko, czyli cztery sesje techniczne. A zatem po kolei…
–
Sesja nr 1 – Programowanie predykcyjne (prelegenci: Marcin Szeliga i Daniel Dudek)
Jak może wyglądać sesja prowadzona przez duet – wybitnego specjalistę d/s baz danych (nie tylko relacyjnych) oraz zaprawionego w bojach programistę aplikacji mobilnych? Marcin Szeliga (SQL Server MVP) i Daniel Dudek nie pozostawili nikomu z obecnych wątpliwości, że taki duet może poprowadzić prezentację ciekawie i na luzie. Doświadczenie Marcina było widać gołym okiem. Daniel dopiero “dociera się” jako prelegent i – moim zdaniem – jeszcze musi trochę popracować nad warsztatem, ale i tak było widać, że pod okiem mistrza (Marcin to wg mnie jeden z lepszych prelegentów w kraju) nabiera pewności siebie i zdobywa szlify jako mówca. Na początku ich sesji trochę się bałem, że pójdą na łatwiznę i pokażą coś oklepanego i bazującego na gotowych i dobrze znanych kontrolkach (sugerowały to pierwsze dema). Na szczęście szybko przekonałem się, że obaj prelegenci wykonali kawał dobrej roboty szykując naprawdę ciekawe dema (zwłaszcza wykrywanie nieprawidłowych wartości atrybutów w aplikacji .NET i “inteligentna wstążka” były przykładami naprawdę efektownymi i oryginalnymi). I już za ten wysiłek oceniam ich prezentację bardzo wysoko. Prosty kod .NET, próba przekonania słuchaczy (chyba udana!), że DMX jest relatywnie prostym językiem, przejrzyste aplikacje – to sprawiło, że Marcina i Daniela oglądałem z dużą przyjemnością.
Ocena sesji: 9/10
–
Sesja nr 2 – Czy jesteśmy gotowi na SQL Azure? (prelegent: Tobiasz Koprowski)
Nie ukrywam, że tej sesji bałem się jak ognia. Po pierwsze z uwagi na to, że Tobiasz dostał propozycję wystąpienia na konferencji stosunkowo niedawno, gdy okazało się, że Paula Januszkiewicz do Katowic nie może przyjechać. Po drugie, z uwagi na tematykę. Azure – “chmura”… No właśnie. Nie, żebym wydał wyrok na tę technologię i z góry skazywał ją na porażkę, ale pokazywanie technologii powszechnie uważanej za raczkującą i – póki co – oferującą niewiele możliwości, zawsze jest ryzykowne. Jak dla mnie, Tobiasz dał radę. Dał radę jako prelegent w miarę spokojnie i płynnie poprowadzić prezentację mimo problemów technicznych (woooolno działające połączenie sieciowe). Natomiast kompletnie nie dał rady przekonać mnie (i chyba kogokolwiek), że Azure to obecnie coś więcej niż piękne (?) marzenie. Może byłoby to możliwe, gdyby na wszelki wypadek nagrał sobie przed wystąpieniem demonstracje w postaci filmów. Ale tak naprawdę, to sam nie wiem. Z prezentacji Tobiasza biło po oczach jedno – SQL Azure ma milion ograniczeń i… w zasadzie nie widzę, by dawało cokolwiek w zamian za poświęcenie czasu na poznanie technologii z jej wszystkimi ograniczeniami i uwarunkowaniami (także umownymi i licencyjnymi), za wystawienie danych gdzieś w siną dal, za dokonane opłaty. Jeżeli firma Microsoft chce lansować Azure, chyba lepiej byłoby, gdyby prezentacje na temat “chmury” prowadził ktoś z pracowników korporacji. I szczerze mówiąc, byłem zdziwiony brakiem obecności kogokolwiek z Microsoft Polska na konferencji. Nawet nie tylko dlatego, że mówiono o Azure (podobno włożenie w agendę sesji o Azure było warunkiem otrzymania sponsoringu od Microsoftu???). Bardziej dlatego, że była to jak dotąd największa w tym roku kalendarzowym społecznościowa impreza, w czasie której mówiono praktycznie tylko o technologiach Microsoftu. Czyżby Microsoft w Polsce przestał dostrzegać sens wspierania społeczności? Albo może wyolbrzymiam i trzeba mnie wyprowadzić z błędu?
Ocena sesji: 5/10 (mimo problemów Tobiasz dał radę, było zabawnie, ale duży minus dla Microsoft Polska za nieobecność na konferencji)
–
Sesja nr 3 – Dotknij Windows (prelegent: Szymon Kobalczyk)
Czego można się spodziewać, gdy na konferencję jako prelegent przyjeżdża Szymon Kobalczyk (MVP)? Widziałem już pudełka po butach, które w rękach Szymona działały niczym Microsoft Surface. Widzałem zakręcone kontrolery zbudowane z rękawiczek. Co było tym razem? Tym razem Szymon postawił na pełen profesjonalizm ;-) Przywiózł ze sobą kilka ekranów dotykowych i na żywo w bardzo efektownych demonstracjach pokazywał aplikacje dla urządzeń reagujących na dotyk. Przyznaję, że moim oczekiwaniem była właśnie prezentacja ogólna, z niekoniecznie wielką ilością kodu, ale za to z efektami “WOW” i wyjaśnieniami, jak te wszystkie zabawki działają. I dostałem od Szymona to, co chciałem zobaczyć. Po ekranie latały zdjęcia, kulki, buttony i inne elementy interfejsu. Szymon dotykał, przesuwał, macał ;-), rozśmieszał i (jak zwykle) zarażał swoją pasją. Było wszystko, co sprawia, że człowiek nie męczy się słuchając prezentera i ma wrażenie, że prelegent pokazuje coś, co po pierwsze doskonale zna i rozumie, a po drugie – co kocha. Bardzo fajna sesja, a i wyjaśnienie filozofii aplikacji dotykowych bardzo przypadło mi do gustu. Mój wielki szacunek dla Szymona za tę prezentację. Chcę takich więcej w przyszłości.
Ocena sesji: 10/10 (dla mnie TOP 1 konferencji)
–
Sesja nr 4 – Dziel i zwyciężaj, czyli o architekturze CQRS słów kilka (prelegent: Szymon Pobiega)
Przyznaję, że temat poruszony przez kolejnego Szymona z Krakowa, Szymona Pobiegę, był mi kompletnie obcy (po pierwsze dlatego, że nie jestem architektem, po drugie z uwagi na moją nieaktualną wiedzę o projektowaniu i implementowaniu aplikacji i systemów w technologii .NET). Niemniej jednak wytrwałem i tę prezentację. I muszę powiedzieć, że miejscami była ona bardzo ciekawa. Podobało mi się między innymi bardzo przejrzyste wyjaśnianie jasnych i ciemnych stron wybranych podejść do projektowania aplikacji (m.in. bardzo ładnie Szymon pokazał metodę testowania opartą o założenie, że nie przeprowadzamy całego procesu, a startujemy w pewnym zadanym stanie). I choć w pewnych sprawach Szymon nie przekonał mnie do prezentowanego podejścia (opartego o rejestrowanie zdarzeń), to i tak odnosiłem wrażenie, że ten człowiek wie, o czym mówi i mówi o tym z dużym przekonaniem (i bez wątpienia z bagażem doświadczeń). Brakowało może takiej “kropki nad i”, która pokazałaby – “zobaczcie, to podejście zostało użyte w tej aplikacji i przyniosło w tym, tym i tamtym miejscu takie korzyści”. Ale sesja zdecydowanie na plus.
Ocena sesji: 8/10 (za to, że przykłady były dostosowane nawet dla laików oraz za pewność siebie i – w większości odpowiedzi – rzeczowe argumenty)
–
Jak oceniam konferencję? Wystawiam jej ocenę 8/10. Osobiście żałuję, że nie było na niej Pauli Januszkiewicz, ponieważ bardzo chciałem zobaczyć ją “w akcji” (a dotąd mi się nie udało obejrzeć ani jednej jej prezentacji “live”). Organizatorzy stanęli na wysokości zadania – była atmosfera “geek’owska”, smakowita pizza i cola (kalorie w tej ilości? na moją dietę?!), ciekawe prezentacje. I na koniec trochę prywaty – do domu wróciłem bogatszy w dwa gadżety: książkę autorstwa Marcina Szeligi i Danuty Mendrali pt. “Serwer SQL 2008. Usługi Biznesowe. Analiza i Eksploracja Danych” zasponsorowaną przez wydawnictwo Helion (egzemplarz jest unikalny, gdyż zawiera autograf Marcina Szeligi) oraz przenośnym dyskiem 2,5’’ o pojemności 500 GB zasponsorowanym przez firmę Accenture (warto było wypełnić ankietę!). Oba gadżety trafią do puli nagród w konkursie, który już niebawem na moim blogu. W tym miejscu dziękuję mojemu przyjacielowi, Markowi Adamczukowi, za książkę (zdobył ją za aktywność w czasie pierwszej sesji i przekazał mi na potrzeby konkursu) i wspólną podróż w obie strony :-)
Gratuluję ŚRGM dobrej organizacji. Mi się podobało. Za rok, jak zrobicie 2nd Silesian Code Camp, też postaram się do Was przyjechać!
[PL] VirtualStudy Conference 2010 – nagranie z mojej sesji dostępne
Sep 9th
Dzisiaj na portalu VirtualStudy.pl pojawiło się nagranie z mojej prezentacji pt. “Darmowe aplikacje wspierające rozwiązywanie problemów wydajnościowych w SQL Server 2008”, którą poprowadziłem w ramach konferencji wirtualnej VirtualStudy Conference 2010. Aby zobaczyć nagranie, trzeba zarejestrować się na portalu i mieć zainstalowaną wtyczkę Silverlight. Życzę przyjemnego oglądania. Poniżej podaję też odnośnik do materiałów do tej prezentacji.
[PL] Wywiad – nasi na TSQL Challenges
Sep 1st
Jakiś czas temu wysłałem rozwiązanie jednej z zagadek Itzika Ben-Gana z serii “T-SQL Puzzle” (zagadki były publikowane na witrynie SQL Server Magazine). Wtedy pomyślałem, że byłoby fajnie, gdyby takie zagadki / konkursy, w których uczestnicy mogliby poćwiczyć szare komórki i rozwijać umiejętności programowania w T-SQL, były organizowane częściej. I oto, za jakiś czas trafiłem na witrynę ByeondRelational.com prowadzoną przez Jacoba Sebastiana (SQL Server MVP) i kilku innych SQL-owych zapaleńców.
Jednym z działów BeyondRelational.com (oprócz licznych blogów i forum) jest dział TSQL Challenges. Czym są TSQL Challenges (dalej używam skrótu TC)? Są to konkursy polegające na rozwiązywaniu problemów za pomocą zapytań w języku T-SQL (nowe zadanie jest ogłaszane raz na dwa tygodnie). Udział może wziąć każdy, kto ma na to ochotę (i zarejestruje się na portalu BeyondRelational.com). Zazwyczaj zadania wymagają rozwiązania postawionego problemu jednym zapytaniem SELECT (choć na ogół dopuszczalne jest używanie podzapytań i CTE), bez użycia tabel tymczasowych i dynamicznego kodu T-SQL. Zwycięża ten uczestnik, który podeśle rozwiązanie generujące poprawny wynik, spełniające podane wymagania i o najlepszych statystykach (liczy się nie tylko czas wykonania, ale także zużycie CPU oraz ilość odczytów i zapisów). Więcej o samych TSQL Challenges i o możliwości nadsyłania własnych propozycji zadań konkursowych czytaj tu: Submit a TSQL Challenge Idea.
Zabawa jest przednia. Sam spróbowałem. Wysłałem nawet ze trzy rozwiązania zadań, ale z uwagi na to, że jak dotąd nie dałem się wciągnąć na dobre w zabawę (co by to było, jakbym jeszcze w TC dał się wciągnąć :-P), moje próby kończą się w przedbiegach po wysłaniu pierwszego rozwiązania, które uznam za “good enough” (a to jest zdecydowanie za mało na takich zawodników, jacy wysyłają swoje rozwiązania na TC) :-) Co lepsi zawodnicy nadsyłają po kilka rozwiązań wymyślając takie rozwiązania, z których można się uczyć wszystkiego, co potrzebne programiście SQL Servera: od algorytmów, przez optymalizację, aż po wymyślne chwyty do zastosowania w kodzie T-SQL. Co ciekawe, jest też wersja “light” konkursu przeznaczona dla początkujących adeptów sztuki programowania w T-SQL – TSQL Beginners Challenges.
Wśród najlepszych uczestników zabawy w “dorosłe” TC znaleźć można kilku Polaków. Dwóch z nich zaprosiłem do rozmowy o TC. Zgodzili się (dzięki, chłopaki!), a zapis wywiadu znajdziesz poniżej.
–
Moimi rozmówcami są Leszek Gniadkowski (w wywiadzie jako LG) oraz Marek Powichrowski (w wywiadzie jako MP).
Leszek zawodowo pracuje jako członek zespołu administrującego dosyć dużą domeną Active Directory. Specjalizuje się w systemach opartych na MS Windows, choć ma do czynienia również z innymi OS przy okazji integracji AD z usługami opartymi na *NIX/Linux.
Marek zawodowo pracuje jako programista i konsultant systemów ERP. Specjalizuje się w projektowaniu baz danych, głównie SQL Server. Pisze aplikacje w .NET, nie unika ASP.NET. Lubi projektować sałatki śledziowe i piec chleb na własnym zakwasie.
–
PP: Witajcie. Na początek gratulacje na okazję Waszych sukcesów w konkursach TSQL Challenges!
LG: Witam, dziękujemy, szczęśliwie trwa passa (przyp. PP – Leszek jest ex aequo pierwszy w rankingu TC!) , największym sukcesem jest jednak sama wiedza nabyta przy udziale w TC.
MP: Dzięki, to miłe. Na razie mam 13 SQL Stars i mogę już sobie zrobić T-Shirt’a z logo „TSQL Challenges Winner” :-) A i jeszcze mogę sobie wydrukować certyfikat potwierdzający ten fakt. To takie drobiazgi, ale miłe.
PP: Skąd dowiedzieliście się o konkursach TSQL Challenges i witrynie beyondrelational.com?
LG: W moim przypadku z forum portalu WSS. Dokładniej stąd. Od czasu umieszczenia tego wątku (trwał wtedy TC20), rozpocząłem naukę TSQL i próbowałem sił w następnych TC.
MP: W moim przypadku było dokładnie tak samo. Tamto zadanie zelektryzowało całe forum SQL Server na WSS.pl. Interesujące było to, że trzeba to rozwiązać w jednym zapytaniu. Pamiętam, że podobny problem rzucił kiedyś Maciej Pilecki. Piękne wyzwanie. Wysłałem swoje rozwiązanie i niejakim szokiem było to, że trzeba długo czekać na wyniki rywalizacji. Ale przeszedłem wszystkie fazy (basic test, tricky data i load test) i ostatecznie byłem sklasyfikowany poza pierwszą 10-tką, ale jak na początek to i tak było coś. Potem była przerwa i Leszek odezwał się do mnie przy zadaniu TC28, które miało bardzo mało zgłoszonych rozwiązań. Mi poszło gładko i przeszło dwie pierwsze fazy testów i kiedy już byłem w „ogródku i już witałem się z gąską” przepadłem w load test. To sparzenie się nakazuje mi teraz przyglądać się baczniej wydajności. Ale co ciekawe, Leszek który wygrał tę odsłonę był tym kompletnie zaskoczony bo wstępne porównania statystyk na naszych danych testowych dawały mi przewagę. Ale dane do load test odwróciły tę relację. Także emocje są do samego końca. Od zadania TC28 wciągnąłem się. Wykonałem jeszcze dwa zadania w tył i byłem wśród zwycięzców i od tej pory nie odpuszczam żadnego zadania.
PP: Co takiego jest w TSQL Challenges, że poświęcacie czas na podejmowanie kolejnych „wyzwań”?
MP: To głód tego pięknego momentu olśnienia, gdy znajduje się rozwiązanie proste, z pięknymi statystykami. To głód tych endorfin, które zalewają człowieka powodując, że wszystko wokoło nagle staje się piękne i nic nie jest w stanie tego zakłócić. A poza tym to świetne zajęcie dla umysłu aby przypadkiem nie zachciałoby mu się spuścić z tonu.
LG: Dobra rozrywka umysłowa, sprawdzanie się, rywalizacja. TC w pewnym stopniu uzależniają. Mix samego języka TSQL i zakręconych zadań to mieszanka gwarantująca intelektualną ucztę. Co do samego czasu, jego większość nie jest spędzona bezpośrednio przy komputerze. Nad zadaniem często myślę przy okazji, w czasie wykonywania dowolnej czynności: jazdy samochodem, posiłku, przed snem itd. Samo kodowanie zajmuje już zwykle mniej czasu.
PP: Jak dużo czasu poświęcacie średnio na stworzenie rozwiązania gotowego do zgłoszenia w konkursie i czy zdarza się, że wysyłacie więcej niż jedno rozwiązanie?
LG: Różnie, od 30 minut do dwóch tygodni na stworzenie rozwiązania, które „działa”. Najczęściej parę godzin. Później pracuje się nad ulepszeniem bądź innym podejściem do problemu podkręcającym statystyki. Zdarzało się, że były TC, do których z braku czasu podchodziłem w ostatni dzień przed terminem zakończenia, poświęcając niedzielę. Czasami wysyłam jedną wersję rozwiązania, czasami dwie i więcej. Natomiast prawie zawsze wysyłam poprawione rozwiązania spamując trochę upload.
MP: Różnie z tym bywa. Niektóre pozornie trudne rozwiązują się błyskawicznie w kilku wersjach. Inne kosztują sporo czasu. Jeżeli mam kilka rozwiązań to oczywiście je wysyłam. Trzeba pamiętać, że każde rozwiązanie zadania przechodzi przez trzy fazy weryfikacji: basic test – czyli weryfikacja rozwiązania danymi podanymi przy zadaniu, tricky data – weryfikacja danymi „pokręconymi” w celu testowania odporności rozwiązania na zakłócenia no i na koniec load test, który może wyeliminować z gry. Więc każda dodatkowa wersja rozwiązania to szansa na „przyżycie” w turnieju.
PP: Który TSQLChallenge z dotychczasowych najbardziej przypadł Wam do gustu i dlaczego?
MP: Bezwzględnie TC37! To zadanie najbardziej mnie zmęczyło ale też dało najwięcej radości gdy się wykluło wreszcie z poszukiwań mego umysłu. W samo rozwiązanie mogę się gapić i podziwiać jakie sprytne i szybkie rzeczy można robić w T-SQL-u (nawet bez użycia indeksów). Mam porównanie bo moja pierwsza wersja rozwiązania tego zadania była tragiczna pod względem wydajnościowym i to o kilka rzędów wielkości. Obserwując rozwiązania konkursowe widać, jaki power ma T-SQL, jak bardzo elastycznym jest językiem.
LG: Trudno wybrać, ale wybrałbym TC28 (przyp. PP – Leszek wygrał ten TC!). Za kompletną pustkę w głowie po zapoznaniu się z zadaniem i wiele prób wypełnienia tej pustki kierunkiem zmierzającym do utworzenia sensownej solucji.
PP: Wspominaliście mi, że wzajemnie się „nakręcacie” w czasie konkursów. W jaki sposób?
LG: Wymieniamy się statystykami, uwagami na temat TC, możliwymi „tricky data”. Jeżeli wiem, że Marek zadanie zrobił z lepszymi statystykami niż uzyskałem, mam powód do szukania innego rozwiązania. Korzystamy też z forum, jako źródła statystyk, jak i wielu dodatkowych uwag, czy omawiania samych założeń do TC.
MP: Tak to prawda. Wymieniamy się ze sobą statystykami i powoduje to sportową żyłkę rywalizacyjna między nami. A poza tym przez te kilka miesięcy kontaktów mogliśmy się lepiej poznać nie tylko na polu T-SQL’a ale również zainteresowań w innych technologiach, na przykład w robieniu własnego chleba na własnym zakwasie, piwa, jogurtu, przyrządzaniu sałatek ze śledzi. I to jest ta wartość dodana uczestnictwa w tych zawodach.
PP: Gdybyście mieli mnie zachęcić do udziału w konkursach TSQLChallenge, co byście mi powiedzieli?
MP: Poza zdobywaniem doświadczenia w trudnych wyzwaniach oraz podglądaniem i uczeniem się efektownych technik innych uczestników nie mniej istotna jest żyłka sportowa towarzysząca turniejowi. Co prawda same emocje są rozłożone w czasie tak bardzo, że można je porównać do emocji towarzyszących turniejowi szachowemu, ale jeżeli masz żyłkę sportową, która drga w Tobie, to niewątpliwie Twoje miejsce jest na TC!
LG: TC to dobre miejsce do nauki i rozwijania umiejętności w kodowaniu TSQL. W odróżnieniu od kursów i książek, które często przekazują wiedzę w sposób nudny, schematyczny, TC ukazują problem do rozwiązania, nie podają wiedzy na tacy, tylko zmuszają do samodzielnego jej poszukiwania, intensyfikują proces myślenia i umożliwiają dużo szybsze wchłanianie wiedzy. TC są również znakomitym workiem treningowym dla szarych komórek (ostatni raz ten specyficzny poziom endorfin uzyskałem w szkole średniej rozwiązując trudniejsze całki ;-) ).
PP: Dziękuję za wywiad i powodzenia w kolejnych „wyzwaniach”!
LG: A ja dziękuję za zaproszenie, miłą rozmowę i poparcie w dalszych zmaganiach z tsql’owym puzzle.
MP: Dzięki i do zobaczenia przy okazji kolejnych wyzwań T-SQL z również Twoim udziałem.
–
A zatem, jeżeli kręci Cię zdrowe współzawodnictwo, chcesz poćwiczyć szare komórki i przy okazji potrenować pisanie kodu T-SQL, spróbuj swoich sił w TSQL Challenges. Obserwując Marka i Leszka muszę Cię jedynie ostrzec, że to wciąga jak diabli :-) Ale jeśli jeszcze nie masz swojego ulubionego uzależnienia… ;-)
I na koniec – chcę wyrazić szacunek dla osób prowadzących portal BeyondRelational.com i konkursy TC. Publikować co dwa tygodnie nowe zadanie, czuwać nad rozwojem sytuacji w każdym konkursie, robić testy nadesłanych rozwiązań i panować nad tym wszystkim, to naprawdę duże wyzwanie dla organizatorów. I jak na razie im się to udaje! Stworzyli atmosferę zdrowej rywalizacji i swego rodzaju społeczność uczestników zabawy. Brawo za ideę i jej realizację.
–
PS. A już zupełnie na koniec pragnę nadmienić, że ten wywiad jest swego rodzaju zapowiedzią mojego własnego, jednorazowego konkursu a la TC, który zorganizuję na blogu. Szczegóły w drugiej połowie września. Stay tuned!
[PL] Wydarzenie – jadę na pierwszy Silesian Code Camp
Aug 20th
W sobotę, 11 września, wybieram się do Katowic. Odbędzie się tam pierwszy w historii Silesian Code Camp. Po co tam jadę? Po pierwsze, by spotkać się z ludźmi, którzy dzielą podobne do moich pasje (technologiczne, ale i nie tylko). Po drugie, bo wśród wspomnianych ludzi mam wielu przyjaciół, z którymi spotkać się mogę kilka razy do roku (a niby mieszkamy w globalnej wiosce). A po trzecie – jadę tam po wiedzę. Bo jak mogę wrócić z pustymi rękami z konferencji, na której występują jednocześnie: Paula Januszkiewicz (MVP), Marcin Szeliga (MVP), Szymon Kobalczyk (MVP), Daniel Dudek (lider Śląskiej Regionalnej Grupy Microsoft, ATE na MTS 2010) i Szymon Pobiega (jeden z moich ulubionych blogerów z Zine’a)?
A zatem, jeśli nie masz nic lepszego w planach na 11 września, rejestruj się na śląską imprezę. Moim zdaniem warto – sama konferencja jest darmowa, a wrażenia zapowiadają się na takie, o których po latach mówimy “bezcenne” :-) Do zobaczenia w Katowicach.
PS. Jeśli jesteś z Warszawy i wybierasz się na tę konferencję, daj znać, a może zrobimy jakiś “wesoły autobus” ;-)
Witryna konferencji Silesian Code Camp | Rejestracja na Silesian Code Camp



Nazywam się Paweł Potasiński i pracuję w polskim oddziale Microsoft w dziale Small and Midmarket Solutions & Partners (SMS&P) jako Partner Technology Advisor.


