Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Laufzeit von Stored Procedure verkürzen (https://www.delphipraxis.net/170822-laufzeit-von-stored-procedure-verkuerzen.html)

Andidreas 9. Okt 2012 08:02

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat von Furtbichler (Beitrag 1186259)
Pass mal auf Jungelchen. Ich habe explizit geschrieben, das -wenn Du der Verzapfer der Stored Procedure bist- die Bezeichnung Cretin und Vollpfosten nicht auf dich gemünzt ist. Habe ich?

Wo ist den der unterschied ob ich das war oder einer meiner Kollegen/Vorgänger.
Niemand ist perfekt... Aber anscheinend bist Du der Meinung das Du es bist...

Zitat:

Zitat von Furtbichler (Beitrag 1186259)
Ich habe geschrieben, das ich für diese Arbeit 1-2 Tagessätze ansetzen würde.

Vielen Dank für das Angebot, aber für nen "Berater" (oder was auch immer Du darstellst) der schon so Arrogangt hier rumschreibt werden wir kein Geld ausgeben...

Blup 9. Okt 2012 09:39

AW: Laufzeit von Stored Procedure verkürzen
 
Stored Procedure 1 & 2
SQL-Code:
Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2)
.
Da der Unterstrich nicht im Case berücksichtigt wird, könnte man hier einkürzen:
SQL-Code:
Right(ALL_LowestPLC_SKU, 2)
.
Ich würde eine View einsetzen, damit die beiden Abfragen übersichtlicher werden:
SQL-Code:
Select *,
       CASE WHEN Right(ALL_LowestPLC_SKU, 1) = '#' OR
                 Right(ALL_LowestPLC_SKU, 2) IN ('00', '10', '20') THEN 1 ELSE 0 END as PLC_Lower25,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) = '25'               THEN 1 ELSE 0 END as PLC_25,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) = '30'               THEN 1 ELSE 0 END as PLC_30,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) = '40'               THEN 1 ELSE 0 END as PLC_40,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) IN ('50', '55')      THEN 1 ELSE 0 END as PLC_50_55,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) = '60'               THEN 1 ELSE 0 END as PLC_60,
       CASE WHEN Right(ALL_LowestPLC_SKU, 2) = '70'               THEN 1 ELSE 0 END as PLC_70,
                                                                        1            as PLC_total
From [inventory].[dbo].[inventory.inv_test]
Stored Procedure 3 - 6

Ebenfalls eine View:
SQL-Code:
Select *,
       CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN 1 ELSE 0 END as PLC_Lower25,
       CASE WHEN ALL_PLC = '25'                    THEN 1 ELSE 0 END as PLC_25,
       CASE WHEN ALL_PLC = '30'                    THEN 1 ELSE 0 END as PLC_30,
       CASE WHEN ALL_PLC = '40'                    THEN 1 ELSE 0 END as PLC_40,
       CASE WHEN ALL_PLC IN ( '50', '55')          THEN 1 ELSE 0 END as PLC_50_55,
       CASE WHEN ALL_PLC = '60'                    THEN 1 ELSE 0 END as PLC_60,
       CASE WHEN ALL_PLC = '70'                    THEN 1 ELSE 0 END as PLC_70,
                                                         1            as PLC_total
From [inventory].[dbo].[inventory.inv_test]
Am Beispiel Procedure 3:
SQL-Code:
Select SUM(PLC_Lower25 * ALL_AvailableStock) as PLC_Lower25,
       SUM(PLC_25      * ALL_AvailableStock) as PLC_25,
       SUM(PLC_30      * ALL_AvailableStock) as PLC_30,
       SUM(PLC_40      * ALL_AvailableStock) as PLC_40,
       SUM(PLC_50_55   * ALL_AvailableStock) as PLC_50_55,
       SUM(PLC_60      * ALL_AvailableStock) as PLC_60,
       SUM(PLC_70      * ALL_AvailableStock) as PLC_70,
       SUM(PLC_TOTAL  * ALL_AvailableStock) as PLC_Total
From  MyView2
Where ALL_Brand      In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';')) And
       ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))

mkinzler 9. Okt 2012 13:54

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat von Andidreas:
Das man hier als Cretin oder Vollpfosten bezeichnet wird hat mich jetzt nicht so gestört, es ist ja niemand Allwissend (naja manche meines es vielleicht)...
Pass mal auf Jungelchen. Ich habe explizit geschrieben, das -wenn Du der Verzapfer der Stored Procedure bist- die Bezeichnung Cretin und Vollpfosten nicht auf dich gemünzt ist. Habe ich?
:warn: Es macht keinen Unterschied, wer der Urheber der Datenbank(-struktur) ist. Diese ist nicht optimal (man könnte auch sagen schlecht); dies rechtfertigt aber nicht dazu, den Urheber als Vollpfosten oder als Cretin zu beschimpfen!:wall:

Zitat:

Zitat von Furtbichler:
Dann: Schäm dich und frag nächstes Mal.
Auch das wird ihm bei seinem Problem nicht helfen.

Zitat:

Ja, ne. Also. Das gilt auch für dich, Daniel 'OberAdmin'. Lesen ist wichtig. Verstehen noch mehr.
Ich hatte deinen Beitrag an Daniel gemeldet, weil ich nicht in den Verdacht geraten wollte, dass das hier als Retourkutsche für deinen Meinungsäusserung bezüglich den Aufgaben von uns Moderatoren hier im Forum ( "Raushalten und Schauze halten") ist.
Und mich kotzt es nun natürlich an, dass er deshlab von dir in deiner eigen Art mit Hohn überschüttet wird!
Daniel ist hier der Admin un bezahlt die Rechnungen für Hosting usw. und haftet u.U. Deshalb hat er das Recht festzulegen, welcher Umgangston hier als angemessen gilt und wenn er der Meinung ist ( wie viele andere inkl. mir auch), dass deine Ausdrucksweise nicht angemessen ist, dann hast du dich dem zu fügen!

Andidreas 16. Okt 2012 15:56

AW: Laufzeit von Stored Procedure verkürzen
 
Wir haben die letzten Tage die Queries / Stored Procedures und das Datenbank Design getestet...
Hierbei ist uns etwas aufgefallen was wir uns nicht ganz erklären können...

Normalerweise ist es bei Datenbanken ja so das komplexe Abfragen durch das anlegen von Indexen (gemäß den Where Klauseln) performanter gemacht werden können.
Bei der MS SQL ist uns aber aufgefallen das die Abfragen (in Summe) ohne Indexe ca. 20 Sekunden schneller ausgeführt werden!

Eine Ursache könnte sein das die Datenbank durch das prüfen welcher Index verwendet werden soll Zeit verliert.

Aber selbst wenn im SQL Statement die zu verwendenden Indexe mitgegeben werden (über WITH) sind die Abfragen in Summe ca. 3 - 4 Sekunden langsamer als wenn keine Indexe auf der Tabelle liegen.

Woran kann das liegen?

p80286 16. Okt 2012 16:11

AW: Laufzeit von Stored Procedure verkürzen
 
hast Du denn mal einen Blick in den Query plan geworfen?
Ist schon etwas her, daß ich praktisch mit MS-SQL gearbeitet habe, aber des MS-Client sollte das eigentlich hergeben.

Gruß
K-H

Andidreas 16. Okt 2012 16:16

AW: Laufzeit von Stored Procedure verkürzen
 
Ja, den haben wir uns angeschaut und der macht das ganze noch unverständlicher.

1. Query über den Ausführungsplan geprüft --> Ergebnis, es wird ein Index vorgeschlagen.
2. Vorgeschlagenen Index angelegt --> Ergebnis, Query minimal schneller.
3. Vorgeschlagenen Index wieder gelöscht und Query erneut über den Ausführungsplan geprüft --> Ergebnis, Es wird kein Index mehr vorgeschlagen!!!

Edit
Nachdem wir den von der MS SQL vorgeschlagenen Index wieder gelöscht haben, sollte doch wieder der fehlende Index vorgeschlagen werden oder sehe ich das falsch?

Bummi 16. Okt 2012 16:48

AW: Laufzeit von Stored Procedure verkürzen
 
Hattet Ihr einen clustered Index erstellt?

jobo 16. Okt 2012 17:30

AW: Laufzeit von Stored Procedure verkürzen
 
