Announcement

Collapse
No announcement yet.

SQL Performance Verbesserung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Performance Verbesserung

    Hallo zusammen,

    ich habe hier ein sehr inperformantes SQl-Script, vielleicht kann mir ja jemand evtl einen Tuning Tip dazu geben, bin für jeden Tip dankbar, das Script läuft momentan sehr langsam und muss schneller werden:
    Zuletzt editiert von XSLTaskforce; 11.11.2009, 09:38.

  • #2
    Beim MS SQL SErver würde ich sagen: Schmeiß doch mal den Datenbankoptimierungsratgeber an und schau was der sagt. Ansonsten 2 Subselects in solch einem Monster. Da wird ja fast jede SQL-parser so seine Probleme haben ...

    Comment


    • #3
      hallo,

      das Ganze ist zwar ziemlich unübersichtlich, aber wenn ich es richtig aufgedröselt habe, nach den Klammern, kannst Du Dir den kompletten Bereich

      Code:
      (1=1) OR 
            POH.USR_Id=20509  or 
            exists(select 1
                  from PRHCOMPOH, PRH
                  where POH.Id=PRHCOMPOH.POH_Id
                     AND PRH.Id=PRHCOMPOH.PRH_Id
                     AND PRH.USR_Id=20509))
                     AND EXISTS
                  (SELECT POI.Id
                       FROM POI, PRIPOI b
                        WHERE POH_Id=POH.Id
                        AND POI.ItemType=0
                        AND POI.OrderAmount>0
                        AND b.POI_Id=POI.Id
                        AND(
                             ({fn IFNULL((SELECT SUM(R.ccount)
                                          FROM PRIPOIDNI R
                             WHERE R.POI_Id=POI.Id), 0))<{fn IFNULL((SELECT SUM(a.ccount)
                              FROM PRIPOI a
                            WHERE a.PRI_Id=b.PRI_Id), 0))
      sparen. (1=1) oder egal was ist true.

      Gruß
      Uschi

      Comment


      • #4
        Originally posted by XSLTaskforce View Post
        Hallo zusammen,

        ich habe hier ein sehr inperformantes SQl-Script...
        Hallo

        Wenn dir hier jemand mit diesem Teil helfen soll, müsstest du schon etwas mehr Info's posten :

        - DB ?
        - ungefähre Anzahl Datensätze
        - Was heisst "sehr langsam"
        - Was heisst "schneller werden"
        - ...


        Gruss

        Comment


        • #5
          Also es handelt sich um ein Script dass unter Oracle läuft. Ich habe auch herausgefunden warum das Script so langsam ist, nur weiss ich keine Lösung:



          Hier wird für jeden Datensatz, in dem Fall eine Bestellung geprüft, ob eine Bestellposition mit POI.Itemtype =0 existiert, das sind auch die meisten Datensätze. Es handelt sich um etwa 200000 Datensätze die er dann durchgeht und schaut ob deren Itemtype = 0 ist, bei ca. 180000 davon ist das der Fall.

          Hat jemand eine Lösung parat?
          Zuletzt editiert von XSLTaskforce; 11.11.2009, 09:39.

          Comment


          • #6
            Hallo,

            ich bin Dein Staement zwar immer noch nicht im einzelnen durchgegangen, aber wie sieht es denn mit den Indexen auf POI und PRIPOI aus ? was hast Du denn da vorliegen ?

            Gruß
            Uschi

            Comment


            • #7
              Also hab es jetzt mal durchformatiert:

              Code:
              SELECT
                  POH.Id,
                  POH.SupplierName,
                  POH.Id,
                  COM.Name,
                  COM.ClientCode,
                  POH.BuyerOrderRef,
                  POH.SentDate OrderDateTimeFilter,
                  POH.Id,
                  POH.Id,
                  POH.Id,
                  MAX
                  (
                      PRJ.PRJNO
                  )
                  ,
                  PRH.Name,
                  POH.Id,
                  POH.SentDate DeliveryWish,
                  POH.SentDate Delivery,
                  POH.Id Articlename,
                  POH.Id ArticleSuppNo,
                  POH.Id reasontreatmentfilter
              FROM
                  POI LEFT OUTER JOIN PRIPOI ON POI.ID=PRIPOI.POI_IDLEFT OUTER JOIN PRI ON PRIPOI.PRI_ID=PRI.IDLEFT OUTER JOIN PRJ ON PRI.PRJ_ID=PRJ.ID,
                  COM,
                  PRH,
                  PRHCOMPOH,
                  POH
              WHERE
                  (
                      POH.ECOSAttributes<268435456
                      AND
                      POH.DeliveredCom=COM.Id
                      AND
                      PRH.ID=PRHCOMPOH.PRH_ID
                      AND
                      POH.ID=PRHCOMPOH.POH_ID AND{ecos TESTBIT
                      (
                          POH.ECOSAttributes,
                          1048576,
                          false
                      )
                      AND
                      NOT POH.SentDate IS NULL
                      AND
                      (
                          (
                              1=1
                          )
                          OR
                          POH.USR_Id=20509
                          OR
                          exists
                          (
                          SELECT
                              1
                          FROM
                              PRHCOMPOH,
                              PRH
                          WHERE
                              POH.Id=PRHCOMPOH.POH_Id
                              AND
                              PRH.Id=PRHCOMPOH.PRH_Id
                              AND
                              PRH.USR_Id=20509
                          )
                      )
                      AND
                      EXISTS
                      (
                      SELECT
                          POI.Id
                      FROM
                          POI,
                          PRIPOI b
                      WHERE
                          POH_Id=POH.Id
                          AND
                          POI.ItemType=0
                          AND
                          POI.OrderAmount>0
                          AND
                          b.POI_Id=POI.Id
                          AND
                          (
                              (
                                  {fn IFNULL
                                  (
                                      (
                                      SELECT
                                          SUM
                                          (
                                              R.ccount
                                          )
                                      FROM
                                          PRIPOIDNI R
                                      WHERE
                                          R.POI_Id=POI.Id
                                      )
                                      ,
                                      0
                                  )
                              )
                              <{fn IFNULL
                              (
                                  (
                                  SELECT
                                      SUM
                                      (
                                          a.ccount
                                      )
                                  FROM
                                      PRIPOI a
                                  WHERE
                                      a.PRI_Id=b.PRI_Id
                                  )
                                  ,
                                  0
                              )
                          )
                      )
                      AND
                      POH.ID=POI.POH_ID
                  )
                  AND
                  (
                      POH.SentDate>='2009-09-01 00:00:00'
                  )
              GROUP BY
                  POH.Id,
                  POH.SupplierName,
                  COM.Name,
                  COM.ClientCode,
                  POH.BuyerOrderRef,
                  POH.SentDate,
                  PRH.Name
              ORDER BY
                  OrderDateTimeFilter DESC;
              Frage: was ist in POH_Id=POH.Id die POH_Id, Tippfehler ?

              Gruß
              Uschi

              Comment

              Working...
              X