INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

SQL Server Performance



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

17.09.2009, 11:05
Beitrag #1

danielsan Offline
LVF-Grünschnabel
*


Beiträge: 39
Registriert seit: Mar 2007

2011-SP1
2006
DE

22000
Deutschland
SQL Server Performance
Hallo zusammen!
Gibt es hier SQL-Cracks?
Ich hab folgendes Problem: Ich habe ein LV-Programm geschrieben, mit dem man Daten aus einer großen SQL-Server Tabelle (Einige Millionen Datensätze) abfragen kann.
Die Abfrage sieht dann mit verschiedenen Filterkriterien ungefähr so aus:

SELECT p.PPunktNr, p.Beschreibung, g.Ist, p.Soll, p.MaxWert, p.MinWert, p.Toleranz, g.Status, g.GerNr, g.Pruefdatum, g.Pruefablauf, ge.GerTyp, ge.WMNr FROM tbl_Pruefpunkt p INNER JOIN tbl_Geraete ge INNER JOIN tbl_GerPruefPunkt g ON ge.GerTypIDCnt = g.GerID ON p.PPunktIDCnt = g.PPunktID WHERE g.PPunktID IN (1173) AND g.GerID = 109 AND g.Status != 0 AND g.Pruefablauf = 'Prüfung Produktion' ORDER BY p.PPunktNr, g.GerNr

Tabellen:
tbl_Pruefpunkt p enthält Stammdaten, ca. 2000 Datensätze
tbl_Geraete ge enthält Stammdaten, ca. 100 Datensätze
tbl_GerPruefPunkt g enthält Ergebnissdaten, mehrere Millionen Datensätze

weitere Infos:
SQL Server 2000
LV 2009
Verbindung mittels Microsoft Native Client 9 (per OLE)
Für SQL Kommunikation verwende ich das ADO TOOL von IBB:
http://forum.ib-berger.com/index.php?showforum=12

Folgendes Verhalten ergibt sich:
Frage ich Geräte ab, zu denen nur wenige Datensätze existieren (GerID), geht die Abfrage relativ schnell (z.B. 3 s, erneute Abfrage um Faktor 100 beschleunigt). Bei Geräten mit mehr Datensätzen (GerID=xy) verlangsamt sich das ganze dramatisch (z.b. 190s, erneute Abfrage genau so lahm).
Dabei ist egal, wie viele Datensätze tatsächlich übertragen werden. Scheinbar dauert das Erstellen eines Recordsets so lange. Das Auslesen der Zeilen mittels getRows geht dann schnell.Ist auch in diesem Bild ganz gut zu sehen:

   

Das Programm steckt sehr lange in dem linken Teil bis die Referenz auf ein recordset ausgegeben wird.
Frage ich Werte ohne joins direkt ab mit z.B.:

SELECT g.Ist, g.Status, g.GerNr, g.Pruefdatum, g.Pruefablauf FROM tbl_GerPruefPunkt g WHERE g.PPunktID IN (1173) AND g.GerID = 109 AND g.Status != 0 AND g.Pruefablauf = 'Prüfung Produktion' ORDER BY g.GerNr

geht das Ganze auch nicht schneller. Daher vermute ich mal, dass es nicht wirklich an der Art und Weise der Abfrage liegen kann. Vom Netzwerktraffic scheint es auch nicht wirklich abhängig zu sein, da das Holen von 200 Zeilen genau so lange dauert, wie das von 200.000 zeilen.
Gibt es eine Möglichkeit, das Erstellen eines Recordsets in der DB zu beschleunigen? Müssen da evtl. noch Indizes gesetzt werden etc...?

Ach ja: Frage ich per Eigenschaftsknoten die Einstellungen des Cursors ab ist dieser auf server, fast forward, read only eingestellt. Sollte eigentlich passen.

Irgendwelche Tipps?

Gruß,
Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
17.09.2009, 15:23
Beitrag #2

RoLe Offline
LVF-Guru
*****


Beiträge: 1.236
Registriert seit: Jul 2007

-
1997
en

0
Schweiz
SQL Server Performance
Du könntest mal schauen, wie lange es dauert, wenn du die Abfrage direkt auf dem SQL-Server machst.
(z.Bsp. mit dem SQL Server Management Studio)

ev. liegt es ja gar nicht an LabVIEW.Rolleyes

.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.09.2009, 16:01
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
SQL Server Performance
Da der Delay im Execute selber auftritt ist LabVIEW fast 100% sicher nicht daran beteiligt. Bleibt nur der SQL Server ADO Treiber oder die Datenbank selber.

