Autor Thema: Performance bei über 61000 Doc  (Gelesen 3184 mal)

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Performance bei über 61000 Doc
« am: 02.07.03 - 10:48:39 »
Ich habe eine NDB in die ich um die 61000 Datensätze über ODBC (Access) einspiele in (DB  größe ca. 300 MB ohne anhänge etc.) Form von Dokumenten. Die Dokumente lasse ich mir dann in einer Ansicht anzeigen.

Die Performance bereitet mir hierbei große sorgen. Lokal ist es noch erträglich. Auf dem Server jedoch ist die DB sogut wie zu nichts zu gebrauchen. Der Import dauert ca. 40 min (Lokal nur 4 min) bis der Index erstellt ist dauert es nochmals min 1/4 Stunde. Bis alles so läuft wie es sein soll hat es bei letzten Import 2 Stunden gedauert. Der Vorgang, also Löschen und Neuimport erfolgt 2 mal die Woche, das zusammengerechnet, ist man fasst schon nur noch damit beschäftigt die DB zu pflägen. Der Server selbst ist ein Compaq DL380 der neusten Generation es arbeiten lediglich 2000 User mit dem Notes Server (hautsächlich jedoch E-Mail verkehr).

Kann mir jemand Erfahrungswerte bezüglich der Performance einer NDB die sich in der Dokumentenanzahl wie bei meinen NDB bewegt schildern. Oder Tips geben wie ich die Performance steigern könnte.

Gruß

AMA

P.S: Die DB enthält 11 Ansichten. Ich denke, dass es auch eine große Rolle spielt. Oder ?
« Letzte Änderung: 02.07.03 - 11:59:02 von Don Pasquale »

Offline MartinG

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.802
  • Geschlecht: Männlich
Re:Performance bei über 61000 Doc
« Antwort #1 am: 02.07.03 - 11:17:39 »
Bin auch nicht so der ganz grosse Crack in Programmierung. Was ich aber bei unseren grossen DB (auch Importe - i.d.R. aus der AS400 per ODBC) auch schon gemerkt habe ist folgendes:

Bei vielen Datensätzen sollte man keine Spaltenformeln in Ansichten einsetzen, möglichst wenig Spalten in Ansichten, möglichst wenig Ansichten selber, keine gelesen - ungelesen Markierungen...

Was ich nicht ganz nachvollziehen kann wieso der Clientimport umsoviel schneller als auf dem Server ist.... -  wobei 2000 User natürlich auch nicht gerade wenig ist..
Martin
Wir leben zwar alle unter dem gleichen Himmel, aber wir haben nicht den gleichen Horizont.
KONRAD ADENAUER

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:Performance bei über 61000 Doc
« Antwort #2 am: 02.07.03 - 11:30:08 »
Wo liegt genau das Problem:
- in der Dauer des Imports?
- in der Responsivität der Notes Datenbank?

Für Dauer des Import:

alle Datensätze löschen und dann alles neu importieren ist natürlich auch eine heftige Form der Systemintegration  ::)

Gibt es nicht eine Möglichkeit irgendwie in den Access-Tabellen Infos zu hinterlegen, wann dieser Datensatz das letzte mal geändert wurde und dann nur die neu-geänderten zu importieren?

Für Responsivität der NotesDatenbank:

s. Martins Beitrag.
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline Wipe

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 873
  • Geschlecht: Männlich
Re:Performance bei über 61000 Doc
« Antwort #3 am: 02.07.03 - 11:30:23 »
Hallo SnooP,

ich packe alles was ich für eine Ansicht brauche in ein berechnetes Feld innerhalb der Maske, daß ich dann später für die Ansicht heranziehe.

Glombi

  • Gast
Re:Performance bei über 61000 Doc
« Antwort #4 am: 02.07.03 - 11:46:11 »
Hi,
importiert Du jedesmal 61000  Dokumente  :o :o  :o

Wie importierst Du: hast Du evtl. einen Script Agenten: Dann könntest Du checken, ob sich was im Datensatz geändert hat. Falls nicht, muss auch nix importiert werden.

Andreas

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re:Performance bei über 61000 Doc
« Antwort #5 am: 02.07.03 - 12:00:45 »
Deine Performance ist ziemlich beeindruckent.
Ich habe mal einen Import von 5000 Dokumenten über ODBC gemacht und das dauerte schon gut eine halbe Stunde.

Ciao
Don Pasquale

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #6 am: 02.07.03 - 12:07:12 »
@MartinG

Benutze keine Spaltenformeln nur Feldwerte.
gelesen - ungelesen Markierungen ist deaktiviert.
Ansichten ja wie gesagt, habe 11 davon.

@Axel_Janssen

