SQL からマトリックス<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、みんな、
最初にデータ テーブルにインポートせずに、データベースから直接マトリックスにデータを抽出することは可能ですか?
ありがとう!
Re: SQL からマトリックスへこのコメントをありがとう。
クレジット カード会社のデータベースには、約 100 万人のユーザーとそれぞれ数千の観測データが含まれる膨大なデータ セットがあります。
一度に各ユーザーをダウンロードし、その行動パターンを分析します (これは大きな for ループです)。
一度に 1 人のユーザーを手動で実行すると、問題なく実行されます。 20 人以上のユーザーを実行すると、何の説明もなくランダムな時点でクラッシュします (プログラムがシャットダウンするか、「jmp がアクセス違反を実行しました」というメッセージが表示されます)。堅牢性の観点からコマンドを改善し続けていますが、それでも最も弱いリンクを見つけようとしています。
ロン
Re: SQL からマトリックスへ「Select *」を使用すると、クエリのパフォーマンスが確実に低下します。for ループで使用するのは死刑宣告です。SQL で怠惰になることはありません。テーブル内のすべての列であっても、プルするすべての列を入力してください。コードが飛躍的に速く実行されることがわかります。
Re: SQL からマトリックスへどうもありがとうございます、
現在、私のスクリプトははるかに高速に実行され、問題も少なくなっています。
ロン
Re: SQL からマトリックスへええ、eval挿入が必要になるでしょう、私は考えていませんでした。
Re: SQL からマトリックスへループのたびに i を評価しているため、evalinsert が必要です。
Re: SQL からマトリックスへありがとうございます
これはとても役に立ちます!
私の SQL ステートメントは、テーブルを手動で開いてコピーした粗雑なスクリプトに過ぎませんでした。
Eval Insert 以外はほとんど入手できたと思います。 それなしでどうやって行くのですか?
これが私の現在のスクリプトです。
データベース接続=データベース接続の作成(
"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;"
) ;
// ユーザー ID 番号をマトリックスに抽出します。
ユーザーマトリックス= ( dt100 = SQL を実行する(データベース接続、 「data.csv から DISTINCT UserId を選択」 、 「dt10 - ユーザー ID リスト」 、見えない))) <<行列として取得;
近い( dt100 、保存しない) ;
sqlstr = "SELECT * FROM data.csv where UserID = ^id^" ;
為に(私= 1 、私<= N 行(ユーザーマトリックス) 、私++、
ID =ユーザーマトリックス[私] ;
dt10i = SQL を実行する(データベース接続、
評価挿入( sqlstr ) 、
「ユーザーデータログ」 ||シャア(私) || " - " ||シャア( ID ) 、見えない) ;
// データテーブルを分析します //
近い( dt10i 、保存しない) ;
) ;
データベース接続を閉じる(データベース接続) ;
Re: SQL からマトリックスへいくつかのこと。
最初に、最初のクエリを「SELECT DISTINCT UserId From dataset.csv」に変更します。
これは 2 つのことを行い、クエリを高速化します。また、クエリをマトリックスとしてプルしているため、Usermatrix は UniqueID = 数行のコードを削減します。 これにより、使用されていない潜在的に非常に大きなリストとマトリックス (Userlist/UserMatrix) を保存する必要がなくなります。for ループで nitems を nrows に変更してください。
次に、for ループで毎回データベース接続を確立する必要はありません。Use dbconnection = create database connection(dsn);ここで、dsn は上記の長いクエリ文字列です。次に、Open Database(...) を Execute SQL(dbconnection, sqlstr, "Log Data User " || Char(i), invisible) に変更します。
これからいくつかのことを学びます。毎回データベースに接続する時間を節約できます (これにより、多くの時間を節約できるはずです)。大したことではありませんが、手順が 1 つ少なくなります。 最後に、非常に重要なことですが、dt10i を目に見えないように開くと、多くのメモリ スペースが節約され、コードの実行速度が向上します。特に、「分析を実行する」部分でデータ テーブルを操作する場合は特にそうです。とにかく後でそれを閉じることになります。スクリプトをより高速に実行するには、閉じる予定のデータ テーブルを非表示モードまたはプライベート モードで開く必要があることを覚えておくことが重要です。
必ずデータベース接続を閉じる(データベース接続);コードの最後に。
Re: SQL からマトリックスへありがとうございます
おそらく、以前にスクリプトを共有する必要がありました。
どんな推薦も大歓迎です。
ユーザーマトリックス= ( dt100 =データベースを開く(
"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;" 、
// 次の行はデータセットから UserId のみを抽出してメモリ使用量を削減します。
"dataset.csv から UserId を選択" 、
「dt10 - ユーザー ID リスト」 、
見えない
// プライベート // このオプションは機能しません!!!
))) <<行列として取得;
近い( dt100 、保存しない) ;
// ユーザーとその ID 番号を識別します
ユーザーリスト=連想配列(ユーザーマトリックス) ;
一意のID =ユーザーリスト<<キーを取得する;
///
// これは単なる文字列のステートメントです
sqlstr = "SELECT * FROM dataset.csv where id = ^i^" ;
// データセットをループして、個々のデータを 1 つずつ抽出します。
為に(私= 1 、私<= Nアイテム(一意のID ) 、私++、
// ステートメントを使用して各ユーザーの個人ログを抽出します。
dt10i =データベースを開く(
"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;" 、
評価挿入( sqlstr ) 、
「ログデータ利用者」 ||シャア(私) 、
) ;
// 分析を実行する ...//
近い( dt10i 、保存しない) ;
) ;
Re: SQL からマトリックスへSQL ステートメントを最適化できるようです。
何かのようなもの:
IDtemp を使用 (IDtable から IDcol を選択、IDcol = 'FilterCriteria')
選択 * IDtable から
内部結合 IDtemp
これにより、SQL がより大きな IDtable と結合するために使用する一時的な IDtemp テーブルが最初に作成されます。内部結合により、SQL が処理する必要のあるテーブルのサイズが大幅に縮小されます。もちろん、もっと簡単に高速化する方法があるかもしれません。すべては、データの保存方法とテーブルの大きさに依存します。
私は、JMP がどのようにやり取りしてデータを取得するかを最適化するよりも、SQL ステートメントを最適化することに重点を置きます。
Re: SQL からマトリックスへありがとう、ムシャープ
これにより、何も見逃していないことが明確になります。
問題は、データ ソースが大きく、ID のリスト (1 列) を取得するだけでよいということです。 その後、各 ID のデータ (多くの列) を抽出し、個別に分析します。データセット全体を開くことは現実的ではありません。
ロン
Re: SQL からマトリックスへはい、いいえ。次を使用して、マトリックスとしてJSLに直接インポートできます。
matrix = Execute SQL(dsn, sql_string, table_name, invisible) << Get as matrix;
ただし、execute SQL ステートメントは依然としてデータテーブルを作成します。 「プライベート」がオプションである場合、プライベート データテーブルがどこかに保存されていない場合、JMP はコンピュータのメモリからプライベート データテーブルを自動的に消去するため、それが可能です。 残念ながら、目に見えないことは彼らが私たちに与える最高のものです。
以下のスクリプトを使用して、非表示のテーブルを閉じることができます。SQL ステートメントの実行が常にボトルネックとなるため、実用上は同じくらい高速です。
マトリックス = (dt = Execute SQL(dsn, sql_string, table_name, invisible)) << Get as matrix;
閉じる (dt);