Hast Du noch Converts o.ä. Funktionen in den joins? Das ist nicht schön für Indizes. Die gesamte Abfrage sieht sowieso nach FullScan aus, Index hilft da nichts.
Bin kein MSSQL Meister, aber vielleicht gibts da auch sowas wie Statistics Tabellen, die der Query Optimizer zur Berechnung heranzieht. Wenn die nicht passend aktuell sind, kommt Murx raus (kann).

Ein Index würde m.E. Sinn machen, wenn eine zeitabhängige Dimension in der Tabelle und den Abfragen wäre.

Blup 17. Okt 2012 08:48

AW: Laufzeit von Stored Procedure verkürzen
 
Index und Abfrage müssen zusammen passen. Eine Abfrage die für eine Tabelle zugleich mehrere Indexe nutzt, ist in der Regel ineffektiv. Von der Laufzeit ist "In" meist sehr teuer.

Ich würde die Abfrage von Oben im Prinzip so umstellen (hab grad kein MS-SQL):
SQL-Code:
CREATE INDEX IDX_Brand_ProductLine ON [inventory].[dbo].[inventory.inv_test] (ALL_Brand, ALL_ProductLine);

select SUM(PLC_Lower25 * ALL_AvailableStock) as PLC_Lower25,
       SUM(PLC_25 * ALL_AvailableStock) as PLC_25,
       SUM(PLC_30 * ALL_AvailableStock) as PLC_30,
       SUM(PLC_40 * ALL_AvailableStock) as PLC_40,
       SUM(PLC_50_55 * ALL_AvailableStock) as PLC_50_55,
       SUM(PLC_60 * ALL_AvailableStock) as PLC_60,
       SUM(PLC_70 * ALL_AvailableStock) as PLC_70,
       SUM(PLC_TOTAL * ALL_AvailableStock) as PLC_Total
from
      [inventory].[dbo].[fnSplit](@Brand, ';') a,
      [inventory].[dbo].[fnSplit](@Productline, ';') b
left join MyView2 c on (c.ALL_Brand = a.Value) and (c.ALL_ProductLine = b.Value);
Hier wird eine Art Kreuztabelle aus den Werten aus "Brand" und "Produktline" erstellt.
Mit jeder Kombination erfolgt dann jeweils eine Abfrage der eigentlichen Datentabelle.
Durch den Index müssen dabei nur die Datensätze gelesen werden, die der jeweiligen Kombination entsprechen.

Sind nur zwei getrennte Indexe (einer über ALL_BRAND und ein anderer über ALL_ProductLine) vorhanden, ist die Abfrage um ein vielfaches langsamer.

Andidreas 17. Okt 2012 16:12

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat von Bummi (Beitrag 1187304)
Hattet Ihr einen clustered Index erstellt?

Nein, sind Clustred Indexe schneller?

Zitat:

Zitat von jobo (Beitrag 1187307)
Hast Du noch Converts o.ä. Funktionen in den joins? Das ist nicht schön für Indizes. Die gesamte Abfrage sieht sowieso nach FullScan aus, Index hilft da nichts.

Nein, ich habe mir mittlerweile eine Test Tabelle angelegt in der alle Felder die richtigen Feldtypen haben!

Zitat:

Zitat von Blup (Beitrag 1187344)
Sind nur zwei getrennte Indexe (einer über ALL_BRAND und ein anderer über ALL_ProductLine) vorhanden, ist die Abfrage um ein vielfaches langsamer.

Gilt das auch wenn z.B. Index1 und Index2 jeweils die Felder ALL_Brand und ALL_Productline beinhalten?

Bummi 17. Okt 2012 18:21

AW: Laufzeit von Stored Procedure verkürzen
 
Clustered bedeutet dass die Daten physikalisch dem Index entsprechend sortiert werden. Eine Ausführung des Indexoptimierers, nach dem Löschen eines solchen Indexes, kann diesen auf die Idee bringen dass ein weitere Index nicht benötigt würde.

Andidreas 18. Okt 2012 13:14

AW: Laufzeit von Stored Procedure verkürzen
 
Also Clustered Indexe hatten wir noch keine erstellt!

Wir haben aber gerade testweise welche erstellt, aber keine von den getesteten brachte eine Performance Verbesserung.

D.h. die Daten werden immernoch ohne Indexe schneller ermittelt und berrechnet als mit :roll:

Blup 18. Okt 2012 13:20

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat:

Zitat von Blup (Beitrag 1187344)
Sind nur zwei getrennte Indexe (einer über ALL_BRAND und ein anderer über ALL_ProductLine) vorhanden, ist die Abfrage um ein vielfaches langsamer.

Gilt das auch wenn z.B. Index1 und Index2 jeweils die Felder ALL_Brand und ALL_Productline beinhalten?
Ja, wenn die Abfrage tatsächlich beide Indexe verwendet ist das langsam.
Dazu sieht man sich am besten den Ausführungsplan an.
Es ist nicht nur wichtig das die in der Bedingung verwendeten Felder im enthalten sind, diese sollten auch an erster Stelle im Index definiert sein.
Zitat:

D.h. die Daten werden immernoch ohne Indexe schneller ermittelt und berrechnet als mit
Dann sind entweder die Indexe für die Abfragen nicht geeignet oder die Abfragen ungünstig formuliert.
Bitte mal beides posten.

Andidreas 18. Okt 2012 13:36

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat von Andidreas (Beitrag 1186238)
SQL-Code:

/* Stored Procedure 1 */
Select
SUM(PLC_Lower25) as PLC_Lower25, SUM(PLC_25) as PLC_25, SUM( PLC_30) as PLC_30,
SUM( PLC_40 ) as PLC_40, SUM(PLC_50_55) as PLC_50_55, SUM(PLC_60) as PLC_60,
SUM(PLC_70) as PLC_70, SUM(PLC_TOTAL) as PLC_Total
From
(
Select CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) IN ('00', '10', '20') OR Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 1) IN ('#') THEN 1 ELSE 0 END as PLC_Lower25,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = ('25') THEN 1 ELSE 0 END as PLC_25,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = ('30') THEN 1 ELSE 0 END as PLC_30,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '40' THEN 1 ELSE 0 END as PLC_40,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) IN ( '50', '55') THEN 1 ELSE 0 END as PLC_50_55,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '60' THEN 1 ELSE 0 END as PLC_60,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '70' THEN 1 ELSE 0 END as PLC_70,
       1 as PLC_total
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
 AND  (ALL_AvailableStock > 0
 OR    ALL_Pir > 0
 OR    ALL_Pir1 > 0
 OR    ALL_Pir2 > 0
 OR    ALL_Pir3 > 0)
Group By (ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU)
) TempTable


/* Stored Procedure 2 */
Select
SUM(PLC_Lower25) as PLC_Lower25, SUM(PLC_25) as PLC_25, SUM( PLC_30) as PLC_30,
SUM( PLC_40 ) as PLC_40, SUM(PLC_50_55) as PLC_50_55, SUM(PLC_60) as PLC_60,
SUM(PLC_70) as PLC_70, SUM(PLC_TOTAL) as PLC_Total
From
(
Select CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) IN ('00', '10', '20') OR Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 1) IN ('#') THEN 1 ELSE 0 END as PLC_Lower25,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = ('25') THEN 1 ELSE 0 END as PLC_25,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = ('30') THEN 1 ELSE 0 END as PLC_30,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '40' THEN 1 ELSE 0 END as PLC_40,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) IN ( '50', '55') THEN 1 ELSE 0 END as PLC_50_55,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '60' THEN 1 ELSE 0 END as PLC_60,
       CASE WHEN Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2) = '70' THEN 1 ELSE 0 END as PLC_70,
       1 as PLC_total
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
 AND  (ALL_ClosingStockQTY > 0
 OR    ALL_IssueQTY > 0)
Group By (ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU)
) TempTable


/* Stored Procedure 3 */
Select
SUM(PLC_Lower25) as PLC_Lower25, SUM(PLC_25) as PLC_25, SUM( PLC_30) as PLC_30,
SUM( PLC_40 ) as PLC_40, SUM(PLC_50_55) as PLC_50_55, SUM(PLC_60) as PLC_60,
SUM(PLC_70) as PLC_70, SUM(PLC_TOTAL) as PLC_Total
From
(
Select CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN ALL_AvailableStock ELSE 0 END as PLC_Lower25,
       CASE WHEN ALL_PLC = ('25') THEN ALL_AvailableStock ELSE 0 END as PLC_25,
       CASE WHEN ALL_PLC = ('30') THEN ALL_AvailableStock ELSE 0 END as PLC_30,
       CASE WHEN ALL_PLC = '40' THEN ALL_AvailableStock ELSE 0 END as PLC_40,
       CASE WHEN ALL_PLC IN ( '50', '55') THEN ALL_AvailableStock ELSE 0 END as PLC_50_55,
       CASE WHEN ALL_PLC = '60' THEN ALL_AvailableStock ELSE 0 END as PLC_60,
       CASE WHEN ALL_PLC = '70' THEN ALL_AvailableStock ELSE 0 END as PLC_70,
       ALL_AvailableStock as PLC_total
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
) TempTable


