访问数据库时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 分钟内打开一个数据表,但我们希望能够使用查询生成器修改查询。
使用数据库 -> 查询生成器,JMP 创建了以下脚本。该脚本仅加载查询生成器 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" ) ) )
)
)
) << Modify开放数据库和新 SQL 查询脚本执行哪些不同操作导致执行时间出现如此差异?有没有办法加快查询生成器的执行速度或将查询生成器 UI 合并到开放数据库脚本中?
我对使用数据库非常陌生,如果您能在回复中详细说明以便我学习,那将非常有帮助。
谢谢!
布莱恩
回复:访问数据库时Open Database()和New SQL Query()有什么区别?嗨布莱恩,
抱歉,查询生成器不接受 *.我认为您可能需要遵循 Peter 的调整建议,或者坚持使用“打开数据库”或“执行 SQL”。
布莱恩
回复:访问数据库时Open Database()和New SQL Query()有什么区别?嗨布莱恩,
我尝试删除 WHERE 子句并使用 Run Background,但执行时间仍然是 3+hrs
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()
有没有办法将 SELECT * 与 New SQL Query() 脚本一起使用我尝试了以下操作,但出现语法错误。
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()
谢谢!
布莱恩
回复:访问数据库时Open Database()和New SQL Query()有什么区别?您可能需要在表上建立一个或多个索引,以便使用 WHERE 子句进行更高效的查询。我建议在交互式 Oracle 工具(如 PL/SQL Developer、Toad 等)中调整您的查询。使用 EXPLAIN PLAN 来查看查询中成本最高的部分,并确定索引在哪些方面会有所帮助。调整查询后,使用 OPEN DATABASE 或 EXECUTE SQL 来运行它。
回复:访问数据库时Open Database()和New SQL Query()有什么区别?嗨布莱恩,
在您的示例中,开放数据库正在执行 SELECT * 并获取所有数据。这比执行查询生成器脚本中的 WHERE 子句要快得多。另外,您正在查询生成器上进行修改以显示 UI。您可能想尝试在那里运行 Run Background(),而不是在后台线程上运行查询。如果没有看到所有数据,我认为删除查询生成器脚本上的 WHERE 子句并获取所有数据可能会更快。
布赖恩·科科伦
JMP开发