如何提高SQL Server中使用存储过程获取数据的速度?
我已经创建了一个存储过程来获取数据。在这个存储过程中,我已经返回了超过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。
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/
你尝试从查询中移除顺序,然后检查查询性能。如果你需要的只是月份数,你为什么要在ORDER BY中格式化这么多。 DATEADD之后可以DATEPART不能给你吗?在大型集合中使用CONVERT和FORMAT可能会降低性能。
变化DATEDIFF在WHERE子句MONTH和,而不是DATEADD,获得当月在顶部的整数,并加入到钛
如果你想继续使用OUTER APPLY,你还可以得到数据外部查询应用于表格变量中,在表格变量上创建索引并使用OUTER APPLY,然后应用日期比较。
您是否可以将VALUES子句中的内容放入另一个表变量中,因为您正在重复执行多个查询。
再次在您的选择字符串中,您的格式太多。您创建了自己的值T(i)。你可以有只是把表变量2列
9月9日 - 17
10月10日 - 17
11月11日 - 17
然后,你就不会需要格式非常多。
而不是SELECT中的CASE语句,您可以使用ISNULL函数。
显然,然后来索引,实际查询执行计划,锁定和等待统计。您的表架构未知。
您可能需要重新编写查询以使用其他内容而不是OUTER APPLY,可能是CROSS APPLY或LEFT JOIN,如果这是可能的话。它们可以比OUTER APPLY更快。
https://dba.stackexchange.com/questions/75048/outer-apply-vs-left-join-performance
CROSS APPLY vs OUTER APPLY speed difference
- 此外,检查在安装SQL服务器在PC上的任何空间的问题。检查日志文件清理。这些基本上可以由DBA在您的位置进行的活动。
如果没有关于表结构,现有索引,解释计划和一些示例数据的一些想法,这很难回答。 – GolezTrol
使用查询分析器来检查发生了什么。执行计划也可以帮助解决您的问题。上传一个,请 –
@BerndOtt,但我看完执行计划后创建了所有缺少的索引。但我仍然遇到同样的问题 – Edit