| Visa föregående ämne :: Visa nästa ämne |
| Startad av: |
Meddelande |
falken110
Medlem i: 3155 dagar
Status: Offline
#723054
|
Skrivet: 2012-04-28 14:11
Ämne: Bästa Indexering av tabell för att ta ut de 25 senaste
|
|
|
Hej
Håller på att skapa några tabeller för lagring av provresultat.
Vid varje provtillfälle ska en produktionskod anges och sedan så ska det göras ca 3 olika typer av prov och varje provtyp ska innehålla fem provresultat.
Man ska sedan konternueligt kunna visa de 25 senaste proverna för vald provtyp. Alltså 125 provresultat.
Det jag gjort hittills är att jag skapat två tabeller.
En som heter SampleProdcode och har föäljande kolumner.
ID (PK)
ProdCode Ex 280412 1010 = 2012-04-28 10:10
SampleType
Machine
Time 2012-04-28 10:10 (skapas av prodcode)
Den andra tabellen heter Samplevalue och har följande kolumner
SampleProdcodeID (Sammansatt PK med Part)
Part
SampleValue
När jag nu vill ha ut de 25 senste så söker jag på SampleType och Machine och sorterar fallande på Time. (och limit 25) Joinar också såklart med SampleValue.
Tabellen SampleValue kommer att innehålla ca 750 000 rader efter ett tag.
Nu till de frågor jag har.
1. Är det bättre att ha en tabell till som inehåller alla kombinationer av SampleType och Machine och sedan länka med ett ID mellan tabellerna?
2. Hur ska jag indexera och ställa frågan på mest effektiva sättet i de olika fallen som blir beroende på om man skapar en tabell till eller ej?
Hoppas någon kan ge lite tips.
Mvh
Falken |
|
|
|
| Till toppen på sidan |
|
md2perpe


Medlem i: 3741 dagar Från: Hallonbergen, Kungsbodarna
Status: Offline
#723071
|
Skrivet: 2012-04-29 11:05
Ämne: Re: Bästa Indexering av tabell för att ta ut de 25 senaste
|
|
|
| falken110 skrev: |
| När jag nu vill ha ut de 25 senste så söker jag på SampleType och Machine och sorterar fallande på Time. (och limit 25) |
Har inte hunnit kolla närmare på hela tabellstrukturen, men utifrån det citerade bör du ha index på (SampleType, Machine, Time). |
|
|
_________________ 6 + sqrt(64) = 10 |
| Till toppen på sidan |
|
md2perpe


Medlem i: 3741 dagar Från: Hallonbergen, Kungsbodarna
Status: Offline
#723115
|
Skrivet: 2012-04-30 23:09
Ämne: Re: Bästa Indexering av tabell för att ta ut de 25 senaste
|
|
|
| falken110 skrev: |
| 1. Är det bättre att ha en tabell till som inehåller alla kombinationer av SampleType och Machine och sedan länka med ett ID mellan tabellerna? |
Hur menar du? Och varför skulle det vara bättre? (Kan vara jag som missat något i förståelsen av din databas.) |
|
|
_________________ 6 + sqrt(64) = 10 |
| Till toppen på sidan |
|
falken110
Medlem i: 3155 dagar
Status: Offline
#723118
|
Skrivet: 2012-05-01 08:32
Ämne:
|
|
|
Hej och tack för svaren.
Tanken med en kolumn till är att det kanske går snabbare. Det skulle gå snabbare att bara söka i en kolumn i den tabell som innehåller många rader. Tabellen med alla kombinationer av SampleType och Machine skulle kanske innehålla 100-200 rader. Där söker jag efter Machine och SampleType får ett ID och använder sedan det för sökning i den större tabellen. Jag använder stored procedure och så som det är nu så tar jag ut de 25 senaste ur SampleProdcode och lägge det i en temporär tabell som jag sedan Joinar mot Samplevalue. Nu kommer inte tabellen SampleProdcode att innehålla mer än max 150 000 rader så det kanske inte spelar så stor roll om man söker i en eller flera kolumner.
Nu tänker jag mig att använda en tillfällig tabell för de 25 senaste men det kansek är bättre att göra en fråga ungefär såhär.
SELECT t0.col1, t0.col2, Samplevalue.col1 FROM Samplevalue INNER JOIN (SELECT TOP 25 col1, col2 FROM SampleProdcode WHERE ....) AS t0 ON ....
Visst skulle väl det kunna funka men vilket är snabbast? I det senare exemplet skulle jag inte använda stored procedure.
Ser att jag skrivit Limit 25 innan. Ska vara Top då det är SQL Server det rör sig om. |
|
|
|
| Till toppen på sidan |
|
md2perpe


Medlem i: 3741 dagar Från: Hallonbergen, Kungsbodarna
Status: Offline
#723129
|
Skrivet: 2012-05-01 13:25
Ämne:
|
|
|
Då tror jag inte på att lägga till en tabell, för det du vill göra med tabellen är just det som indexet skall göra. Du kan helt enkelt se indexet som en tabell som verkar i bakgrunden på exakt det sätt du vill göra.
Jag tror inte att du behöver en temporär tabell, för det skapar nog db-motorn själv om det behövs. Åtminstone verkar MySQL göra det. Hur SQL Server arbetar har jag tyvärr ingen kunskap om. |
|
|
_________________ 6 + sqrt(64) = 10 |
| Till toppen på sidan |
|
falken110
Medlem i: 3155 dagar
Status: Offline
#723166
|
Skrivet: 2012-05-01 20:42
Ämne:
|
|
|
Då får det bli så.
Jag kör med två tabeller och indexerar som du rekommenderar. Hade nog gjort samma men Time hade jag nog inte tänkt på.
Tack för svaren |
|
|
|
| Till toppen på sidan |
|
md2perpe


Medlem i: 3741 dagar Från: Hallonbergen, Kungsbodarna
Status: Offline
#723168
|
Skrivet: 2012-05-01 20:58
Ämne:
|
|
|
| Att ta med sorteringskolumnen i index har jag lärt mig senaste året. Men det är ju ganska logiskt att ha med den. |
|
|
_________________ 6 + sqrt(64) = 10 |
| Till toppen på sidan |
|
falken110
Medlem i: 3155 dagar
Status: Offline
#723869
|
Skrivet: 2012-05-31 14:10
Ämne:
|
|
|
Hej
Ett tag sedan nu men jag har en fråga till som kanske inte direkt hör ihop med denna men som jag sökt ett svar på en tid nu.
På den sql-server jag använder finns en vbs-fil som körs varje timme och hämtar data från en oracle server och uppdaterar en tabell på sql-servern. Allt fungerar bra men jag skulle vilja kunna köra frågor direkt från en stored procedure också men jag vet inte hur man gör eller om det ens är möjligt.
Har läst lite om Linked server, openquery och openrowset men får inte till det. Undrar om det är någon kan ge lite tips. Jag har frågat admin men de viste inte/hade inte tid för fallet.
Någon som vet hur man gör?
Mvh
Falken |
|
|
|
| Till toppen på sidan |
|
|