Sql 查询速度慢,可能优化

Sql 查询速度慢,可能优化,sql,tsql,optimization,reporting-services,Sql,Tsql,Optimization,Reporting Services,我有以下情况:我在一个报告中有16个查询,它们在开始时使用几乎相同的SELECT语句: SELECT sereresystem.registrationtime, CONVERT(VARCHAR(11),DATEADD(DAY,DATEDIFF(DAY,0,sereresystem.registrationtime),0),120) AS [Day], CAST(datepart(YEAR,sereresystem.registrationtime) AS CHAR(

我有以下情况:我在一个报告中有16个查询,它们在开始时使用几乎相同的SELECT语句:

SELECT 
    sereresystem.registrationtime,
    CONVERT(VARCHAR(11),DATEADD(DAY,DATEDIFF(DAY,0,sereresystem.registrationtime),0),120) AS [Day], 
    CAST(datepart(YEAR,sereresystem.registrationtime) AS CHAR(4))+' / KW '+CAST(Datepart(ISO_WEEK,sereresystem.registrationtime) AS VARCHAR(2)) AS [Week],
    Datepart(m,DATEADD(MONTH,DATEDIFF(MONTH,0,sereresystem.registrationtime),0)) AS [Month],
    CAST(datepart(YEAR,sereresystem.registrationtime) AS CHAR(4))+' / '+CAST(Datepart(q,DATEADD(MONTH,DATEDIFF(MONTH,0,sereresystem.registrationtime),0)) AS VARCHAR(1)) AS [Quarter],
    Datepart(year,DATEADD(MONTH,DATEDIFF(MONTH,0,sereresystem.registrationtime),0)) AS [Year],
    COUNT(sereresystem.caseid) AS [Total]
FROM sereresystem
    INNER JOIN sereregeneral ON sereresystem.caseid=sereregeneral.caseid
    INNER JOIN sereresperou ON sereresystem.caseid=sereresperou.caseid
WHERE sereregeneral.inpcha IN(@Inputchannel)
    AND sereresperou.assrol IN(@Assigned_Role) 
    AND sereresystem.registrationtime BETWEEN @Starttime AND @Endtime
    AND sereresystem.referencenumber=sereregeneral.renure
GROUP BY sereresystem.registrationtime
我需要日、周、月、季度和年的值,以便在SSRS中根据这些值动态分组。 我现在的问题是,报告速度太慢了。是否有可能缩短这5条日期选择语句的处理时间


-编辑-现在完成查询

您应该定义您的期望/要求

假设这16个查询不相同,那么将它们作为单独的数据集运行通常比组合它们要快。这是由于现代服务器、SQL和SSR的并行架构


我将回顾表索引-如果您不确定,那么在FROM子句之后引用的每一列上单独的索引将是一个好的开始。

问题将是FROM而不是SELECT此查询返回多少行?其中有多少最终会出现在最终报告中?你把结果汇总了吗简而言之,你能发布整个查询吗?您显示的部分不太可能导致您的问题。查询返回的日期取决于选择的开始时间和结束时间,以及选择的格式8天、星期等。因此,有可能每年选择一天或一行选择一年。为什么您需要运行查询十六次?难道你不能运行它一次,获取数据的超集,然后在你的报告中分割/过滤它吗?我不认为这是一个性能瓶颈,但它不会帮助你在SQL中进行所有格式化。7列中的5列只是用不同的varchar格式表示的registrationtime。您可以在SSRS中执行所有相同的格式设置,因为就我所知,这在SSRS表达式中不是有效选项,所以ISO_WEEK需要一个列。您的选择中也有冗余计算,例如,使用DATEADDMONTH、DATEDIFFMONTH、0、Date、0获取一个月的第一天,然后使用DATEPARTQ。。。在这一天。这与DATEPARTQ,Date相同。