提高20k行执行时间的性能

时间:2015-08-03 07:21:44

标签: sql tsql c#-4.0 sql-server-2008-r2

我在20k行上使用以下代码,需要3分钟, 我该如何改进呢?

;WITH  abcd
        AS (
              -- anchor
            SELECT  topicid, [Description], ParentID,topicgroupfk, topicgroupfk AS "GROUPFK",
                    CAST(([Description]) AS VARCHAR(1000)) AS "Path"
            FROM    accounting.topics
            WHERE   ParentId='0' and FinancialPeriodFK=1
            UNION ALL
              --recursive member
            SELECT  t.topicid, t.[Description], t.ParentID,t.topicgroupfk,a.GROUPFK AS "GROUPFK",
                    CAST((a.path + '/' + t.Description) AS VARCHAR(1000)) AS "Path"
            FROM    accounting.topics AS t
                             JOIN abcd AS a
                      ON t.ParentId = a.topicid
                         where t.FinancialPeriodFK=1
           )
SELECT *  FROM abcd where parentid>=0

1 个答案:

答案 0 :(得分:1)

  • [ParentId]的数据类型是什么?

我打赌(希望)它是一个int或bigint。因此,您可以在此处删除引用和隐式转换:

WHERE   ParentId='0'
  • [说明]的数据类型是什么?

如果它已经是varchar(1000),则可以将2 cast转换为varchar(1000)。如果它更小,您可以考虑将其更改为varchar(1000),然后删除2个强制转换。

  • 您在[ParentId]上有覆盖索引,包括[FinancialPeriodFK],其中[FinancialPeriodFK]的where子句= 1?

  • 其中不需要parentid> = 0

  • 是[topicgroupfk]整数吗?

  • 你也可以尝试减小递归CTE的大小和范围并稍后获取

    你可能只需要在CTE中使用topicid,parentid和path,然后尝试在主选择中使用topicid进行额外连接来获取其他列