Mein Problem ist die Import Performance. Wie schon erwähnt Lokal 4 min auf dem Server das 10´fache. Habe schon überlegt Nachts Agent laufen zu lassen.

Problem 2 ist. Die Ansichten an sich benötigen mindestens 1/4 bis 3/4 Stunde bis der Index erstellt ist.

Zitat:
=======================
alle Datensätze löschen und dann alles neu importieren ist natürlich auch eine heftige Form der Systemintegration  

Gibt es nicht eine Möglichkeit irgendwie in den Access-Tabellen Infos zu hinterlegen, wann dieser Datensatz das letzte mal geändert wurde und dann nur die neu-geänderten zu importieren?
=======================

Ja, ich weiß ist nicht grade die feine Art. Die Daten werden aus einer Anwendung heraus generiert. Es ist nur sehr umständlich alte Einträge zu kennzeichnen.


@Bubble

Brauche eine Volltextindizierte DB mit der ich auch nach Feldwerten suchen kann. Somit wird das, denke ich, etwas problematisch.

@Glombi

Ich löse mein Import über einen AcktionButton aus. Könnte es jedoch in ein Agent packen währe evtl. eine Möglichkeit. Werde mal schauen was ich machen kann.

Bedanke mich für die zahlreichen Statements.

AMA

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #7 am: 02.07.03 - 12:10:11 »
@Don Pasquale


Tja, das sieht mir schon sehr nach "schon alles aus Notes rausgeholt was nur geht"  ;)

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #8 am: 04.07.03 - 19:55:07 »
Da bin ich wieder.

Ich habe doch beschlossen die Daten die ich über ODBC ca. 2 mal die Woche einspiele mit den schon vorhandenen im Notes zu vergleichen und nur die neuen Daten zu Importieren und ggf. alte Daten zu aktuallisieren.

Anbei lege ich mein script mit dem ich die Daten Importiere.

Hat jemand eine Lösung bzw. ein Script, den ich anpassen könnte, um mein Vorhaben zu realisieren ? Ich kann mir vorstellen, dass es in der Richtung schon was gibt.

Danke im Voraus.

Sub Click(Source As Button)
   
REM  Notes Objects Declarations
   Dim session As New NotesSession
   Dim ws As New NotesUIWorkspace
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim doc As NotesDocument
   Dim con As New ODBCConnection
   Dim qry As New ODBCQuery
   Dim result As New ODBCResultSet
   
REM  Miscellaneous module variables
   Dim msg As String
   Dim FieldCount As Integer
   Dim Status As Integer
   
REM  MS Access Database declarations
   Const adbFileName = "bever"  ' This is the DSN Name as registered in ODBC
   Const adbTableName = "KostenstellenSelektionTbl"  ' This is a table in the northwind database
   
REM  Notes Database declarations
   Const ndbViewName = "vtranskostenstellen"  ' This is an existing View in the target database
   Const ndbFormName = "mtranskostenstellen"  ' This is an existing Form in the target database
   
REM  Instantiate the major Notes objects
   Set db = session.CurrentDatabase    
   Set view = db.GetView( ndbViewName )
   
REM  Connect to the MS Access Database.  Throw an error if it fails
   status = con.ConnectTo( adbFileName )
   If Not con.IsConnected Then
      Messagebox "Could not connect to " & adbFileName & " database -- Did you register the ODBC Data Source???",, "Error"
      Exit Sub
   End If
   If con.GetError <> DBstsSUCCESS Then
      Messagebox con.GetExtendedErrorMessage,, "Connection Error - " & con.GetError & " " & con.GetErrorMessage
      Exit Sub
   End If
   Print "Connected to " & adbFileName & " database"  ' Update the Notes Client Status Bar if we're okay
   
REM  If we got this far, we must be connected, so just for grins,  let's show the user all the fields in this table.
REM  Note:  "fields" has not been declared, so it will be a Variant Array -- that's what we want
   fields = con.ListFields( adbTableName )
   msg = adbTableName & " contains the following fields:" & Chr(10)
   For FieldCount = Lbound( fields ) To Ubound( fields )
      msg = msg & Chr(10) & fields( FieldCount )
   Next
REM  Okay, let's display the Field List to the User...
   Messagebox msg,, "Fields from the " & adbFileName & " database"
   
REM  We made it this far, so let's setup the SQL Query.  Throw an error if it fails
   Set qry.Connection = con
   Set result.Query = qry
   qry.SQL = "SELECT * FROM " & adbTableName  ' Grab all of the fields (columns) from the specified table
   If qry.GetError <> DBstsSUCCESS Then
      Messagebox qry.GetExtendedErrorMessage,, "Query Error" & qry.GetError & " " & qry.GetErrorMessage
      Exit Sub
   End If
   
