Sql 优化CTE

Sql 优化CTE,sql,Sql,大多数建议是提高可读性 使用CTE的完整名称。不是cte1,cte2 不要使用a、b、c、d别名,因为这会使其很难阅读。创建一个更有意义的完整名称 您有没有外部引用的子查询。你也可以从他们的cte,使其易于阅读 这是唯一一个我认为可以提高性能的地方 另一个groupby中的groupby看起来没有必要。为什么要在内部group by中包含这么多字段,然后只在group by中包含两个字段。看起来这应该在他自己的CTE中。我写了这个CTE查询,我得到了结果。我需要知道是否有更好的方法来编写此查询,

大多数建议是提高可读性

使用CTE的完整名称。不是cte1,cte2

不要使用
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