SQL을 매트릭스로<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하세요 여러분,
데이터 테이블에 데이터를 먼저 가져오지 않고 데이터베이스에서 직접 매트릭스로 데이터를 추출할 수 있습니까?
감사!
Re: SQL을 매트릭스로이 의견에 감사드립니다.
나는 약 백만 명의 사용자와 각각에 대한 2,000개의 관찰이 있는 신용 카드 회사 데이터베이스의 거대한 데이터 세트를 가지고 있습니다.
나는 각 사용자를 한 번에 다운로드하고 그의 행동 패턴을 분석합니다(이것은 큰 for 루프입니다).
한 번에 한 사용자씩 수동으로 실행하면 잘 실행됩니다. 20명 이상의 사용자를 실행할 때 설명 없이 임의의 지점에서 충돌합니다(프로그램이 종료되거나 "jmp가 액세스 위반을 수행했습니다"라는 메시지가 나타남). 나는 견고성 측면에서 내 명령을 계속 개선하지만 여전히 가장 약한 링크를 찾으려고 노력하고 있습니다.
론
Re: SQL을 매트릭스로언급하는 것을 잊었습니다. 'Select *'를 사용하는 것이 쿼리 성능을 죽이는 확실한 방법입니다.for 루프에서 사용하는 것은 사형 선고입니다.SQL에 게으르지 마십시오. 테이블의 모든 열이더라도 가져오려는 모든 열을 입력하십시오.코드가 비약적으로 빠르게 실행되는 것을 볼 수 있습니다.
Re: SQL을 매트릭스로매우 감사합니다,
이제 내 스크립트가 훨씬 빠르게 실행되고 문제가 줄어듭니다.
론
Re: SQL을 매트릭스로예, 평가 삽입이 필요합니다. 생각하지 않았습니다.
Re: SQL을 매트릭스로루프를 통해 매번 i를 평가하기 때문에 evalinsert가 필요합니다.
Re: SQL을 매트릭스로msharp님, 감사합니다.
이것은 매우 도움이 됩니다!
내 SQL 문은 테이블을 수동으로 열 때 복사한 조잡한 스크립트일 뿐입니다.
Eval Insert를 제외하고는 대부분을 얻을 수 있었다고 생각합니다. 그것 없이 어떻게 지내요?
이것은 내 현재 스크립트입니다.
데이터베이스 연결 = 데이터베이스 연결 생성 (
"DBQ=D:\MY DOCUMENTS\;DefaultDir=D:\MY DOCUMENTS\;Driver={Microsoft 텍스트 드라이버(*.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=예;"
) ;
// 행렬에서 사용자 ID 번호를 추출합니다.
사용자 매트릭스 = ( dt100 = SQL 실행 ( 데이터베이스 연결 , "data.csv에서 DISTINCT 사용자 ID 선택" , "dt10 - 사용자 ID 목록" , 보이지 않는 )) << 행렬로 가져오기 ;
닫다 ( dt100 , 저장 안함 ) ;
sqlstr = "SELECT * FROM data.csv 여기서 UserID = ^id^" ;
을 위한 ( 나 = 1 , 나 <= N 행 ( 사용자 매트릭스 ) , 나 ++,
ID = 사용자 매트릭스 [ 나 ] ;
dt10i = SQL 실행 ( 데이터베이스 연결 ,
평가 삽입 ( sqlstr ) ,
"사용자 데이터 로그" || 숯 ( 나 ) || " - " || 숯 ( ID ) , 보이지 않는 ) ;
// 데이터 테이블 분석 //
닫다 ( dt10i , 저장 없음 ) ;
) ;
데이터베이스 연결 닫기 ( 데이터베이스 연결 ) ;
Re: SQL을 매트릭스로몇 가지.
먼저 첫 번째 쿼리를 "SELECT DISTINCT UserId From dataset.csv"로 변경합니다.
이것은 두 가지 작업을 수행하여 쿼리를 더 빠르게 만들고 또한 행렬로 가져오기 때문에 Usermatrix는 이제 = UniqueID가 여러 줄의 코드를 절단합니다. 이렇게 하면 사용되지 않는 잠재적으로 매우 큰 목록과 행렬(Userlist/UserMatrix)을 저장할 필요가 없습니다.하지만 for 루프에서 nitems를 nrows로 변경해야 합니다.
둘째, for 루프에서 매번 데이터베이스 연결을 설정할 필요가 없습니다.dbconnection 사용 = 데이터베이스 연결 생성(dsn); 여기서 dsn은 위의 긴 쿼리 문자열입니다.그런 다음 Open Database(...)를 Execute SQL(dbconnection, sqlstr, "Log Data User " || Char(i), 보이지 않음)로 변경합니다.
몇 가지 이점을 취하면 매번 데이터베이스에 연결하는 시간을 절약할 수 있습니다(많은 시간을 절약해야 함).큰 문제는 아니지만 한 단계 적은 sqlstr을 평가할 필요가 없습니다. 마지막으로 매우 중요한 점은 dt10i를 눈에 보이지 않게 열면 코드가 더 빨리 실행되는 데 도움이 되는 많은 메모리 공간이 절약된다는 것입니다.특히 "분석 수행" 부분에서 데이터 테이블을 전혀 조작하는 경우.나는 당신이 어쨌든 나중에 그것을 닫는 것을 참조하십시오.스크립트를 더 빠르게 실행하려면 닫으려는 모든 데이터 테이블을 보이지 않거나 비공개 모드에서 열어야 한다는 점을 기억하는 것이 중요합니다.
닫기 데이터베이스 연결이 있어야 합니다( 데이터베이스 연결 ); 코드 끝에서.
Re: SQL을 매트릭스로msharp님, 감사합니다.
아마도 이전에 내 스크립트를 공유했어야 했을 것입니다.
어떤 추천이든 환영합니다.
사용자 매트릭스 = ( dt100 = 데이터베이스 열기 (
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft 텍스트 드라이버(*.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=예;" ,
// 다음 줄은 메모리 사용량을 줄이기 위해 데이터세트에서 UserId만 추출합니다.
"dataset.csv에서 사용자 ID 선택" ,
"dt10 - 사용자 ID 목록" ,
보이지 않는
// private // 이 옵션은 작동하지 않습니다!!!
)) << 행렬로 가져오기 ;
닫다 ( dt100 , 저장 안함 ) ;
// 사용자 및 ID 번호 식별
사용자 목록 = 연관 배열 ( 사용자 매트릭스 ) ;
고유 ID = 사용자 목록 << 열쇠를 얻다 ;
// //
// 이것은 단지 문자열의 명령문일 뿐입니다.
sqlstr = "SELECT * FROM dataset.csv 여기서 id = ^i^" ;
// 데이터 세트를 반복하고 개별 데이터를 한 번에 하나씩 추출합니다.
을 위한 ( 나 = 1 , 나 <= N개 항목 ( 고유 ID ) , 나 ++,
// 명령문을 사용하여 각 사용자의 개인 로그를 추출합니다.
dt10i = 데이터베이스 열기 (
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft 텍스트 드라이버(*.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=예;" ,
평가 삽입 ( sqlstr ) ,
"로그 데이터 사용자" || 숯 ( 나 ) ,
) ;
// 분석 수행 ...//
닫다 ( dt10i , 저장 없음 ) ;
) ;
Re: SQL을 매트릭스로SQL 문을 최적화할 수 있을 것 같습니다.
다음과 같은 것:
IDtemp를 사용하여 (IDcol = 'FilterCriteria'인 IDtable에서 IDcol 선택)
* IDtable에서 선택
내부 조인 IDtemp
이렇게 하면 먼저 SQL이 더 큰 IDtable과 조인하는 데 사용하는 임시 IDtemp 테이블이 생성됩니다.내부 조인은 SQL이 작업해야 하는 테이블의 크기를 크게 줄입니다.물론 더 빠르게 만드는 더 간단한 방법이 있을 수 있습니다.모든 것은 데이터가 저장되는 방식과 테이블의 크기에 따라 다릅니다.
JMP가 상호 작용하고 데이터를 가져오는 방식을 최적화하는 것보다 SQL 문을 최적화하는 데 중점을 둡니다.
Re: SQL을 매트릭스로msharp님, 감사합니다.
이것은 내가 아무것도 놓치지 않았다는 것을 나에게 더 분명하게 합니다.
문제는 데이터 소스가 크고 ID 목록(한 열)만 가져오면 된다는 것입니다. 그런 다음 각 ID에 대한 데이터(많은 열)를 추출하고 별도로 분석합니다. 전체 데이터 세트를 여는 것은 실현 가능하지 않습니다.
론
Re: SQL을 매트릭스로예, 아니요. 다음을 사용하여 행렬로 JSL에 직접 가져올 수 있습니다.
matrix = SQL 실행(dsn, sql_string, table_name, visible) << Get as matrix;
그러나 실행 SQL 문은 여전히 데이터 테이블을 생성합니다. "private"가 옵션인 경우 JMP가 개인 데이터 테이블이 어딘가에 저장되어 있지 않은 경우 컴퓨터 메모리에서 자동으로 지워지기 때문에 가능합니다. 아아, 보이지 않는 것이 그들이 우리에게 주는 최선입니다.
아래 스크립트를 사용하여 보이지 않는 테이블을 닫을 수 있습니다.SQL 문을 실행하면 항상 병목 현상이 일어나므로 모든 실용성에서 속도는 빠릅니다.
행렬 = (dt = SQL 실행(dsn, sql_string, table_name, 보이지 않음)) << 행렬로 가져오기;
닫기(dt);