Har kört med denna SQL ett tag nu och helt plötsligt så får den för sig att köra TimeOut på anropet ifrån servern, men även när jag kör den i SQL Managment Studio... Vilka index har du på tabellerna och - framför allt - vilka index används (du kan t.ex. se det genom att köra queryn med alternativet "include actual execution plan")? Problemet är att skådespelarna kan vara med i andra föreställningar än den uthämtade... Så att jag vill hämta ut alla skådespelares tider för en period, med utgång att dom ska vara med i en specifik föreställning. Här finns en guide till CREATE INDEX i T-SQL (med exempel längst ner):Problem med filtrering...
SELECT a.aName, a.aShortName, a.stStartDateTime, a.stStopDateTime, a.stTime, a.stBrakeTime, a.aID, s.sName, a.stNote, s.sType
FROM actors a LEFT OUTER JOIN show s ON a.teID = s.teID WHERE (a.stStartDateTime BETWEEN @startDate AND @endDate) AND (a.aShortName
IN (SELECT DISTINCT actors.aShortName FROM actors INNER JOIN show ON actors.teID = show.teID WHERE show.sShortName = @shortName))
ORDER BY a.aShortName, a.stStartDateTime
Om jag kör:SELECT a.aName, a.aShortName, a.stStartDateTime, a.stStopDateTime, a.stTime, a.stBrakeTime, a.aID, s.sName, a.stNote, s.sType FROM actors a LEFT OUTER JOIN show s ON a.teID = s.teID WHERE (a.stStartDateTime BETWEEN @startDate AND @endDate) AND (a.aShortName IN (SELECT DISTINCT actors.aShortName FROM actors INNER JOIN show ON actors.teID = show.teID)) ORDER BY a.aShortName, a.stStartDateTime
Där jag plockar bort villkåret "WHERE show.sShortName = @shortName" och hämtar ut allt så funkar det, tar jag bort "(a.stStartDateTime BETWEEN @startDate AND @endDate) AND" och behåller "WHERE show.sShortName = @shortName" så funkar det oxå. Är lite tom på idéer varför dessa två var för sig fungerar, men inte tillsammans... eller, det har fungerat tills nu i veckan då de inte vill vara med och leka....
Vad är det jag gör förenklat...
Jag har två tabeller... en med skådespelare och en med föreställningar. Sen ska jag plocka ut alla skådespelare som är med i en viss föreställning under en viss period. Kopplingen mellan föreställningen och skådis är ett ID som är döpt till teID. show.sShortName är en VarChar(50)
Sv: Problem med filtrering...
Behöver du verkligen göra den något yxiga sub-queryn för att matcha på @shortName?
SELECT a.aName, a.aShortName, a.stStartDateTime, a.stStopDateTime, a.stTime, a.stBrakeTime, a.aID, s.sName, a.stNote, s.sType
FROM actors a
INNER JOIN show s ON a.teID = s.teID
WHERE (a.stStartDateTime BETWEEN @startDate AND @endDate)
AND s.sShortName = @shortName
ORDER BY a.aShortName, a.stStartDateTime
Sv:Problem med filtrering...
Jag har bara lyckats få dit index på ID:et på varje post... helst skulle jag vilja ha det på de posterna som kopplar ihop dessa två tabeller och sen det fältet som filtrerar ut vilken pjäs de är med i. Är inte riktig vän med SQL 2005 och Managment Studio... ännu...
Har nu gjort en "work around" där jag plockat ut <code>SELECT DISTINCT actors.aShortName FROM actors INNER JOIN show ON actors.teID = show.teID WHERE show.sShortName = @shortName</code> och skapat en CSV-string som jag sedan använder...
<code>SELECT a.aName, a.aShortName, a.stStartDateTime, a.stStopDateTime, a.stTime, a.stBrakeTime, a.aID, s.sName, a.stNote, s.sType FROM actors a LEFT OUTER JOIN show s ON a.teID = s.teID WHERE (a.stStartDateTime BETWEEN @startDate AND @endDate) AND (a.aShortName IN (@actorsCSV)) ORDER BY a.aShortName, a.stStartDateTime</code>
För mig så är mitt första försök samma som min "Work Around"...Sv: Problem med filtrering...
http://msdn.microsoft.com/en-us/library/ms188783.aspx
Den här borde ge alla föreställningar för en skådespelare som har varit med i en specifik föreställning
SELECT a.aName, a.aShortName, a.stStartDateTime, a.stStopDateTime, a.stTime, a.stBrakeTime, a.aID, s.sName, a.stNote, s.sType
FROM actors a
INNER JOIN show s ON a.teID = s.teID
INNER JOIN show sTarget ON a.teID = sTarget.teID
WHERE (a.stStartDateTime BETWEEN @startDate AND @endDate)
AND sTarget.sShortName = @shortName
ORDER BY a.aShortName, a.stStartDateTime