Versuch mal die Idee von Role. Wenns da schnell geht dann wird's wohl der ADO Treiber und/oder die Netwerkverbindung zum Server sein. Ansonsten hast Du wohl eine SEHR komische Datentabellenstruktur die den SQL Server irgendwie ziemlich ausbremst.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.09.2009, 11:03
Beitrag #4

danielsan Offline
LVF-Grünschnabel
*


Beiträge: 39
Registriert seit: Mar 2007

2011-SP1
2006
DE

22000
Deutschland
SQL Server Performance
OK, danke schon mal für die Antworten.

Dann werde ich mal einen Termin mit unserem SQL-Experten machen, wobei das mit dem immer etwas kompliziert ist...

@rolfk:
Mit ADO Treiber ist der client-seitige treiber gemeint? Da habe ich ja schon diverse ausprobiert (ODBC, SQL-Native mit ODBC oder OLE). Schließe ich weitgehend aus.
Zum Delay im Execute: Das findet doch bei server-seitigem Cursor direkt auf dem Server statt, oder nicht? Daher sollte doch die Netzwerkverbindung da keinen Einfluss mehr haben? Die Dauer der Anfrage ist ja auch völlig unabhängig von der Anzahl der zu holenden Zeilen. Es scheint vielmehr an der Anzahl der Zeilen zu liegen, die den Inner Joins mit den anderen Tabellen entsprechen.

Gruß,
Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.09.2009, 16:36
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
SQL Server Performance
Ich dachte da schon daran um SQL Studio von einem anderen Computer aus zu gebrauchen. Auf der Maschine auf der der Server läuft misst Du wirklich nur die SQL Engine Performance alleine, was eventuel auch schon einige Indizien geben könnte aber auch einiges weglässt.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.09.2009, 14:47
Beitrag #6

danielsan Offline
LVF-Grünschnabel
*


Beiträge: 39
Registriert seit: Mar 2007

2011-SP1
2006
DE

22000
Deutschland
SQL Server Performance
So hab´s jetzt herausgefunden. Das Problem lag daran, dass in der Ergebnistabelle die Spalte PPunktID nicht indiziert war. Das ist natürlich eines unserer Hauptsuchkriterien.
Nach Anlegen eines Index ist die Abfrage ca. um den Faktor 100 beschleunigt. Die Dauer einer Abfrage korreliert jetzt auch viel besser mit der Anzahl zu übertragender Datensätze.

Gruß,
Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.09.2009, 18:05
Beitrag #7

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
SQL Server Performance
' schrieb:Nach Anlegen eines Index ist die Abfrage ca. um den Faktor 100 beschleunigt. Die Dauer einer Abfrage korreliert jetzt auch viel besser mit der Anzahl zu übertragender Datensätze.

du kannst das ganze höchstwahrscheinlich auch nochmal deutlich beschleunigen, in dem du die Abfrage als Stored Procedure im SQL-Server speicherst und die dann mit EXEC myStoredProcedureName(Parameter1, Parameter2, ...) aufrufst.

Ein Problem dürfte aber auch sein, dass für so große Abfragen erstmal massiv Speicher allociert werden muss. Ich würd mir mal überlegen, ob du das in einer Stored Procedure nicht noch optimieren kannst?

kann schonmal 2-3 Tage dauern eine SP performant zu programmieren, aber dafür hat man dann keinen Stress mehr in LV, und das beste daran ist: die Arbeit macht die SQL Engine und die ist schließlich dafür optimiert ...

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.09.2009, 09:47
Beitrag #8

danielsan Offline
LVF-Grünschnabel
*


Beiträge: 39
Registriert seit: Mar 2007

2011-SP1
2006
DE

22000
Deutschland
SQL Server Performance
Hmmm, ich verstehe jetzt aber nicht so ganz, wie mir eine SP dabei helfen soll, Abfragen zu beschleungigen? Im Endeffekt ist das doch nur eine Abfolge von Commands, oder nicht? Die Parameter bestimmen ja die Suche und die können sich jederzeit ändern. Verwende ich natürlich einen oder mehrere davon erneut, sind gewisse Dinge im Cache und werden schneller abgearbeitet.
Die SP kann doch aber nicht für alle möglichen Parameter zwischenspeicher anlegen. Könntest Du nochmal erklären, warum das Deiner Meinung nach mehr Speed geben sollte?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Performance-Frage: Was ist klüger? Cluster5020 5 4.189 17.08.2011 12:56
Letzter Beitrag: Cluster5020

Gehe zu: