verwendetes Datenbanksystem: MS SQL 2005
Hallo Forum,
ich habe gestern eine Abfrage für einen Report geschrieben, welche eigentlich nur einen Wert übers Jahr ausgibt. Diese sieht wiefolgt aus:
Die Abfrage sieht so aus:
SELECT
CASE [CheckoutMonth]
WHEN 1 THEN 'January'
WHEN 2 THEN 'February'
WHEN 3 THEN 'March'
WHEN 4 THEN 'April'
WHEN 5 THEN 'May'
WHEN 6 THEN 'June'
WHEN 7 THEN 'July'
WHEN 8 THEN 'August'
WHEN 9 THEN 'September'
WHEN 10 THEN 'October'
WHEN 11 THEN 'November'
WHEN 12 THEN 'December'
END as 'Month',
ISNULL([1],0) as '1',
ISNULL([2],0) as '2',
ISNULL([3],0) as '3',
ISNULL([4],0) as '4',
ISNULL([5],0) as '5',
ISNULL([6],0) as '6',
ISNULL([7],0) as '7',
ISNULL([8],0) as '8',
ISNULL([9],0) as '9',
ISNULL([10],0) as '10',
ISNULL([11],0) as '11',
ISNULL([12],0) as '12',
ISNULL([13],0) as '13',
ISNULL([14],0) as '14',
ISNULL([15],0) as '15',
ISNULL([16],0) as '16',
ISNULL([17],0) as '17',
ISNULL([18],0) as '18',
ISNULL([19],0) as '19',
ISNULL([20],0) as '20',
ISNULL([21],0) as '21',
ISNULL([22],0) as '22',
ISNULL([23],0) as '23',
ISNULL([24],0) as '24',
ISNULL([25],0) as '25',
ISNULL([26],0) as '26',
ISNULL([27],0) as '27',
ISNULL([28],0) as '28',
ISNULL([29],0) as '29',
ISNULL([30],0) as '30',
ISNULL([31],0) as '31'
FROM
(
SELECT
Month(DateTimeField) as CheckoutMonth,
SUM(DataField),
DAY(DateTimeField) as CheckoutDay
FROM
(
SELECT
DateDiff(dd,a.DateTimeField1,a.DateTimeField2) AS LOR,
a.DateTimeField1
FROM
TableA AS a WITH (NOLOCK) LEFT OUTER JOIN
TableB AS b WITH (NOLOCK) ON a.columnA = b.columnA AND
a.columnB < b.columnB
WHERE
(b.columnB IS NULL)
AND intField = @intValue
AND stringField1 != 'XX'
AND stringField2 != 'XX' ) data
WHERE
YEAR(DateTimeField1) = @year
GROUP BY Month(DateTimeField1), DAY(DateTimeField1)
UNION
SELECT 1 , 0, 1 as CheckoutDay UNION
SELECT 2 , 0, 1 as CheckoutDay UNION
SELECT 3 , 0, 1 as CheckoutDay UNION
SELECT 4 , 0, 1 as CheckoutDay UNION
SELECT 5 , 0, 1 as CheckoutDay UNION
SELECT 6 , 0, 1 as CheckoutDay UNION
SELECT 7 , 0, 1 as CheckoutDay UNION
SELECT 8 , 0, 1 as CheckoutDay UNION
SELECT 9 , 0, 1 as CheckoutDay UNION
SELECT 10 , 0, 1 as CheckoutDay UNION
SELECT 11 , 0, 1 as CheckoutDay UNION
SELECT 12 , 0, 1 as CheckoutDay
) s
PIVOT
(
SUM([DataField])
FOR CheckoutDay IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])
) p
TableA und TableB sind die selben Tabellen, nur muss ich den letzten Datensatz für ein "Produkt", "Kunde" oder ähnliches herausfiltern.
Die Abfrage funktioniert wunderbar, habe daraus eine SP gemacht und sie funktioniert einwandfrei aus dem Managment Studio. Nun habe ich mir mit dem Report Builder einen Report drum herum gebastelt, und dort braucht die Abfrage ewig lange und der SQLServer läuft mit 99% Auslastung. Nach einigen Tipps habe ich NOLOCK eingebaut, welches anschließend auch funktionierte. Die Abfrage war auch im Report Builder auch schnell.
Heute habe ich gecheckt, ob der Report auch so ist, wie es der "Auftraggeber" möchte, und um ihn auf ein Produktivsystem zu implementieren, habe ich die SP umbenannt. Nun stehe ich wieder vor dem Problem, dass aus dem Managment Studio die Abfrage flitzt, aber aus dem ReportDesigner nicht, dort hängt es sich auf oder braucht ewiiiigg lange.
Es sind aktuell ca. 180000 Datensätze in dieser Tabelle.
Kann mir jemand sagen, woran es hier scheitert? Was macht der ReportDesigner anders, als das SQL Managment Studio?
Lion
lg Lion
Hat sich eben erübrigt, bei den gestrigen Tipps war auch der Hinweiß auf "SET NOCOUNT ON" dabei, denn ich gestern verwendet hatte, aber anscheind nicht gespeichert hatte.
Nun habe ich diese Option wieder hinzugefügt, und es flitzt wieder dahin.
Lion
P.S. diese Tipps kamen von Kollegen, die einige Jahre länger schon mit SQL zu tun hatten, d.h. ich bin mir nicht sicher ob es DIE Lösung ist, aber die Beschreibung von SET NOCOUNT ON scheint für mich passend zu sein, um das auch zu verwenden.
lg Lion