管理非常大的SQL查询

Jav*_*ead 5 sql oracle data-warehouse

我正在寻找一些在Oracle中管理非常大的SQL查询的想法.

我的雇主希望为每份报告建立非常广泛的报告(150 - 200)列数据.每个项目都是子查询或视图中的元素.数据必须是实时的,因此DW样式批处理不是一种选择.我们也不使用任何BI工具,只是一个生成Excel的Java应用程序(它是在Excel中输出数据的要求)

该查询还包含联合作为来自其他系统的订阅源.查询导致非常大的SQL(大约1500行)非常难以管理.

我可以采用哪些策略来使工​​作更易于管理?

这也不是性能问题.我能够优化查询效率非常高,其查询的大部分宽度,管理200列本身就是一个挑战.

HLG*_*GEM 5

我每天都会处理这么长的查询,以下是一些可以帮助我维护它们的方法:

首先对这些列中的每一列进行别名。当您构建它时,您可能知道每一列的来源,但是当需要进行更改时,准确了解每一列的来源确实很有帮助。这适用于连接条件、group by 和 where 条件以及选择列。

以易于理解和可测试的块进行组织。我使用临时表将有意义的内容放在一起,这样我就可以在测试模式下在最终查询之前看到结果。

这让我进入测试模式。如果我有大量数据,我会使用测试模式设计过程,然后在测试模式下查询各个临时表,这样如果存在错误,我就可以看到数据出了问题的地方。不确定 Oracle 是如何工作的,但在 SQL Server 中,我将其作为最后一个参数并给它一个默认值,这样应用程序就不需要传入它。

考虑记录执行细节和传入参数的值,当然还要记录任何错误消息。当您必须解决为什么这个已经完美运行了六年的报告对这个用户不起作用时,这将非常有帮助。

将每一列放在单独的行上,并对 where 子句执行相同的操作。有时,您可能必须通过注释掉连接来排除故障,直到找到导致问题的连接。如果您也可以轻松注释掉相关字段,那就更容易了。

如果您没有技术设计文档,那么至少使用注释来解释您的思维过程。您想了解任何评论中的原因而不是方法。这些东西即使你写了之后也很难回过头来理解。给未来的自己一些帮助。

在从头开始开发时,我放入选择列表,然后注释除第一项之外的所有项目。然后,我仅构建查询,直到获得该值为止 - 进行测试,直到确定我得到的结果是正确的。然后我添加下一个以及任何连接或我可能需要获得它的条件。再次测试以确保其正确。(哎呀,为什么当我添加它时,它从 1000 条记录变成了 20000 条记录?嗯,也许有一些我需要处理的东西,或者是这样吗?)通过一次只添加一件事情,你会发现逻辑中存在很多错误更快并对结果更有信心。与尝试一次性构建大规模查询相比,它花费的时间也更少。

最后,理解数据是无可替代的。有很多复杂的查询可以工作,但不能给出正确的答案。知道您是否需要内连接或左连接。了解获取所需记录所需的条件。了解当您具有一对多关系时如何处理记录(这可能需要推迟要求);您是否应该有 3 行(每个子记录一行),或者是否应该将该数据放入逗号分隔列表中,或者是否应该仅选择众多记录之一并使用聚合只有一行。如果是后者,选择要保留的记录的标准是什么?