Sicht, Komplex, Performance

13/09/2007 - 12:58 von Michael Monarch | Report spam
Servus Experten,

ich habe folgende Sicht (nenen wir sie mal Sicht1), welche ohne
Einschrànkung ca.2.8 Mio Datensàtze zurückgibt:

SELECT TOP (100) percent dbo.BelegPos.[VBAK-VBELN] AS Auftrag,
dbo.BelegPos.[VBAP-POSNR] AS Pos, dbo.BelegPos.[VBAP-UEPOS] AS ÜPos,
dbo.BelegPos.[VBAP-MATNR] AS [(1) P-Material],
dbo.BelegPos.[VBAP-MATWA] AS [(2) P-Material], dbo.BelegPos.[MAKT-MAKTX] AS
[P-Mat.-Bez.],
dbo.BelegStueliPos.[AUFK-AUFNR] AS [(1) FA-Auftrag],
dbo.BelegStueliPos.[AFKO-MAUFNR] AS [(2) FA-Auftrag],
dbo.BelegStueliPos.[AFPO-MATNR] AS [FA-Material],
Materialstamm_1.Bezeichnung AS [FA-Mat.-Bez.], dbo.BelegStueli.[RESB-RSPOS]
AS [FA-Pos.],
dbo.BelegStueli.[MARA-MATNR] AS [FA.-Pos.-Material],
Materialstamm_2.Bezeichnung AS [FA.-Pos.-Mat.-Bez.],
dbo.BelegMerkm.[CABN-ATNAM] AS Parameter,
dbo.BelegMerkm.[CABNT-ATBEZ] AS [Para.-Bez.],
dbo.BelegMerkm.[CONF_OUT-ATWRT] AS [Para.-Wert]
FROM dbo.Materialstamm AS Materialstamm_1 RIGHT OUTER JOIN
dbo.BelegStueli ON Materialstamm_1.MaterialNR =
dbo.BelegStueli.[MARA-MATNR] LEFT OUTER JOIN
dbo.BelegMerkm ON dbo.BelegStueli.[VBAK-VBELN] =
dbo.BelegMerkm.[VBAK-VBELN] AND
dbo.BelegStueli.[VBAP-POSNR] =
dbo.BelegMerkm.[VBAP-POSNR] AND dbo.BelegStueli.[AUFK-AUFNR] =
dbo.BelegMerkm.[AUFK-AUFNR] AND
dbo.BelegStueli.[RESB-RSPOS] =
dbo.BelegMerkm.[RESB-RSPOS] RIGHT OUTER JOIN
dbo.Materialstamm AS Materialstamm_2 RIGHT OUTER JOIN
dbo.BelegStueliPos ON Materialstamm_2.MaterialNR =
dbo.BelegStueliPos.[AFPO-MATNR] ON
dbo.BelegStueli.[VBAK-VBELN] =
dbo.BelegStueliPos.[VBAK-VBELN] AND dbo.BelegStueli.[VBAP-POSNR] =
dbo.BelegStueliPos.[VBAP-POSNR] AND
dbo.BelegStueli.[AUFK-AUFNR] =
dbo.BelegStueliPos.[AUFK-AUFNR] RIGHT OUTER JOIN
dbo.BelegPos ON dbo.BelegStueliPos.[VBAK-VBELN] =
dbo.BelegPos.[VBAK-VBELN] AND
dbo.BelegStueliPos.[VBAP-POSNR] =
dbo.BelegPos.[VBAP-POSNR]

ORDER BY Auftrag, Pos, ÜPos, [(1) P-Material], [(2) P-Material],
[P-Mat.-Bez.], [(1) FA-Auftrag], [(2) FA-Auftrag], [FA-Material],
[FA-Mat.-Bez.], [FA-Pos.],
[FA.-Pos.-Material], [FA.-Pos.-Mat.-Bez.], Parameter,
[Para.-Bez.], [Para.-Wert]

Wenn ich nun die Sicht1 mit folgender Sicht (nenen wir sie Sicht2) aufrufe,
würden das Resultset ca 1000 Datensàtze betragen. Nur das Problem ist, das
das Event ca 2.5 min auf sich warten làst.(index auf Auftrag und Pos und
diverse andere sind natürlich vorhanden)

Select * from Sicht1
WHERE (Auftrag = '12003869') AND (Pos = '000100')

Nun habe ich das Ganze in folgende Procedure gepackt und siehe da nach ca
1-2 sec ist das Resultset da.

