嗨 JMP 用户。 使用 JMP 查询生成器时,我们对使用“ODBC Driver 11 for SQL Server”的 SQL 服务器响应速度很快,但在某些使用“Oracle in OraClient11g”的 Oracle 服务器上响应速度较慢,大约需要 2 到 3 分钟。我们偶然发现,使用脚本中 New SQL Query() 函数中的 Custom SQL() 参数,而不是使用从 JMP Query Builder 生成的脚本,它工作得很好。
有没有其他人看到 Oracle ODBC 响应缓慢?
据我了解,部分问题是我们登录此 Oracle 数据库的帐户不允许查看服务器上某些模式中的某些表,因此查询构建器在首次加载时需要时间来绕过它们。 如果您的数据库访问包括所有模式和表,您可能无法复制。 直接提交自定义 SQL 会绕过这种模式和表扫描?
在下面的示例中,使用查询生成器、选定的列和过滤器。 运行一百万行需要 147 秒。 现在从查询生成器中,从 SQL 选项卡中选择 SQL,或使用“转换为自定义 SQL”菜单项并复制自定义 SQL(或从自定义 SQL 窗口运行查询),并将其粘贴为自定义的参数SQL(),一百万行只用了7到8秒。
// this is the JSL script generated by JMP Query Builder and saved to the datatable
// takes ~ 147 seconds to run
t1 = Tick Seconds();
New SQL Query(
Version( 130 ),
Connection(mycon),
QueryName( "Test1_147s" ),
Select(
Column( "X1", "t1" ),
Column( "X2", "t1" ),
Column( "X3", "t1" ),
Column( "X4", "t1" ),
Column(
"LAST_UPDATE_DATE",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
)
),
From( Table( "MY_DATABASE_TABLE", Schema( "SCHEMA" ), Alias( "t1" ) ) ),
Where(EQ(Column( "X2", "t1" ),"AAAA",UI( Comparison( Base( "Categorical" ) ) )))
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 147 seconds
// Now just copy the SQL code and put into the CustomSQL argument
// takes ~ 8 seconds to run
t1 = Tick Seconds();
New SQL Query(
Connection(mycon),
QueryName( "Test2_8s" ),
CustomSQL(
"SELECT t1.X1, t1.X2, t1.X3, t1.X4,
t1.LAST_UPDATE_DATE
FROM SCHEMA.MY_DATABASE_TABLE t1
WHERE ( ( ( t1.X2 = 'AAAA' ) ) )"
)
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 8 seconds
对于我们的 JMP 查询生成器最佳实践,现在必须展示如何从 Oracle 数据库的自定义 SQL 窗口运行和保存查询和数据表。
感谢您提供性能数据。 看来您有解决方案。
如果 JMP 有一些见解或建议可以分享,将会很有趣。
感谢您的提示! 做了一些更多的测试。
我确实看到了第二次调用 Oracle 数据库的效果,但仍然看到两种 JSL 技术之间的数量级差异。 我只需退出 JMP14 即可对此进行测试。 如果我在慢模式上运行测试,第一次 Custom SQL() 需要 0.4 秒。 如果我在 JMP 的当前会话中重复运行 Custom SQL() 脚本,它会减少到 0.06 秒。但这对标准的 Query Builder 代码没有帮助,无论如何都需要 120 秒。 我相信第一次和第二次调用 Oracle 数据库之间 0.4 到 0.06 的变化,如果发生在缓慢的模式中,在重复测试的噪音中总是在 ~120 秒左右。
我还测试了一个“快速”模式。 自定义 SQL 首次运行也是约 0.4 秒,然后在活动会话中的后续调用减少到 0.06 秒。 对于标准查询生成器代码,第一次调用是 1.2 秒,活动 JMP 会话中的后续调用减少到 0.8 秒。
从这些测试中,可以看到重复调用 Oracle 数据库减少了 ~0.3 秒,因为无论自定义 SQL() 的模式如何,它都会调用最后一个查询,但在使用查询生成器脚本的“慢速”模式中看不到它风格。
这里我们不喜欢 Open Database/Close Database 方法(担心将数据库挂起),我们更喜欢使用 Query Builder,但我们必须使用 Custom SQL() 方法并从 Query Builder 捕获 SQL 代码用户界面。