AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Laufzeit von Stored Procedure verkürzen
Thema durchsuchen
Ansicht
Themen-Optionen

Laufzeit von Stored Procedure verkürzen

Ein Thema von Andidreas · begonnen am 4. Okt 2012 · letzter Beitrag vom 18. Okt 2012
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#41

AW: Laufzeit von Stored Procedure verkürzen

  Alt 9. Okt 2012, 09:02
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...

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...
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#42

AW: Laufzeit von Stored Procedure verkürzen

  Alt 9. Okt 2012, 10:39
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, ';'))
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#43

AW: Laufzeit von Stored Procedure verkürzen

  Alt 9. Okt 2012, 14:54
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?
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!

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!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#44

AW: Laufzeit von Stored Procedure verkürzen

  Alt 16. Okt 2012, 16:56
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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#45

AW: Laufzeit von Stored Procedure verkürzen

  Alt 16. Okt 2012, 17:11
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#46

AW: Laufzeit von Stored Procedure verkürzen

  Alt 16. Okt 2012, 17:16
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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#47

AW: Laufzeit von Stored Procedure verkürzen

  Alt 16. Okt 2012, 17:48
Hattet Ihr einen clustered Index erstellt?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#48

AW: Laufzeit von Stored Procedure verkürzen

  Alt 16. Okt 2012, 18:30
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#49

AW: Laufzeit von Stored Procedure verkürzen

  Alt 17. Okt 2012, 09:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#50

AW: Laufzeit von Stored Procedure verkürzen

  Alt 17. Okt 2012, 17:12
Hattet Ihr einen clustered Index erstellt?
Nein, sind Clustred Indexe schneller?

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!

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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.
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