ALTER procedure [dbo].[BelegPos_V003]
@Auftrag as char(10),
@POs as char(10)
as
SELECT TOP (10000000) dbo.BelegPos.[VBAK-VBELN] AS Auftrag,
dbo.BelegPos.[VBAP-POSNR] AS Pos, dbo.BelegPos.[VBAP-UEPOS] AS ÜPos,
dbo.BelegPos.[VBAP-MATNR] AS [(1) P-Material],
dbo.BelegPos.[VBAP-MATWA] AS [(2) P-Material], dbo.BelegPos.[MAKT-MAKTX] AS
[P-Mat.-Bez.],
dbo.BelegStueliPos.[AUFK-AUFNR] AS [(1) FA-Auftrag],
dbo.BelegStueliPos.[AFKO-MAUFNR] AS [(2) FA-Auftrag],
dbo.BelegStueliPos.[AFPO-MATNR] AS [FA-Material],
Materialstamm_1.Bezeichnung AS [FA-Mat.-Bez.], dbo.BelegStueli.[RESB-RSPOS]
AS [FA-Pos.],
dbo.BelegStueli.[MARA-MATNR] AS [FA.-Pos.-Material],
Materialstamm_2.Bezeichnung AS [FA.-Pos.-Mat.-Bez.],
dbo.BelegMerkm.[CABN-ATNAM] AS Parameter,
dbo.BelegMerkm.[CABNT-ATBEZ] AS [Para.-Bez.],
dbo.BelegMerkm.[CONF_OUT-ATWRT] AS [Para.-Wert]
FROM dbo.Materialstamm AS Materialstamm_1 RIGHT OUTER JOIN
dbo.BelegStueli ON Materialstamm_1.MaterialNR =
dbo.BelegStueli.[MARA-MATNR] LEFT OUTER JOIN
dbo.BelegMerkm ON dbo.BelegStueli.[VBAK-VBELN] =
dbo.BelegMerkm.[VBAK-VBELN] AND
dbo.BelegStueli.[VBAP-POSNR] =
dbo.BelegMerkm.[VBAP-POSNR] AND dbo.BelegStueli.[AUFK-AUFNR] =
dbo.BelegMerkm.[AUFK-AUFNR] AND
dbo.BelegStueli.[RESB-RSPOS] =
dbo.BelegMerkm.[RESB-RSPOS] RIGHT OUTER JOIN
dbo.Materialstamm AS Materialstamm_2 RIGHT OUTER JOIN
dbo.BelegStueliPos ON Materialstamm_2.MaterialNR =
dbo.BelegStueliPos.[AFPO-MATNR] ON
dbo.BelegStueli.[VBAK-VBELN] =
dbo.BelegStueliPos.[VBAK-VBELN] AND dbo.BelegStueli.[VBAP-POSNR] =
dbo.BelegStueliPos.[VBAP-POSNR] AND
dbo.BelegStueli.[AUFK-AUFNR] =
dbo.BelegStueliPos.[AUFK-AUFNR] RIGHT OUTER JOIN
dbo.BelegPos ON dbo.BelegStueliPos.[VBAK-VBELN] =
dbo.BelegPos.[VBAK-VBELN] AND
dbo.BelegStueliPos.[VBAP-POSNR] =
dbo.BelegPos.[VBAP-POSNR]
WHERE (dbo.BelegPos.[VBAK-VBELN] = @Auftrag) and
dbo.BelegPos.[VBAP-POSNR]=@Pos
ORDER BY Auftrag, Pos, ÜPos, [(1) P-Material], [(2) P-Material],
[P-Mat.-Bez.], [(1) FA-Auftrag], [(2) FA-Auftrag], [FA-Material],
[FA-Mat.-Bez.], [FA-Pos.],
[FA.-Pos.-Material], [FA.-Pos.-Mat.-Bez.], Parameter,
[Para.-Bez.], [Para.-Wert]

Nun mein frage: Wenn ich eine Sicht (z.B: Sicht1) ohne Einschrànkung
definiere und sie dann durch eine weitere Sicht (z.B: Sicht2) mit
Einschrànkung aufrufe, führt dann der SQL-Server erst die Sicht 1 ohne
Einschrànkung aus und filter dann auf Basis der Einschrànkung von Sicht 2 die
Datensàtze aus ?

mfg michael
 

Lesen sie die antworten

#1 Olaf Pietsch
13/09/2007 - 18:43 | Warnen spam
Hallo Michael,

"Michael Monarch" schrieb im
Newsbeitrag news:

ich habe folgende Sicht (nenen wir sie mal Sicht1), welche ohne
Einschrànkung ca.2.8 Mio Datensàtze zurückgibt:

SELECT TOP (100) percent dbo.BelegPos.[VBAK-VBELN] AS Auftrag,


...
ORDER BY Auftrag, Pos, ÜPos, [(1) P-Material], [(2) P-Material],


Du scheinst noch mit dem SQL server 2000 zu arbeiten, denn Du verwendest
TOP() in Verbindung mit ORDER BY. Damit nutzt Du einen
"Seiteneffekt" aus. ORDER BY in Views sind so nicht defniert. Im SQL Server
2005 kann man zwar diese Methode noch schreiben, nur ausgeführt wird es
nicht mehr (ORDER BY), weil der Parser es einfach überliest.


Nun mein frage: Wenn ich eine Sicht (z.B: Sicht1) ohne Einschrànkung
definiere und sie dann durch eine weitere Sicht (z.B: Sicht2) mit
Einschrànkung aufrufe, führt dann der SQL-Server erst die Sicht 1 ohne
Einschrànkung aus und filter dann auf Basis der Einschrànkung von Sicht 2
die
Datensàtze aus ?



Was sagt denn der Ausführungplan dazu? Man kann sich im SSMS den
Ausführungplan anschauen.

Gruß Olaf
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Regionalgruppe Köln/Bonn/Düsseldorf
(http://www.sqlpass.de/Regionalgrupp...fault.aspx)

Ähnliche fragen