SQL zu Matrix<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo alle,
Ist es möglich, Daten aus einer Datenbank direkt in eine Matrix zu extrahieren, ohne sie zuerst in eine Datentabelle zu importieren?
Vielen Dank!
Betreff: SQL in Matrixdanke für diesen Kommentar.
Ich habe einen riesigen Datensatz von Kreditkartenunternehmen mit etwa einer Million Benutzern und ein paar tausend Beobachtungen für jeden.
Ich lade jeden Benutzer einzeln herunter und analysiere sein Verhaltensmuster (das ist die große for-Schleife).
Wenn ich es manuell für einen Benutzer nach dem anderen ausführe, läuft es einwandfrei. Wenn mehr als 20 Benutzer ausgeführt werden, stürzt es an einem zufälligen Punkt ohne Erklärung ab (das Programm wird einfach heruntergefahren, oder ich erhalte die Meldung "jmp hat eine Zugriffsverletzung durchgeführt"). Ich verbessere meine Befehle ständig in Bezug auf Robustheit, versuche aber immer noch, die schwächsten Glieder zu finden.
Ron
Betreff: SQL in MatrixIch habe vergessen zu erwähnen, dass die Verwendung von "Auswählen *" eine sichere Möglichkeit ist, Ihre Abfrageleistung zu beeinträchtigen.Die Verwendung in einer for-Schleife ist ein Todesurteil.Werden Sie in SQL niemals faul, geben Sie alle Spalten ein, die Sie abrufen möchten, selbst wenn es sich um jede Spalte in der Tabelle handelt.Sie werden sehen, wie Ihr Code sprunghaft schneller ausgeführt wird.
Betreff: SQL in MatrixDanke sehr,
Jetzt läuft mein Skript viel schneller und hat weniger Probleme.
Ron
Betreff: SQL in MatrixJa, du wirst eine Evaluationsbeilage brauchen, dachte ich nicht.
Betreff: SQL in MatrixSie brauchen evalinsert, weil Sie i jedes Mal durch die Schleife auswerten.
Betreff: SQL in MatrixDanke msharp,
Das ist sehr hilfreich!
Meine SQL-Anweisungen waren nur grobe Skripte, die ich vom manuellen Öffnen der Tabellen kopiert habe.
Ich glaube, ich habe es geschafft, das meiste davon zu bekommen, außer der Eval-Beilage. Wie komme ich ohne aus?
Dies ist mein aktuelles Skript.
Datenbankverbindung = Datenbankverbindung erstellen (
"DBQ=D:\MY DOCUMENTS\;DefaultDir=D:\MY DOCUMENTS\;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"
) ;
// Benutzer-ID-Nummern in einer Matrix extrahieren:
Benutzermatrix = ( dt100 = Führen Sie SQL aus ( Datenbankverbindung , „WÄHLEN SIE EINZIGARTIGE UserId AUS data.csv“ , "dt10 - Benutzer-ID-Liste" , unsichtbar )) << als Matrix erhalten ;
Nah dran ( dt100 , NeinSpeichern ) ;
sqlstr = „SELECT * FROM data.csv where UserID = ^id^“ ;
Zum ( ich = 1 , ich <= N Reihen ( Benutzermatrix ) , ich ++,
Ich würde = Benutzermatrix [ ich ] ;
dt10i = Führen Sie SQL aus ( Datenbankverbindung ,
Eval-Einsatz ( sqlstr ) ,
"Benutzerdatenprotokoll" || Verkohlen ( ich ) || "-" || Verkohlen ( Ich würde ) , unsichtbar ) ;
// Analysiere die Datentabelle //
Nah dran ( dt10i , kein speichern ) ;
) ;
Datenbankverbindung schließen ( Datenbankverbindung ) ;
Betreff: SQL in MatrixEin paar Dinge.
Ändern Sie zunächst Ihre erste Abfrage in „SELECT DISTINCT UserId From dataset.csv“;
Dies macht zwei Dinge, macht Ihre Abfrage schneller und da Sie sie auch als Matrix ziehen, wird Usermatrix jetzt = UniqueID mehrere Codezeilen schneiden. Dadurch entfällt die Notwendigkeit, möglicherweise sehr große Listen und Matrixen zu speichern, die nicht verwendet werden (Userlist/UserMatrix).Stellen Sie sicher, dass Sie in der for-Schleife nitems in nrows ändern.
Zweitens müssen Sie in Ihrer for-Schleife nicht jedes Mal eine Datenbankverbindung herstellen.Verwenden Sie dbconnection = Datenbankverbindung erstellen (dsn); wobei dsn Ihre lange Abfragezeichenfolge oben ist.Ändern Sie dann Open Database(...) in Execute SQL(dbconnection, sqlstr, "Log Data User " || Char(i), invisible).
Ein paar Erkenntnisse daraus: Sie sparen Zeit, indem Sie sich jedes Mal mit der Datenbank verbinden (was viel Zeit sparen sollte).Sie müssen die sqlstr nicht mit insert() auswerten, keine große Sache, aber ein Schritt weniger. Schließlich und ziemlich wichtig ist, dass das unsichtbare Öffnen von dt10i viel Speicherplatz spart, wodurch Ihr Code schneller ausgeführt wird.Vor allem, wenn Sie die Datentabelle im Abschnitt "Analyse durchführen" überhaupt manipulieren.Wie ich sehe, schließen Sie es später sowieso.Damit ein Skript schneller ausgeführt wird, ist es wichtig, daran zu denken, dass alle Datentabellen, die Sie schließen möchten, entweder im unsichtbaren oder im privaten Modus geöffnet werden sollten.
Stellen Sie sicher, dass Sie eine Datenbankverbindung schließen ( Datenbankverbindung ); am Ende Ihres Codes.
Betreff: SQL in MatrixDanke MSharp,
Vielleicht hätte ich mein Skript vorher teilen sollen.
Jede Empfehlung ist willkommen.
Benutzermatrix = ( dt100 = Datenbank öffnen (
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\ SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" ,
// Die nächste Zeile extrahiert nur die UserId aus dem Datensatz, um die Speichernutzung zu reduzieren.
"SELECT UserId FROM dataset.csv" ,
"dt10 - Benutzer-ID-Liste" ,
unsichtbar
// privat // diese Option funktioniert nicht!!!
)) << als Matrix erhalten ;
Nah dran ( dt100 , NeinSpeichern ) ;
// Identifizieren Sie die Benutzer und ihre ID-Nummer
Benutzerliste = Assoziatives Array ( Benutzermatrix ) ;
Eindeutige ID = Benutzerliste << Schlüssel bekommen ;
//
// Dies ist nur eine Anweisung in einem String
sqlstr = „SELECT * FROM dataset.csv where id = ^i^“ ;
// Den Datensatz durchlaufen und einzelne Daten einzeln extrahieren.
Zum ( ich = 1 , ich <= N Artikel ( Eindeutige ID ) , ich ++,
// mit der Anweisung ein persönliches Protokoll für jeden Benutzer extrahieren.
dt10i = Datenbank öffnen (
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\ SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" ,
Eval-Einsatz ( sqlstr ) ,
"Protokolldatenbenutzer" || Verkohlen ( ich ) ,
) ;
// Analyse durchführen ...//
nah dran ( dt10i , kein speichern ) ;
) ;
Betreff: SQL in MatrixKlingt so, als könnten Sie Ihre SQL-Anweisung optimieren.
Etwas wie:
Mit IDtemp als (Wählen Sie IDcol aus IDtable aus, wobei IDcol = 'FilterCriteria')
Wählen Sie * Aus IDtable
Inner Join IDtemp
Dadurch wird zunächst eine temporäre IDtemp-Tabelle erstellt, die SQL zum Verbinden mit der größeren IDtable verwendet.Der Inner Join reduziert die Größe der Tabellen, mit denen SQL arbeiten muss, erheblich.Natürlich kann es einfachere Möglichkeiten geben, es schneller zu machen.Alles hängt davon ab, wie die Daten gespeichert werden und wie groß die Tabellen sind.
Ich würde mich auf die Optimierung Ihrer SQL-Anweisungen konzentrieren, anstatt zu optimieren, wie JMP interagiert und die Daten abruft.
Betreff: SQL in Matrixdanke msharp,
das macht mir klar, dass ich nichts verpasst habe.
Die Sache ist, dass die Datenquelle groß ist und ich nur eine Liste von IDs (eine Spalte) erhalten muss. Danach extrahiere ich die Daten (viele Spalten) für jede ID und analysiere sie separat. Das Öffnen des gesamten Datensatzes ist einfach nicht machbar.
Ron
Betreff: SQL in MatrixNun, ja und nein. Sie können es direkt als Matrix in JSL importieren, indem Sie Folgendes verwenden:
Matrix = SQL ausführen (dsn, sql_string, Tabellenname, unsichtbar) << Als Matrix abrufen;
Die SQL-Anweisung zum Ausführen erstellt jedoch weiterhin eine Datentabelle. Wenn "privat" eine Option wäre, wäre dies möglich, da JMP private Datentabellen automatisch aus dem Speicher Ihres Computers löscht, wenn sie nicht irgendwo gespeichert sind. Unsichtbar ist leider das Beste, was sie uns geben.
Sie können das folgende Skript verwenden, um die unsichtbare Tabelle zu schließen.Praktischerweise wird es genauso schnell sein, da die Ausführung der SQL-Anweisung immer der Flaschenhals sein wird.
Matrix = (dt = SQL ausführen (dsn, sql_string, Tabellenname, unsichtbar)) << Als Matrix abrufen;
schließen (dt);