![]() |
AW: Laufzeit von Stored Procedure verkürzen
Zitat:
Niemand ist perfekt... Aber anscheinend bist Du der Meinung das Du es bist... Zitat:
|
AW: Laufzeit von Stored Procedure verkürzen
Stored Procedure 1 & 2
SQL-Code:
Da der Unterstrich nicht im Case berücksichtigt wird, könnte man hier einkürzen:
Right((ALL_MaterialGrid + '_' + ALL_LowestPLC_SKU), 2)
.
SQL-Code:
Ich würde eine View einsetzen, damit die beiden Abfragen übersichtlicher werden:
Right(ALL_LowestPLC_SKU, 2)
.
SQL-Code:
Stored Procedure 3 - 6
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] Ebenfalls eine View:
SQL-Code:
Am Beispiel Procedure 3:
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]
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, ';')) |
AW: Laufzeit von Stored Procedure verkürzen
Zitat:
Zitat:
Zitat:
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! |
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? |
AW: Laufzeit von Stored Procedure verkürzen
hast Du denn mal einen Blick in den
![]() Ist schon etwas her, daß ich praktisch mit MS-SQL gearbeitet habe, aber des MS-Client sollte das eigentlich hergeben. Gruß K-H |
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? |
AW: Laufzeit von Stored Procedure verkürzen
Hattet Ihr einen clustered Index erstellt?
|
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. |
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:
Hier wird eine Art Kreuztabelle aus den Werten aus "Brand" und "Produktline" erstellt.
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); 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. |
AW: Laufzeit von Stored Procedure verkürzen
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz