2011 år programmeringstävling har avgjorts!
Det började stort med flera bidrag och ganska snart stod det klart att de flesta av de tävlande hade förstått att lösningen på problemet var en s.k Relational Division.
Inte minst med tanke på att flera bidrag såg ut att vara kopierade från Celko’s artikel ”Divided we stand”. Det är dessa bidrag som ligger på ca 1 365 000 reads. Då mängden bidrag ökade tog vi beslutet att bara presentera de som slutfördes inom 60 sekunder.
En hel del bidrag klarade inte alla enhetstester och sållades bort innan vi testade den mot de slutliga tabellerna.
Det som de tre första lösningarna har gemensamt är att de tänkt till lite extra och lyckats få bort en läsning av PeopleAttribute, vilket de övriga inte verkat lyckats med.
Vissa har försökt trixa med olika query hints med mer eller mindre lyckade resultat. Någon levererade en dynamisk SQL-lösning som var riktigt snabb på den slutliga tabellen men föll bort i en av enhetstesterna pga för månmga kolumner. Lösningarna med SQLCLR trodde jag skulle gå snabbare men de presterade precis över 60-sekunders strecket. Detta pga av SAFE mode, dvs ingen parallellitet.
Den slutliga tabellen utökades efterhand då mängden lika snabba lösningar skickades in. Det kändes orättvist att kora en vinnare på ett mindre set och en tidsdifferens på enbart 20 ms!
Vi la till fler rader i tabellerna och utökade antalet WantedSet efterhand för att det skulle bli tydligare vilken lösning som till slut skulle prestera bäst. Den slutgiltiga tabellen är i stort sett en kopia av vår transaktionsdatabas där jag kopierade raderna ifrån. PeopleID är CustomerID, AttributeID är ArticleCode och AttributeValue är PriceType.
Den bästa lösningen använder sig av parallellitet på att utmärkt sätt.
Genom att använda CROSS APPLY gör han sin lösning mer benägen att bli parallell än han som kom på andra plats som använde sig av INNER JOIN. I övrigt är de två lösningarna identiska i upplägget.
Han som kom på tredje plats hade en liknande lösning med INNER JOIN men la tyvärr en beräkning på ett join-villkor vilket gjorde att det index som fanns inte kunde användas (non-sargable).
Några har tyckt att hans eller hennes senare lösning borde vara snabbare eftersom den varit det på sin egen maskin. Det är ingen garanti att det går snabbare på tävlingsmaskinen. Mängden data i tabellerna, inställningar på servern och andra faktorer påverkar. Jag har köpt loss en egen server till nästa tävling som ni kommer att få tillgång till med ftp och lägga upp era lösningar på.
Vi önskar Göran Rönnbäck (#15), Henrik Nilsson (#1) samt Sergey Klimkevich (#1) lycka till med de bäst presterande lösningarna.
Om ni vill att Microsoft ska standardisera Relational Division i SQL Server och göra T-SQL mer komplett får ni gärna gå in och rösta på mitt Connect-förslag här
https://connect.microsoft.com/SQLServ...
//Peter