REM  Update the Notes Client Status Bar
   Print "Reading" & adbFileName & " database"  ' Update the Notes Client Status Bar if we're okay
   
REM  Must be okay -- Get the Data
   result.Execute
   result.CacheLimit = DB_NONE
REM  See if we have data.  If so, loop through the ResultSet.  If not, throw an error
   If result.IsResultSetAvailable Then
      Do
         result.NextRow
        REM  Create a Notes Document, assign values, save the document.  Do it until we're done.
         Set doc = db.CreateDocument  ' Create a new Notes Document for this record
         doc.Form = ndbFormName
        REM  Okay -- Let's get serious -- We'll use the MS Access Database field (Column)
        REM  names for the field names in the Notes Documents
         doc.Name = result.GetValue( "Name" )
         doc.Rolle = result.GetValue( "Rolle" )
         doc.DimElementBez =  result.GetValue( "DimElementBez" )
         doc.Unit =  result.GetValue( "Unit" )
         doc.Replikation =  result.GetValue( "Replikation" )
         doc.KTelefon =  result.GetValue( "Telefon" )
         doc.KStatus =  result.GetValue( "Status" )
         doc.KEMail =  result.GetValue( "EMail" )
         doc.Recht =  result.GetValue( "Recht" )    
         doc.Personal =  result.GetValue( "Personal" )    
         doc.Sach =  result.GetValue( "Sach" )    
         Call doc.save( True, False )
      Loop Until result.IsEndOfData
      
    REM  We're done, so let's clean up the mess we've made and bail out  
      result.Close( DB_CLOSE )
      Print "Finished"  ' Update the Notes Client Status Bar if we're okay
   Else
    REM  If we got here, it means there was no data in the table, so throw an error (Informational)
      Messagebox "No data retrieved for " & adbTableName & " table", MB_ICONINFORMATION, "No data"
      Print "DOH!!!!!  Got no data -- Bummer!!!!"  ' Update the Notes Client Status Bar if we're NOT okay
      Exit Sub  
   End If
   
REM  Give up the ODBC Connection like a good little boy
   con.Disconnect
   
REM  Update the view so the new documents will show up without having to press the F9 key
   Call view.Refresh
   Call ws.ViewRefresh
   
   End Subb
End Sub


P.S. Es muss ein Kompleter Datensatz als Einheit gesehen werden d. H. es müssen alle 11 Felder zusammen vergliechen werden !!!
« Letzte Änderung: 04.07.03 - 19:55:55 von SnooP »

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Performance bei über 61000 Doc
« Antwort #9 am: 05.07.03 - 22:56:23 »
hast Du keinen Timestamp in der DB? Das ist eigentlich der Aufhänger, statt die 11 Felder einzeln zu vergleichen...
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Glombi

  • Gast
Re:Performance bei über 61000 Doc
« Antwort #10 am: 06.07.03 - 16:30:21 »
Hi,
um zu prüfen, ob ein Datensatz bereits vorhanden ist, kannst Du eine Ansicht machen, die (aus Perfmancegründen nur) 1 Spalte hat, mit folgender Formel:

Rolle + "#" + DimElementBez + "#" + Unit +...

dort dann alle Feldnamen (getrennt durch "#") auflisten. Falls Zahlen oder Datumswerte dabei sind, mit @Text(...) in String umwandlen.

In dem Script muss Du dann prüfen, ob der Satz bereits vorhanden ist, z.B.
dim checkview as NotesView
dim dc as NotesDocumentCollection
dim checkstring as string

checkstring = result.GetValue( "Name" ) + "#" + result.GetValue( "Rolle" ) + "#" +
result.GetValue( "DimElementBez" ) + ...

set checkview = db.GetView("<Ansichtsname>")
set dc = checkview.GetDocumentByKey(checkstring,true)

if dc.Count = 0 then

'Hier gibt es den Datensatz noch nicht => neues Dok. erstellen

end if



Andreas

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #11 am: 07.07.03 - 10:23:59 »
Danke werde es mal ausprobieren.

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #12 am: 07.07.03 - 15:07:26 »
@Glombi

Set dc = checkview.GetDocumentByKey(checkstring,True)

die GetDokumentByKey(....) Methode kennt Notes nicht.

Was mache ich falsch !!!

Offline SnooP

  • Frischling
  • *
  • Beiträge: 21
  • Ich liebe dieses Forum!
Re:Performance bei über 61000 Doc
« Antwort #13 am: 07.07.03 - 15:21:52 »
Ach ich habe es !!!

Es heisst Getdocumentbykey(keyarray, optional byval exactmatch as integer) as notesdocument.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz