データベースにアクセスするときの Open Database() と New SQL Query() の違いは何ですか?やあ、
Oracle データベースからビューを取得しようとしています。データベース名は ACTPROD.WORLD、スキーマは ABASE、テーブルは RPT_H25_3MONTHS_VIEW です。
[データベース] -> [テーブルを開く] を使用して、JMP は次のスクリプトを作成しました。
Open Database(
"DSN=ACTPROD.WORLD;UID=;PWD=;DBQ=ACTPROD.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;",
"SELECT * FROM \!"ABASE\!".\!"RPT_H25_3MONTHS_VIEW\!""
)
このスクリプトは 5 分以内にデータ テーブルを開きますが、クエリ ビルダーを使用してクエリを変更できるようにしたいと考えています。
Database -> Query Builder を使用して、JMP は次のスクリプトを作成しました。このスクリプトは、Query Builder UI をロードするだけで 3 時間以上かかります。
New SQL Query(
Version( 130 ),
Connection(
"ODBC:DSN=ACTPROD.WORLD;UID=;PWD;DBQ=ACTPROD.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;"
),
QueryName( "RPT_H25_3MONTHS_VIEW" ),
Select(
Column( "TEST_ID", "t1" ),
Column( "OBJECT", "t1" ),
Column( "BATCH", "t1" ),
Column( "WELL", "t1" ),
Column( "PLATE", "t1" ),
Column( "SEQUENCE", "t1" ),
Column( "%C(%)", "t1" ),
Column( "RATE", "t1" ),
Column( "RATE_UNIT", "t1" ),
Column( "REPLICATE", "t1" ),
Column( "SOIL", "t1" ),
Column( "SPECIES_ABBR", "t1" ),
Column(
"CREATED_DATE",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
)
),
From( Table( "RPT_H25_3MONTHS_VIEW", Schema( "ABASE" ), Alias( "t1" ) ) ),
Where(
In List(
Column( "TEST_ID", "t1" ),
{"H2.5-20190618", "H2.5-20190723", "H2.5-20190806"},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
) & Is Not Null(
Column( "%C(%)", "t1" ),
UI( NullTest( Base( "Continuous" ) ) )
)
)
) << ModifyOpen Database スクリプトと New SQL Query スクリプトの動作の違いにより、実行時間にこのような差異が生じる原因は何ですか?Query Builder の実行を高速化する方法や、Query Builder UI を Open Database スクリプトに組み込む方法はありますか?
私はデータベースを扱うのは本当に初めてです。返信で詳細を教えていただければ、学ぶことができてとても助かります。
ありがとう!
ブライアン
Re: データベースにアクセスするときの Open Database() と New SQL Query() の違いは何ですか?こんにちはブライアン、
申し訳ありませんが、Query Builder は * を受け入れません。おそらく、Peter のチューニングの提案に従うか、Open Database または Execute SQL に固執する必要があると思います。
ブライアン
Re: データベースにアクセスするときの Open Database() と New SQL Query() の違いは何ですか?こんにちはブライアン、
WHERE 句を削除して Run Background を使用しようとしましたが、実行時間はまだ 3 時間以上です
New SQL Query(
Version( 130 ),
Connection(
"ODBC:DSN=ACTPROD.WORLD;UID=;PWD=;DBQ=ACTPROD.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;"
),
QueryName( "RPT_H25_3MONTHS_VIEW" ),
Select(
Column( "TEST_ID", "t1" ),
Column( "OBJECT", "t1" ),
Column( "BATCH", "t1" ),
Column( "WELL", "t1" ),
Column( "PLATE", "t1" ),
Column( "SEQUENCE", "t1" ),
Column( "%C(%)", "t1" ),
Column( "RATE", "t1" ),
Column( "RATE_UNIT", "t1" ),
Column( "REPLICATE", "t1" ),
Column( "SOIL", "t1" ),
Column( "SPECIES_ABBR", "t1" ),
Column( "CREATED_DATE", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) )
),
From( Table( "RPT_H25_3MONTHS_VIEW", Schema( "ABASE" ), Alias( "t1" ) ) )
) << Run Background()
New SQL Query() スクリプトで SELECT * を使用する方法はありますか? 次のことを試しましたが、構文エラーが発生します。
New SQL Query(
Version( 130 ),
Connection(
"ODBC:DSN=ACTPROD.WORLD;UID=;PWD=;DBQ=ACTPROD.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;"
),
QueryName( "RPT_H25_3MONTHS_VIEW" ),
Select("*"),
From( Table( "RPT_H25_3MONTHS_VIEW", Schema( "ABASE" ), Alias( "t1" ) ) )
) << Run Background()
ありがとう!
ブライアン
Re: データベースにアクセスするときの Open Database() と New SQL Query() の違いは何ですか?WHERE 句を使用してより効率的にクエリを実行するには、テーブルに 1 つ以上のインデックスが必要になる場合があります。PL/SQL Developer、Toad などのインタラクティブな Oracle ツールでクエリを調整することをお勧めします。EXPLAIN PLAN を使用して、クエリで最もコストがかかるものを確認し、インデックスが役立つ場所を特定します。クエリを調整したら、OPEN DATABASE または EXECUTE SQL を使用してクエリを実行します。
Re: データベースにアクセスするときの Open Database() と New SQL Query() の違いは何ですか?こんにちはブライアン、
あなたの例では、オープンデータベースは SELECT * を実行しており、すべてのデータを取得しています。これは、Query Builder スクリプトにある WHERE 句を実行するよりもはるかに高速になります。また、クエリ ビルダーで変更を行って UI を表示します。バックグラウンド スレッドでクエリを実行する代わりに、そこで Run Background() を試してみることをお勧めします。すべてのデータが表示されない場合は、クエリ ビルダー スクリプトの WHERE 句を削除して、すべてのデータを取得する方が高速になると思います。
ブライアン・コーコラン
JMP開発