【发布时间】:2017-08-28 10:53:16
【问题描述】:
我创建了一个存储过程来获取数据。在这个存储过程中,我返回了 5+ 以上的表,表存储了 20k+ 以上的数据。所以现在我已经运行了存储过程,我在 1 分钟以上的时间内获得了数据。我只想在 1 秒内获取数据。我还设置了SET NOCOUNT ON; 并创建了缺失的索引。我仍然在同一时间获取数据。
这是我的查询 =>
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 (12-@CurMon),(11-@CurMon),(10-@CurMon),(9-@CurMon),(8-@CurMon),(7-@CurMon),(6-@CurMon), (5-@CurMon), (4-@CurMon), (3-@CurMon), (2-@CurMon), (1-@CurMon)) 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。
【问题讨论】:
-
如果不了解表结构、现有索引、解释计划以及一些示例数据,这很难回答。
-
使用查询分析器检查发生了什么。执行计划也有助于解决您的问题。请上传一份
-
@BerndOtt 但我在查看执行计划后创建了所有缺失的索引。但我仍然遇到同样的问题
-
寻求性能帮助的问题应包括 DDL、DML 所涉及的表以及测试数据。如果您的测试数据很大,请尝试为表编写模式和统计信息(
right click database->generate scripts->select specific database objects->in next screen select advanced and choose Script statistics)并粘贴它有问题..有了这些信息,任何人都可以重现您面临的相同问题。否则,回答您的问题变得非常困难。粘贴服务器版本也有帮助
标签: sql-server