04. april 2003 - 11:04Der er
4 kommentarer og 2 løsninger
en lang query eller mange små?
Hej
Jeg er ved at lave en række rapporter fra en produktionsdatabase i PHP. Disse rapporter trækker mange data ud af en MS SQL DB. Der er tale om rimlig komplicerede rapporter, med mange data.
Nu er spørgsmålet. Er det meget skidt at bruge mange små og simple sql-querys som så bliver kaldt ofte pga løkker. I modsætningen til én stor meget uoverskuelig SQL-query, som henter alle data på én gang
Det er meget nemmere at udvikle de mange små, og efter min mening mere velstruktureret, men går det ud over hastigheden på SQL-serveren? og er det generelt forkert?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Jeg vil foretrække en stored procedure for at mindske netværkstrafik (jeg går ud fra, at serveren kører på en anden maskine). Så må det være op til brugerinterfacet at give oplysning om, at der sker noget.
Det er også planen at det skal laves som stored procedures, men så kan vi spørge igen, er mange små stored procedures ok i forhold til én stor?
Min query skal efterligne noget lignene:
********************************* SELECT d.orderNo, d.batchNo, s.lotNo, o.recipeNo, r.recipeDescr, d.materialDescr, (SELECT r.batchSize * sum( r.dosingPct)/100000.) AS WantedAmount, d.obtainedAmount, s.siloNo, CONVERT(varchar(20), d1.dateTime, 13) AS BatchStart, CONVERT(varchar(20), d2.dateTime, 13) AS BatchFinished FROM recipeTable r INNER JOIN orderTable o ON r.orderNo = o.orderNo INNER JOIN dosingEventTable d ON d.orderNo = r.orderNo AND d.orderNo = o.orderNo AND d.materialNo = r.materialNo AND d.materialDescr = r.materialDescr AND d.dosingEventCode = 2 INNER JOIN siloLogTable s ON s.siloNo = d.siloNo AND s.setTime < d.dateTime AND d.dateTime < s.siloZeroTime INNER JOIN dosingEventTable d2 ON d2.orderNo = d.orderNo AND d2.batchNo = d.batchNo AND d2.dosingEventCode = 10 INNER JOIN dosingEventTable d1 ON d1.orderNo = d.orderNo AND d1.batchNo = d.batchNo AND d1.recID IN (SELECT min(recID) FROM dosingEventTable GROUP BY orderNo, batchNo)
GROUP BY d.orderNo, r.recipeDescr, o.recipeNo, d.batchNo, d.materialNo, d.materialDescr, d.dosingEventCode, r.batchSize, d.recID, d.obtainedAmount, s.lotNo, s.siloNo, d1.dateTime, d2.dateTime ORDER BY d.orderNo, d.batchNo, s.lotNo, d.materialDescr *********************************************
Det er efter min mening for uoverskueligt hvis folk skal overtage det. Men gør det den store preformance forskel at splitte den op i flere små, som bliver kaldt oftere?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.