Sql 优化CTE
大多数建议是提高可读性 使用CTE的完整名称。不是cte1,cte2 不要使用Sql 优化CTE,sql,Sql,大多数建议是提高可读性 使用CTE的完整名称。不是cte1,cte2 不要使用a、b、c、d别名,因为这会使其很难阅读。创建一个更有意义的完整名称 您有没有外部引用的子查询。你也可以从他们的cte,使其易于阅读 这是唯一一个我认为可以提高性能的地方 另一个groupby中的groupby看起来没有必要。为什么要在内部group by中包含这么多字段,然后只在group by中包含两个字段。看起来这应该在他自己的CTE中。我写了这个CTE查询,我得到了结果。我需要知道是否有更好的方法来编写此查询,
a、b、c、d
别名,因为这会使其很难阅读。创建一个更有意义的完整名称
您有没有外部引用的子查询。你也可以从他们的cte,使其易于阅读
这是唯一一个我认为可以提高性能的地方
另一个
groupby
中的groupby
看起来没有必要。为什么要在内部group by中包含这么多字段,然后只在group by中包含两个字段。看起来这应该在他自己的CTE中。我写了这个CTE查询,我得到了结果。我需要知道是否有更好的方法来编写此查询,以优化显示结果所需的时间。这只是一个未格式化的代码转储。标记为关闭是的,可能有一种方法可以优化此混乱:)性能问题应该包括解释分析和一些关于表大小、索引、当前时间性能、期望时间等的信息。请阅读这里是一个很好的地方。推广explict连接sintaxis的使用,Aaron Bertrand为此写了一篇很好的文章。感谢您的快速回复。基于以上更新。我试着做了些改变,但确实得到了结果。所以,如果您需要编写类似查询的代码。那会是什么样子。您可以发送编辑后的代码吗?@DheerajJain抱歉,这不是“为我编写代码”网站。除非您在SqlFiddle.com中提供一个工作示例,否则我只能给您一些建议。
WITH cte
AS (
SELECT a.related_serial_number
,a.serial_number
,b.role_id
,c.role_name
,D.Customer_Name
,b.cmat_customer_id
,b.CMAT_site_id
,f.system_status
,f.orgnl_sales_order_number
,a.creation_date
,a.instance_relationship_id
FROM eim_instance_relationships a
,eim.EIM_LATEST_SYS_PARTY_ROLE b
,eim.EIM_Roles c
,eim.EIM_Party D
,EIM.EIM_System f
WHERE a.Pkey BETWEEN '31'
AND '45'
AND a.p_pkey BETWEEN '1'
AND '2'
AND A.serial_number = b.system_serial_number
AND D.cmat_customer_id = b.cmat_customer_id
AND A.serial_number = f.system_serial_number
AND b.role_id = c.role_id
AND related_serial_number = '01c33679-a5b2-11e4-82f6-123478563412'
AND b.role_id IN ('1', '4', '10', '3', '19')
AND a.related_component_type = 'CLUSTER'
AND a.component_type = 'CONTROLLER'
AND a.related_serial_number IN (
SELECT related_serial_number
FROM eim.eim_instance_relationships e
WHERE e.related_component_type = 'CLUSTER'
AND e.component_type = 'CONTROLLER'
AND e.p_pkey BETWEEN '1'
AND '2'
AND e.Pkey BETWEEN '31'
AND '45'
GROUP BY e.related_serial_number
HAVING count(*) > 1
)
ORDER BY 1
,2
)
,cte2
AS (
SELECT row_number() OVER (
PARTITION BY role_name
,cmat_site_id ORDER BY instance_relationship_id DESC
) r
,instance_relationship_id
,related_serial_number
,serial_number
,role_id
,role_name
,Customer_Name
,cmat_customer_id
,CMAT_site_id
,system_status
,orgnl_sales_order_number
,creation_date
FROM cte
WHERE (
related_serial_number
,role_name
) IN (
SELECT related_serial_number
,role_name
FROM (
SELECT related_serial_number
,role_name
,count(*)
FROM (
SELECT related_serial_number
,serial_number
,role_id
,role_name
,customer_name
,CMAT_Customer_ID
,cmat_site_id
,system_status
,orgnl_sales_order_number
,count(*)
FROM cte
GROUP BY related_serial_number
,serial_number
,role_id
,role_name
,customer_name
,CMAT_Customer_ID
,cmat_site_id
,system_status
,orgnl_sales_order_number
)
GROUP BY related_serial_number
,role_name
HAVING COUNT(DISTINCT CMAT_Site_ID) > 1
)
)
)
SELECT *
FROM cte2
WHERE r = 1
ORDER BY related_serial_number
,serial_number