我在 COGNOS 中有一个查询,它可以获取大量数据。由于执行时间会更长,我想微调我的查询。每个人都知道查询中的WHERE子句将首先执行。
我怀疑在执行查询时首先会发生什么?
首先建立查询中的 JOIN ,还是先执行 WHERE 子句?
如果首先建立JOIN,我应首先指定 DIMENSION 的过滤器,否则我应首先指定 FACT 的过滤器。
请解释一下。
提前致谢。
答案 0 :(得分:1)
SQL的想法是它是一种高级声明性语言,这意味着你告诉它你想要的结果而不是如何得到它们。在各种SQL实现中存在例外情况,例如Oracle中的提示使用特定索引等,但作为一般规则,这是正确的。
在幕后,RDBMS的优化器实现了关系代数,可以对不同的潜在执行计划进行基于成本的估算,并选择它预测的最有效的执行计划。关于这一点的好处在于你不必担心你在哪里写下你的where子句的顺序,只要所有的信息都在那里,优化者应该选择最有效的计划。
话虽如此,通常情况下您可以在数据库上提高查询性能,例如在大型表中的列上构建索引,这些列通常用于过滤条件或连接。
另一个考虑因素是您是否可以使用并行提示来加快运行时间,但这取决于您的查询,正在使用的执行计划,您正在使用的RDBMS以及它运行的硬件。
如果您发布查询语法以及您正在使用的RDBMS,我们可以检查在这种情况下是否有任何明显可以修改的内容。
答案 1 :(得分:1)
过滤器的顺序绝对无关紧要。优化器将负责这一点。
对于事实或维度表的过滤 - 您是否表示您在Cognos模型中为每个字段公开相同的字段(来自事实和产品维度的前ProductID)?如果是这样,则不建议这样做。一般来说,您应该只公开维度字段。
但这是关于SQL环境的更多问题。我将从Report Studio中导出Cognos生成的SQL(工具 - >显示生成的SQL)。从那里,希望你能够与一个优秀的DBA一起工作,看看你的表中是否有任何明显缺失的索引等。
Cognos中没有很多选项可以更改SQL生成。之前的海报提到了提示,如果编写本机SQL可能会有效,但这是Cognos不知道的概念。实际上,您所能做的就是更改implict / explict连接语法,该语法仅控制连接是在ON语句中还是在WHERE中进行。虽然WHERE方面非常难看,但它通常编译与ON相同。