/* Stored Procedure 4 */
Select
SUM(PLC_Lower25) as PLC_Lower25, SUM(PLC_25) as PLC_25, SUM( PLC_30) as PLC_30,
SUM( PLC_40 ) as PLC_40, SUM(PLC_50_55) as PLC_50_55, SUM(PLC_60) as PLC_60,
SUM(PLC_70) as PLC_70, SUM(PLC_TOTAL) as PLC_Total
From
(
Select CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN ALL_ClosingStockQTY ELSE 0 END as PLC_Lower25,
       CASE WHEN ALL_PLC = ('25') THEN ALL_ClosingStockQTY ELSE 0 END as PLC_25,
       CASE WHEN ALL_PLC = ('30') THEN ALL_ClosingStockQTY ELSE 0 END as PLC_30,
       CASE WHEN ALL_PLC = '40' THEN ALL_ClosingStockQTY ELSE 0 END as PLC_40,
       CASE WHEN ALL_PLC IN ( '50', '55') THEN ALL_ClosingStockQTY ELSE 0 END as PLC_50_55,
       CASE WHEN ALL_PLC = '60' THEN ALL_ClosingStockQTY ELSE 0 END as PLC_60,
       CASE WHEN ALL_PLC = '70' THEN ALL_ClosingStockQTY ELSE 0 END as PLC_70,
       ALL_ClosingStockQTY as PLC_total
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
) TempTable


/* Stored Procedure 5 */
Select
CASE WHEN SUM(PIR_Lower25) = 0 THEN 0 ELSE (SUM(Stock_Lower25) / (SUM(PIR_Lower25)/77.4)) END as PLC_Lower25,
CASE WHEN SUM(PIR_25) = 0 THEN 0 ELSE (SUM(Stock_25) / (SUM(PIR_25)/77.4)) END as PLC_25,
CASE WHEN SUM(PIR_30) = 0 THEN 0 ELSE (SUM(Stock_30) / (SUM(PIR_30)/77.4)) END as PLC_30,
CASE WHEN SUM(PIR_40) = 0 THEN 0 ELSE (SUM(Stock_40) / (SUM(PIR_40)/77.4)) END as PLC_40,
CASE WHEN SUM(PIR_50_55) = 0 THEN 0 ELSE (SUM(Stock_50_55) / (SUM(PIR_50_55)/77.4)) END as PLC_50_55,
CASE WHEN SUM(PIR_60) = 0 THEN 0 ELSE (SUM(Stock_60) / (SUM(PIR_60)/77.4)) END as PLC_60,
CASE WHEN SUM(PIR_70) = 0 THEN 0 ELSE (SUM(Stock_70) / (SUM(PIR_70)/77.4)) END as PLC_70,
CASE WHEN SUM(PIR_Total) = 0 THEN 0 ELSE (SUM(Stock_Total) / (SUM(PIR_Total)/77.4)) END as PLC_Total
From
(
Select CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_Lower25,
      CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN ALL_AvailableStock ELSE 0 END as Stock_Lower25,      
      CASE WHEN ALL_PLC IN ('25') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_25,
      CASE WHEN ALL_PLC IN ('25') THEN ALL_AvailableStock ELSE 0 END as Stock_25,      
      CASE WHEN ALL_PLC IN ('30') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_30,
      CASE WHEN ALL_PLC IN ('30') THEN ALL_AvailableStock ELSE 0 END as Stock_30,      
      CASE WHEN ALL_PLC IN ('40') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_40,
      CASE WHEN ALL_PLC IN ('40') THEN ALL_AvailableStock ELSE 0 END as Stock_40,      
      CASE WHEN ALL_PLC IN ('50', '55') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_50_55,
      CASE WHEN ALL_PLC IN ('50', '55') THEN ALL_AvailableStock ELSE 0 END as Stock_50_55,      
      CASE WHEN ALL_PLC IN ('60') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_60,
      CASE WHEN ALL_PLC IN ('60') THEN ALL_AvailableStock ELSE 0 END as Stock_60,      
      CASE WHEN ALL_PLC IN ('70') THEN (ALL_PIR+ALL_PIR1+ALL_PIR2) ELSE 0 END as PIR_70,
      CASE WHEN ALL_PLC IN ('70') THEN ALL_AvailableStock ELSE 0 END as Stock_70,      
       (ALL_PIR+ALL_PIR1+ALL_PIR2) as PIR_Total,
       ALL_AvailableStock as Stock_Total      
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
) TempTable


/* Stored Procedure 6 */
Select
(SUM(ClosingStock_Lower25) / (SUM(IssueQTY_Lower25)/77.4)) as PLC_Lower25,
(SUM(ClosingStock_25) / (SUM(IssueQTY_25)/77.4)) as PLC_25,
(SUM(ClosingStock_30) / (SUM(IssueQTY_30)/77.4)) as PLC_30,
(SUM(ClosingStock_40) / (SUM(IssueQTY_40)/77.4)) as PLC_40,
(SUM(ClosingStock_50_55) / (SUM(IssueQTY_50_55)/77.4)) as PLC_50_55,
(SUM(ClosingStock_60) / (SUM(IssueQTY_60)/77.4)) as PLC_60,
(SUM(ClosingStock_70) / (SUM(IssueQTY_70)/77.4)) as PLC_70,
(SUM(ClosingStock_Total) / (SUM(IssueQTY_Total)/77.4)) as PLC_Total
From
(
Select CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_Lower25,
      CASE WHEN ALL_PLC IN ('#', '00', '10', '20') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_Lower25,      
      CASE WHEN ALL_PLC IN ('25') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_25,
      CASE WHEN ALL_PLC IN ('25') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_25,      
      CASE WHEN ALL_PLC IN ('30') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_30,
      CASE WHEN ALL_PLC IN ('30') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_30,      
      CASE WHEN ALL_PLC IN ('40') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_40,
      CASE WHEN ALL_PLC IN ('40') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_40,      
      CASE WHEN ALL_PLC IN ('50', '55') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_50_55,
      CASE WHEN ALL_PLC IN ('50', '55') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_50_55,      
      CASE WHEN ALL_PLC IN ('60') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_60,
      CASE WHEN ALL_PLC IN ('60') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_60,      
      CASE WHEN ALL_PLC IN ('70') THEN ALL_ClosingStockQTY ELSE 0 END as ClosingStock_70,
      CASE WHEN ALL_PLC IN ('70') THEN ALL_IssueQTY ELSE 0 END as IssueQTY_70,      
       ALL_ClosingStockQTY as ClosingStock_Total,
       ALL_IssueQTY as IssueQTY_Total      
 From [inventory].[dbo].[inventory.inv_test]
 Where ALL_Brand In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Brand, ';'))
 And ALL_ProductLine In (SELECT Value FROM [inventory].[dbo].[fnSplit](@Productline, ';'))
) TempTable

Anbei der Clustered Index:

SQL-Code:

Create Clustered Index inv_test_cluster
On [inventory].[dbo].[inventory.inv_test]
(all_brand, all_productline)

Blup 18. Okt 2012 15:01

AW: Laufzeit von Stored Procedure verkürzen
 
Jede deiner Abfragen verarbeitet alle Datensätze der gesamten Tabelle und benutzt dafür aufwendige Stringfunktionen.
So wie die Abfragen jetzt formuliert sind, kann der Index nicht genutzt werden.

In #42 und #49 sind meine Vorschläge, wie man die Abfragen übersichtlicher darstellen und für die Nutzung des Index optimieren kann.
SQL View

jobo 18. Okt 2012 15:36

AW: Laufzeit von Stored Procedure verkürzen
 
Zitat:

Zitat von Blup (Beitrag 1187493)
Jede deiner Abfragen verarbeitet alle Datensätze der gesamten Tabelle

sag ich doch :)
Zitat:

Zitat von jobo (Beitrag 1187307)
Die gesamte Abfrage sieht sowieso nach FullScan aus, Index hilft da nichts.



Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz