2017-08-28 90 views
-1

我已经创建了一个存储过程来获取数据。在这个存储过程中,我已经返回了超过5+的表和表,存储了超过20k +的数据。所以现在我已经运行了存储过程,以至于我在1分钟以上的时间内获取数据。我只想在1秒钟内获取数据。我也设置了SET NOCOUNT ON;并且还创建了缺失的索引。尽管如此,我还是得到了获取数据的时间。如何提高SQL Server中使用存储过程获取数据的速度?

这是我的查询=>

SET NOCOUNT ON; 

DECLARE @CurMon int 
DECLARE @year nvarchar(max) 
SELECT @CurMon = month(getdate()) 
SELECT @year = year(getdate()) 

SELECT 
    FORMAT(dateadd(MM, T.i, getdate()), 'MMM-yy') AS DateColumn, 
    CASE 
     WHEN uf.TotalCount IS NULL 
      THEN 0 
      ELSE uf.TotalCount 
    END AS TotalCount 
FROM 
    (VALUES ([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected])) AS T(i) 
OUTER APPLY 
    (SELECT DISTINCT 
     COUNT(datepart(MM, InsertDateTime)) OVER (PARTITION BY datepart(MM, InsertDateTime)) AS TotalCount 
    FROM 
     User 
    WHERE 
     DATEDIFF(mm, UF.InsertDateTime, DATEADD(mm, T.i, GETDATE())) = 0 
     AND IsLogin = 1) uf 
ORDER BY 
    DATEPART(MM, CONVERT(DATETIME, FORMAT(dateadd(MM, T.i, GETDATE()), 'MMMM') + '01 ' + @year, 110)) 

我有这样的查询像这样在这里请让我怎么能提高该SP。

+1

如果没有关于表结构,现有索引,解释计划和一些示例数据的一些想法,这很难回答。 – GolezTrol

+0

使用查询分析器来检查发生了什么。执行计划也可以帮助解决您的问题。上传一个,请 –

+0

@BerndOtt,但我看完执行计划后创建了所有缺少的索引。但我仍然遇到同样的问题 – Edit

回答

0

APPLY运算符为查询的外部表格表达式返回的每一行调用一个表值函数。

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://www.sqlshack.com/sql-server-query-execution-plans-understanding-reading-plans/

  1. 你尝试从查询中移除顺序,然后检查查询性能。如果你需要的只是月份数,你为什么要在ORDER BY中格式化这么多。 DATEADD之后可以DATEPART不能给你吗?在大型集合中使用CONVERT和FORMAT可能会降低性能。

  2. 变化DATEDIFF在WHERE子句MONTH和,而不是DATEADD,获得当月在顶部的整数,并加入到钛

  3. 如果你想继续使用OUTER APPLY,你还可以得到数据外部查询应用于表格变量中,在表格变量上创建索引并使用OUTER APPLY,然后应用日期比较。

  4. 您是否可以将VALUES子句中的内容放入另一个表变量中,因为您正在重复执行多个查询。

  5. 再次在您的选择字符串中,您的格式太多。您创建了自己的值T(i)。你可以有只是把表变量2列

9月9日 - 17

10月10日 - 17

11月11日 - 17

然后,你就不会需要格式非常多。

  1. 而不是SELECT中的CASE语句,您可以使用ISNULL函数。

  2. 显然,然后来索引,实际查询执行计划,锁定和等待统计。您的表架构未知。

  3. 您可能需要重新编写查询以使用其他内容而不是OUTER APPLY,可能是CROSS APPLY或LEFT JOIN,如果这是可能的话。它们可以比OUTER APPLY更快。

https://dba.stackexchange.com/questions/75048/outer-apply-vs-left-join-performance

SQL View Outer Apply Speed

CROSS APPLY vs OUTER APPLY speed difference

  • 此外,检查在安装SQL服务器在PC上的任何空间的问题。检查日志文件清理。这些基本上可以由DBA在您的位置进行的活动。
  • +0

    可以请你给我一些提示,因为你对我的查询给予点? – Edit

    +0

    我也可以删除顺序,也可以设置isnull来替换大小写,但我的查询仍然需要更多时间。不能做任何更改请参阅 – Edit

    +0

    尝试点号。 2&8. WHERE子句中的日期比较可能需要很长时间。此外,除此之外,您可以查找索引碎片,等待单个查询的统计信息,以及单独查询所有查询的实际查询执行计划。查询执行计划中百分比较高的点可能需要重新编写。另外,请检查安装了SQL Server的PC上的任何空间问题。检查日志文件清理。这些基本上可以由DBA在您的位置进行的活动。 – Amit

    相关问题