sql - 查询生产耗时
问题描述
我们有这个查询,我们试图识别具有多个信用选项指标的客户。我们必须将这个查询输出反映在我们的报告中并分享给业务用户。我们几乎每周都必须运行这个查询,这个查询需要时间。
询问
select CUST_ID, CUST_COUNT from (
SELECT N.CONS_ID AS CUST_ID,
COUNT(DISTINCT(case when M.CO_ID is null then 1 else m.co_id end)) AS CUST_COUNT
FROM CTS_VIEW.CNSLD_CREDIT_SUM M
INNER JOIN CTS_VIEW.LEGACY_CODE_XREF N
ON M.EE_ID = N.EE_GBL_IND
WHERE M.PROD_DT >= DATE '2018-12-31'
GROUP BY N.CONS_ID
) a
where CUST_COUNT>1;
有没有更好的方法来编写这个可以加快执行时间的查询。我们已经应用了 CBO 并在会话级别启用了矢量化。
解决方案
我认为 CTE 或通用表表达式将适用于这些目的 -
SELECT CUST_ID,CUST_COUNT FROM (
WITH M_RAW_CTE AS
(SELECT CO_ID,EE_ID,PROD_DT FROM CTS_VIEW.CNSLD_CREDIT_SUM),
M_CTE AS
(SELECT * FROM M_RAW_CTE WHERE PROD_DT >= DATE '2018-12-31'),
N_CTE AS
(SELECT CONS_ID,EE_GBL_IND FROM LEGACY_CODE_XREF)
SELECT N_CTE.CONSID AS CUST_ID,
COUNT(DISTINCT(ISNULL(M.CO_ID,1))) AS CUST_COUNT
INNER JOIN N_CTE ON M_CTE.EE_ID = N_CTE.EE_GBL_IND
GROUP BY N_CTE.CONS_ID)
WHERE CUST_COUNT > 1;
使用 CTE 背后的概念是增加 DDL 中数据的可重用性。
推荐阅读
- django - Django,Dash App 保存数据库凭证最安全的地方
- verilog - 在 Verilog 中,如何将模块的输入接地(本质上是输入 = 0 值)
- c - strcmp 导致 C 中的段错误
- flutter - gridview.builder 不滚动的问题
- python - 1d numpy 数组到矩阵中的块
- javascript - 解构大(嵌套)对象的最佳方法是什么?
- regex - Is there a way to find all occurrences of using var with a require, and replacing just those results with const?
- jupyter-notebook - 如何在 Jupyter Notebook 中创建虚拟环境?
- python - 如何将具有每个级别的变量字符串的嵌套字典转换为熊猫数据框?
- java - 加入时为 Discord 服务器中的用户分配角色