Mehere Datensätze in einem Querry

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Cell.

    Mehere Datensätze in einem Querry

    Hallo zusammen,

    Ich stehe mal wieder vor einem Performanceproblem mit einem meiner Programme. Ich habe mehrere txt Dateien gefüllt mit Datensätzen. Dabei sind die Einzelnen Datensätze dirch Zeilenumbrüchen, und die Werte mit Tabstops voneinander getrennt. Aufgabenstellung ist es jetzt die Dateien auszulesen und in eine Datenbank zu packen. (MS-SQL 2012).

    Grundsätzlich habe ich das von der Funktion her auch schon umgesetzt. Ich lese die Textdateien Zeilenweise ein, trenne dann die Werte über den Split Befehl auf, prüfe ob der Datensatz schon in der DB steht und schreibe die datensätze dann in die DB. Jetzt habe ich das Problem, das wir hier von mehreren Millionen Datensätzen sprechen. Daher dauert es ewig bis die Schleife abgearbeitet ist.

    Gibt es eine Möglichkeit mehrere Datensätze in einem Query zu prüfen und in die Datenbank zu jagen und wenn ja wie setzt man soetwas um?
    Hallo Cell,

    da gibts die Möglichkeit, die Arbeit mit BulkCopy dem SQL Server zu überlassen.
    Ich mach das normalerweise in eine temporäre Tabelle, um Daten zu prüfen / konsolidieren,
    und schreib dass dann per SQL in die endgültigen Tabellen.

    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:

    Cell schrieb:

    Ich lese die Textdateien Zeilenweise ein, trenne dann die Werte über den Split Befehl auf, prüfe ob der Datensatz schon in der DB steht und schreibe die datensätze dann in die DB.

    Klar - kann man machen, wenn man zu viel Zeit hat und die DB mit einzelnen Inserts stressen will :) .

    Schneller und einfacher als so, gehts nicht:

    VB.NET-Quellcode

    1. sQuery = "LOAD DATA LOCAL INFILE 'C:\PfadZuDeinerTextDatei.txt' " 'Aus welcher Textdatei soll gelesen werden?
    2. sQuery += "INTO TABLE deineTabelle " 'In welche DB-Tabelle soll geschrieben werden?
    3. sQuery += "CHARACTER SET 'utf8' " 'Wie ist der Zeichensatz Deiner StorageEngine eingestellt?
    4. sQuery += "FIELDS TERMINATED BY '|' " 'Welche Trennzeichen gibt es in Deiner TextDatei?
    5. sQuery += "IGNORE 1 LINES " 'Hat Deine Textdatei eine HeaderZeile? Ja? Diese ignorieren.
    6. sQuery += "(Feld1,Feld2,Feld3,Feld4,Feld5);" 'Die Feldbezeichner in Deiner Zieltabelle - analog zur Textdatei

    Also mit diesem Bulkinsert in eine temp. Tabelle schaufeln (das geht RASEND schnell) und dann natürlich mit einer kleinen Query oder meinetwegen auch Prozedur alle neuen Datensätze ins Ziel bringen.
    Das dauert alles zusammen einen Wimpernschlag.

    Viele Grüße und bestes Gelingen,
    Bruno

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „diylab“ ()

    Danke schonmal für den Denkanstoß
    Mein Code sieht derzeit so aus:

    VB.NET-Quellcode

    1. Dim con As New SqlConnection
    2. Dim cmd As New SqlCommand
    3. Dim sQuery As String
    4. con.ConnectionString = "Data Source=TESTSERV\SQLEXPRESS;Initial Catalog=Testing;Persist Security Info=True;User ID=tester;Password=tester"
    5. con.Open()
    6. cmd.Connection = con
    7. sQuery = "BULK INSERT tmp_pruefdaten " 'Inhalt wird in die Tabelle tmp_pruefdaten geschrieben
    8. sQuery += "FROM '" & file.FullName & "' " 'Pfad zu der Datei aus der gelesen werden soll
    9. sQuery += "WITH"
    10. sQuery += "("
    11. sQuery += "FIRSTROW = 3," 'Die ersten beiden zeilen werden Ignoriert
    12. sQuery += "FIELDTERMINATOR = '\t'," 'Spalten werden durch Tabstops getrennt
    13. sQuery += "ROWTERMINATOR = '\n'" 'Datensätze werden durch Zeilen getrennt
    14. sQuery += ")"
    15. cmd.CommandText = sQuery
    16. cmd.ExecuteNonQuery()


    Zumindest scheint der Server den Befehl so zu akzeptieren zumindest vom Prasen her. Leider scheinen mir aber irgendwelche Berechtigungen dafür zu fehlen. Folgende Exception wird mir dabei geworfen:

    Quellcode

    1. Die INSERT-Berechtigung wurde für das tmp_pruefdaten-Objekt, Testing-Datenbank, dbo-Schema, verweigert.


    Ich habe auf dem Server eigentlich Admin zugriffe. Allerdings ist das das erste mal das ich einen MSSQL Server verwende bzw damit rumspielen kann. Vielleicht könnte mir jemand erklären wo ich diese Insert Berechtigung setzten muss?

    Außerdem würde ich mir zu dem Thema gerne das ein oder andere Buch zulegen. Bisher habe ich folgendes gefunden:

    Köller: MS SQL Server 2012/Entwicklerbuch
    ISBN-13: 9783866455733

    Vielleicht könnt ihr mir stattdessen oder zudem noch weitere Literatur empfehlen?
    Hallo,

    schau dir die Optionen da mal durch:
    --EXEC sp_configure 'show advanced options', 1
    --RECONFIGURE
    --EXEC sp_configure 'Ad Hoc Distributed Queries', 1
    --RECONFIGURE
    --EXEC sp_configure 'xp_cmdshell', 1
    --RECONFIGURE
    Das sollte helfen ;)
    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    Ich habe mir die genannten Befehle im MSDN mal angesehen. Leider ändert das aber nichts an meinem Problem.

    So sieht mein Befehl aus:

    Quellcode

    1. EXEC sp_configure 'show advanced options', 1
    2. GO
    3. RECONFIGURE
    4. GO
    5. EXEC sp_configure 'Ad Hoc Distributed Queries', 1
    6. GO
    7. RECONFIGURE
    8. GO
    9. EXEC sp_configure 'xp_cmdshell', 1
    10. GO
    11. RECONFIGURE
    12. GO


    Die Exception bleibt die gleiche
    Falls du die DB von einem anderen Server kopiert hast...
    Lösch den User aus der DB heraus, dann gehst du zu den Anmeldungen des DB-Servers und klickst auf die Eigenschaften des Users und gibst ihm hier Rechte auf die DB.

    Es gibt da manchmal Probleme, wenn zwar der Name gleich ist, aber die ID durch die Kopie auf einen anderen Server anders ist.
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    Mmh...
    Wenn die User in Server Sicherheit und DB Sicherheit zusammenpassen muss ich jetzt passen.
    Da fällt mir leider auch nichts mehr ein.
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup: