Announcement

Collapse
No announcement yet.

Tabelle im Ram halten

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

  • Tabelle im Ram halten

    Hallo.

    Welche Möglichkeiten gibt es bei Oracle eine, oder wenige Tabellen fix im Ram zu behalten. Es werden nur lesende Zugriffe stattfinden. Es werden sehr viele Daten gelesen. Oder gibt es vielleicht eine eigenständige Applikation?

    Danke.

  • #2
    Wo erwartest du die verbesserungen. I.d.R. werden von DB's primär erst mal die Indize im RAM gehalten. Evtl. reicht es ja einen passenden Index zu definieren.

    Comment


    • #3
      Hallo myope,

      Soweit ich weiß keine!
      Oracle hält die am meisten benutzten Blöcke automatisch in der SGA, so das diese bei mehreren Lesevorgängen mit hoher Wahrscheinlichkeit von dort geholt werden und nicht von Platte gelesen werden müssen. Es gibt zwar ein paar Schrauben an denen man drehen kann um dies zu beeinflussen, aber da sollte man genau wissen was man tut.
      Wie Bernhard schon angedeuted hat, bringt es bei einem Datenbanksystem wie Oracle in aller Regel mehr, die Applikationslogik zu optimieren, anstatt Parameter zu ändern.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Daten permanent im Hauptspeicher

        Hallo myope,

        Oracle arbeitet mit drei verschiedenen Buffer Caches:
        • DEFAULT
        • KEEP
        • RECYCLE
        Wie der Name schon vermuten lässt, ist "KEEP" der Buffer deiner Wahl. Um diesen Buffer zu nutzen, muss der Parameter "DB_KEEP_CACHE_SIZE" in der Datei "init<db>.ora" mit einem Wert belegt sein.

        Die Größe des Caches kannst du z. B. mit
        Code:
        SELECT round(sum(BYTES)/1024/1024) "Size MB"
        from   DBA_SEGMENTS
        where  OWNER        = :owner
        and    SEGMENT_NAME = :table
        /
        
        Size MB
        ----------
        350
        berechnen. Danach trägst du diesen Wert in die "init<db>.ora" ein:
        DB_KEEP_CACHE_SIZE = 350 M
        und startest die DB durch. Jetzt noch ein
        Code:
        ALTER Table <table> Storage( BUFFER_POOL KEEP )
        /
        und alle Daten dieser Tabelle bleiben, nachdem sie eingelesen wurden, permanent im Hauptspeicher.

        Siegfried

        Comment


        • #5
          Erstmal danke für die Antworten.

          @SiegfriedEhlert: kannst du mir sagen ob und wenn wieviel Performancegewinn dadurch enstehen kann?

          Comment


          • #6
            Ich erlaub mir meine Gedanken einzuwerfen:

            generell würde ich sagen, daß es nichts bringt, da: wenn die Tabelle im Speicher platz hat und oft aufgerufen wird und es von anderen Objekten wenig konkurenz bekommt sowieso im Speicher bleibt. Wenn der Speicher nicht ausreicht, dann werden andere Objekte immer wieder aus dem Pool herausgeschmissen und hier bekommt man dann bei Zugriff zusätzliche IO.

            Generell würde ich sagen, daß Oracle den Speicher (Buffer) sicher sehr gut verwaltet und solche Eingriffe nicht nötig sind.

            Was es bringt: das kannst Du dir mit einem Report von einem Snapshot anschauen.

            lg Dietmar

            Comment


            • #7
              Performance-Gewinn

              Hallo myope.

              kannst du mir sagen ob und wenn wieviel Performancegewinn dadurch enstehen kann?
              • ob?
                Ja, falls die relevanten Daten durch das "normale Tagesgeschäft" aus dem Cache verdrängt werden.
              • wieviel?
                Welche Zahlen werden am Samstag im Lotto gezogen?


              Um den Performance-Gewinn abzuschätzen, musst du dir anschauen, wieviele Datenblöcke der fraglichen Tabellen "normalerweise" im Cache sind.
              Code:
              SELECT tbl       "Tabelle"
                  ,  blk       "Blöcke"
                  ,  c         "Cache"
                  ,  100*c/blk "Cache %"
              from(
                  SELECT s.SEGMENT_NAME tbl
                      ,  s.BLOCKS       blk
              	,  o.OBJECT_ID    id
              	,( SELECT count(*)
                         from   V$BH b
              	   where  b.OBJD = o.OBJECT_ID ) c
                  from   DBA_SEGMENTS s
                      ,  DBA_OBJECTS  o
                  where  s.SEGMENT_TYPE = 'TABLE'
                  and	   s.OWNER        = :owner
                  and	   s.SEGMENT_NAME = :table
                  and	   s.OWNER        = o.OWNER
                  and	   s.SEGMENT_NAME = o.OBJECT_NAME
                  and	   s.SEGMENT_TYPE = o.OBJECT_TYPE
              )
              Falls der prozentuale Anteil gegen 100 geht, ist die Aussicht auf einen Performance-Gewinn, wie Dietmar vermutet, gering.

              Aber die Frage lautete ja auch "wie kann ich Daten fix im Hauptspeicher halten?" und nicht " wie wird meine Abfrage schneller?".

              Gruß, Siegfried

              Comment

              Working...
              X