en-USsv-SE
Du är här:   Forum
HemHemSQLug.SESQLug.SETävlingarTävlingarSQLug.se challenge 2011SQLug.se challenge 2011
Föregående
 
Nästa
Nytt inlägg
2011-03-11 23:04
 

Nu drar årets svenska mästerskap för SQL Server utvecklare igång, arrangerat av SQLUG. Uppgiften är relativt enkel att komma igång med men svår att lösa optimalt.

Tävlingen är både individuell och per företag. Som tävlande representerar man både sig själv som individ och det företag man jobbar på.

Bästa individuella insats vinner ett presentkort på 990 kr hos Liveit, som kan användas till vin- och chokladprovning för två, prova stridsflygsimulator, spabehandling eller vad man nu föredrar.

De bästa företagen belönas med följande vinster från Red Gate:

1:a pris - Red Gate SQL Backup Pro, värde $795
2:a pris - Red Gate SQL Virtual Restore, värde $495
3:e pris - Red Gate SQL Prompt, värde $195

Den största vinsten är naturligtvis äran att kunna titulera sig vinnare i SQLug.se challenge 2011!

Tävlingssponsorer:




Tävlingsuppgift

Du driver en dating-site där personer har lagt upp sin personliga information. Uppgiften är nu att skriva en effektiv sökfunktion som söker enligt en uppsättning kriterier.

Exempelvis kanske du söker efter dessa kriterier

 WantedSetID  AttributeName  AttributeValue
 1  Kön  F
 1  Ålder  B
 1  Körkort  B
 2  Kön  F
 2  Ålder  B
 3  Kön  M
 3  Ålder  C

Uppgifterna ska tolkas som att i första hand söker du efter "en kvinna i ålder B som har körkort B", i andra hand "en kvinna i ålder B" och i tredje hand "en man i ålder C". Värdet på ett attribut är alltid av typen char(1). Sökningen är case insensitive.

Sökkriterierna finns i en tabell som heter WantedAttribute. Som du ser är tabellen WantedAttribute flexibel och kan innehålla en eller flera sökset och varje sökset kan innehålla en eller flera matchnings-attribut. Sökfunktionen skall returnera vilka sökset som är uppfyllda och för vilka personer.

Tävlingsuppgiften är att komma fram till en lösning som fixar uttaget så snabbt som möjligt. Vi vill ha prestanda! I första hand kommer vi att titta på den totala tiden (duration) för lösningen, eftersom det är den tiden slutanvändaren märker av. Skulle två eller flera lösningar vara ungefär lika i tid, kommer antalet processorer som används samt mängden reads att vägas in för att avgöra vilken lösning som är mer effektiv när den är ungefär lika snabb.

Servern som kommer att användas för testkörningarna har 16 kärnor på 2.5GHz samt 56GB RAM varav 40GB är dedikerat till SQL Server Service. Diskarna finns på ett Hewlett Packard SAN. Första körningen körs med kall cache, övriga körningar med varm cache.

Tabellerna innehåller följande data

1) People innehåller namn på alla som anmält sig på siten
2) Attribute innehåller alla attribut som går att registrera
3) PeopleAttribute innehåller alla värden för alla attribut som alla People valt att spara
4) WantedAttribute innehåller de värden som du vill söka på

Med exempeldatat här kan du se att Carri inte matchar alla sökattribut för set 1 men gör det för set 2.

Du ser att Robin matchar set 1 och övermatchar set 2. Du ser även att Vera inte matchar alla attribut för set 1 men övermatchar set 2. Ingen matchar set 3.

Din SQL-kod skall returnera svaret som tabellrader. Sorteringsordning spelar ingen roll. Resultatet för exempeldatat blir

 PeopleID  WantedSetID
 1  2
 2  1
 2  2
 3  2

Material

Ladda ned dessa script och kör i SQL Server Management Studio (eller annat favoritverktyg).

Regler

  • Tävlingen är öppen för alla SQLUGs medlemmar.
  • Tävlingsbidrag postas som svar på detta forum. De skall märkas med namn och företag.
  • Vinnare är den/de som har presterat den snabbaste lösningen.
  • Tillåtna metoder är T-SQL och SQL CLR. SQL CLR måste köras i safe läge och källkoden måste bifogas.
  • Inga schemaförändringar på befintliga tabeller är tillåtna förutom att skapa icke-klustrade index.
  • Det är tillåtet att skapa index, vyer, funktioner och procedurer (men ej indexerade vyer). Lösningarna måste städa upp efter sig så att den kan köras om och om igen. Posta din lösning uppdelad på tre script: Setup, Huvudkod, Uppstädning
  • Eventuell vinstskatt betalas av vinnarna.
  • Lösningarna kommer att testköras på en större mängd testdata för att tävlingen skall bli utslagsgivande.
  • Tävlingen avgörs av en jury som består av Johan Åhlén, Tibor Karaszi, Tobias Thernström och Peter Larsson.
  • Deadline för att komma med tävlingsbidrag är 26 maj kl 22:00 (svensk tid).

Vinster

Individuell tävling: Första pris är ett presentkort på 990 kr från liveit.se
Företagstävling: De tre bästa lösningarna vinner licenser från Red Gate

Hur du tävlar

Posta din lösning på det här forumet. Skriv ditt namn och företagsnamn (om du också representerar ett företag/organisation).

Frågor

Frågor angående tävlingen ställs i detta forum.

Lycka till!

//Peter Larsson

 
Nytt inlägg
2011-03-23 12:19
 
Hej

Intressant uppgift!

Här kommer ett första försök till lösning:



-- SETUP

IF OBJECT_ID('tempdb..#NumberOfSetAttributes') IS NULL
SELECT
WantedSetID
,count(*) as NumberOfAttributes 
INTO #NumberOfSetAttributes  
FROM WantedAttribute
GROUP BY WantedSetID



-- MAIN CODE

SELECT
sub.PeopleID
,sub.WantedSetID
FROM (
SELECT
PeopleID
,WantedSetID
,Count(*) as NumberOfMatchingAttributes
FROM PeopleAttribute
INNER JOIN WantedAttribute on PeopleAttribute.AttributeID = WantedAttribute.AttributeID AND PeopleAttribute.AttributeValue  = WantedAttribute.AttributeValue
GROUP BY PeopleID,WantedSetID
) sub
INNER JOIN #NumberOfSetAttributes NumberOfSetAttributes on sub.WantedSetID = NumberOfSetAttributes.WantedSetID
where sub.NumberOfMatchingAttributes = NumberOfSetAttributes.NumberOfAttributes



-- CLEAN
IF OBJECT_ID('tempdb..#NumberOfSetAttributes') IS NOT NULL
DROP TABLE #NumberOfSetAttributes
 
Nytt inlägg
2011-03-23 12:24
 
HenrikF skrev:
Hej

Intressant uppgift!

Här kommer ett första försök till lösning:

 
Det var snabbt jobbat! Tyvärr är inte bidraget tillåtet eftersom det inte är tillåtet att skapa temporärtabeller i setup-scriptet. Om du flyttar skapandet av temporärtabellen till huvudscriptet är det OK!

MVH
Johan

 
Nytt inlägg
2011-03-23 12:49
 
Ok där ser man, men vad får man egentligen göra i Setupdelen?  Jag gissar att man rimligen inte får skapa "vanliga" tabeller heller?


Här kommer hur som helst en redigerad version:




-- SETUP
-- Do Nothing


-- MAIN CODE


IF OBJECT_ID('tempdb..#NumberOfSetAttributes') IS NULL
SELECT
WantedSetID
,count(*) as NumberOfAttributes 
INTO #NumberOfSetAttributes  
FROM WantedAttribute
GROUP BY WantedSetID


SELECT
sub.PeopleID
,sub.WantedSetID
FROM (
SELECT
PeopleID
,WantedSetID
,Count(*) as NumberOfMatchingAttributes
FROM PeopleAttribute
INNER JOIN WantedAttribute on PeopleAttribute.AttributeID = WantedAttribute.AttributeID AND PeopleAttribute.AttributeValue  = WantedAttribute.AttributeValue
GROUP BY PeopleID,WantedSetID
) sub
INNER JOIN #NumberOfSetAttributes NumberOfSetAttributes on sub.WantedSetID = NumberOfSetAttributes.WantedSetID
where sub.NumberOfMatchingAttributes = NumberOfSetAttributes.NumberOfAttributes


IF OBJECT_ID('tempdb..#NumberOfSetAttributes') IS NOT NULL
DROP TABLE #NumberOfSetAttributes


-- CLEAN
-- Do Nothing
 
Nytt inlägg
2011-03-23 13:04
 
HenrikF skrev:
Ok där ser man, men vad får man egentligen göra i Setupdelen?  Jag gissar att man rimligen inte får skapa "vanliga" tabeller heller?


 
Det står i reglerna vad man får göra. Man får skapa icke-klustrade index, vyer, funktioner och procedurer.

 
Föregående
 
Nästa
HemHemSQLug.SESQLug.SETävlingarTävlingarSQLug.se challenge 2011SQLug.se challenge 2011


Annons