问题标签 [crystal-reports-2016]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
65 浏览

oracle - 如果视图名称不断变化但查询结构保持不变,您如何“全局”调整 SQL 查询,使其由视图中的记录驱动?

我有一个 Crystal 报表通过一个应用程序运行,由于需要 15 分钟的低效查询,该应用程序需要很长时间才能运行。我们正在运行 Oracle 19.4。CURSOR_SHARING = FORCE 用于数据库,这是每个供应商所必需的。请参阅下面的查询。

问题是,查询中的视图名称(例如以下示例中的 TW_RPT_11263_7833_199916)会根据应用程序内部运行的查询而更改,以提供过滤的记录 ID 列表。每次根据不同的应用程序查询运行报告时,都会有不同的 SQL ID,具体取决于该特定视图的选择条件。

因此,可以生成 SQL 配置文件,但它仅适用于一个查询/一个视图。即使使用 FORCE 选项生成 SQL 配置文件,当它具有不同的视图名称 TW_RPT_####_##### 时也不会使查询更快,并且它没有使用在 v$sql 中看到的 sql_profile。

向查询添加提示效果很好;查询在 1 秒内运行(参见下面的 SQL)。但是,每个用户使用不同的视图名称,这意味着应用提示仅适用于一个视图和该特定查询 ID。我也不知道如何注入这个提示;这是水晶报表。另外我不知道是否可以使用带有模式匹配的提示,例如 /*+ USE_HASH(TW_RPT_%) */ 或使用其他一些会根据视图名称更改提示的技术。

PR 表有 200 万行,而视图只有几行,因此视图需要驱动查询。

带有提示 USE_HASH 的 QUERY 需要 <1 秒,而没有提示则需要 15 分钟:

我正在寻找任何想法来帮助 Oracle 找出具有这种结构的查询的最佳连接顺序,而不管视图的名称 (TW_RPT_####-######)。可以肯定地假设视图的行数总是比 PR 表少得多。

以下是应用程序根据最终用户在运行报告之前在应用程序查询中指定的内容创建的示例视图:

视图的结果是两个记录 ID,如下所示,以毫秒为单位返回:2012202 和 2012397