Zugriffszeit SQL Datenbank verkürzen?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    Zugriffszeit SQL Datenbank verkürzen?

    Moin Leute,

    ich greife mit meinem Programm auf eine SQL Datenbank zu, die in Deutschland liegt. Die Zugriffszeit aus USA beträgt ca 1-2 Sekunden für einen Zugriff.
    Je nachdem was der Anwender auswählt, muss ich auf mehrere Tabellen zugreifen. Derzeit ist das Programm so konzipiert, dass ich für jede Tabelle einen Zugriff habe. (con.open, con.close etc)
    D.h. bei 4-5 Tabellen, geht es so 5-10 Sekunden.
    Meine Frage nun, gibt es eine Möglichkeit die Connections zu einer zusammenzufassen? Dass ich quasi mehrere Datareader habe und die von den Tabellen befüllen lasse innerhalb einer Connection?
    Oder geht das vielleicht noch anderst?

    Vielen Dank für die Erleuchtung :)
    Hallo

    r0tzi schrieb:

    Je nachdem was der Anwender auswählt, muss ich auf mehrere Tabellen zugreifen.

    Hierfür gibt es Joins.

    Ab besten du zeigst mal Anhand eines Beispiels was du abrufen möchtest und WIE du das machst. Beispiel: Will ich alle Kunden haben die mit "Mülle" als Nachnamen beginnen inkl. deren letzte 10 Aufträge ist es eben weniger ratsam zuerst alle Kunden welche mit "Mülle" beginnen abzurufen um dann seperat alle Aufträge von jedem Kunden abzurufen und mit dort dann nur die letzten 10 rauszuholen.
    Hierfür bietet SQL Diverse Funktionen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi, das mit der Verbindung ist klar, nur ich meinte eigentlich den Datareader... also so hole ich z.B. einen Wert aus der erste und danach aus der zweiten Tabelle.

    Quellcode

    1. Dim SqlCMD As String = ("Select * from dbo.Country1 where Country ='" & StrCountr & "'")
    2. Dim cmd As SqlCommand = New SqlCommand(SqlCMD, Me.connection)
    3. Dim dr As SqlDataReader = cmd.ExecuteReader()
    4. Do While dr.Read()
    5. StrCode = dr("Country").ToString
    6. Loop
    7. dr.Close()
    8.  
    9. SqlCMD = ("Select * from dbo.Country2 where Country ='" & StrCountr2 & "'")
    10. cmd = New SqlCommand(SqlCMD, Me.connection)
    11. dr = cmd.ExecuteReader()
    12. Do While dr.Read()
    13. StrCode2 = dr("Country2").ToString
    14. Loop
    15. dr.Close()


    Dies passiert natürlich innherhalb einer Connection.. jedoch greife ich ja innerhalb der Connection mehrmals auf verschiedene tables zu, und meine frage war ob es irgendwie anderst möglich (schneller) ist

    Vielen Dank
    Aloa,

    also ich mache eine Connection immer für die Dauer eines Prozesses auf (also bis alles was ich habe verarbeiten will abgeschlossen ist).
    Grund ist, dass ich zB. auch auf OpenEdge Datenbanken zugreife, die allein für das Öffnen der Verbindung gerne mal 5 Sekunden brauchen.

    Bei einigen Programmen die nur für kurze Zeit geöffnet bleiben, öffne ich die Verbindung sogar nur beim Start und schließe sie erst beim Programmende wieder.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @r0tzi ich versuchs mal.

    Wenn das wirklich die Abfragen sind welche du ausführst kann das natürlich schon ein Performanceproblem sein.
    Wir wissen zwar nicht was das für Tabellen sind und wieviele Datensätze die Abfragen zurückgeben aber gerade wenn man über die WAN Leitung fährt sollten einige Dinge beachtet werden.

    SQL-Abfrage

    1. SELECT * FROM Tabelle

    Ist eher schlecht. Du benötigst sicher nicht alle spalten. Wie ich im Code sehe nur die "Country" spalte. Also...

    SQL-Abfrage

    1. SELECT Country FROM Tabelle WHERE ...

    Sollte die Tabelle 8 Spalten haben überträgst du ab sofort schon mal nur eine Teilmenge.

    Weiters (hier kommt es darauf an was du benötigst) kannst du die Anzahl der Datensätze beschränken welche abgerufen werden mittel Paging.
    Stichworte sind hier Skip und Take

    Du du über die WAN Leitung fährst solltest du dich auch unbedingt vor SQL Injection schützen und Parameter verwenden anstatt einen verketteten String.
    docs.microsoft.com/en-us/sql/r…ters?view=sql-server-2017

    Prinzipiell gibt es schon die Möglichkeit beide Tabelle in einem Rutsch abzurufen, du musst dann nur wenn du die Daten zurückbekommst auch unterscheiden können welche DS von Country1 und welche von Country2 kommen.
    Wie schon gesagt, wir kennen deine DB nicht und ohne dies wird eine Hilfe schwer. Denn ich denke nicht das deine Tebellen Country1 und Country2 heissen. Ich denke das ist nur ein Beispiel.

    Schau dir hier mal die JOIN und die UNION Operator an.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##