如何优化消耗大量CPU资源的SQL查询

时间:2018-10-06 11:13:02

标签: sql sql-server asp.net-mvc database-connection azure-sql-database

我正在使用LINQ和MVC6平台,并托管在Microsoft Azure云上。以下查询正在消耗大量CPU资源。 这是SQL格式的查询

(@p__linq__0 nvarchar(4000))SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[DevNews] AS [Extent1]
    WHERE (1 = [Extent1].[AdminCheck]) AND ([Extent1].[Tags] LIKE @p__linq__0 ESCAPE N'~') AND ([Extent1].[NewsLabels] IS NULL) AND ([Extent1].[Source] IN (N'PTI',N'IANS',N'Reuters'))
)  AS [GroupBy1]

3 个答案:

答案 0 :(得分:3)

如果在查询执行计划中建议使用索引,请创建它们以帮助sql更快更好地扫描大型表。
如果不是,则使用使用SSRS的资源调控器来限制登录资源,然后运行查询(这会降低执行性能)

答案 1 :(得分:1)

只是一个建议..查看您的示例,您可以避免子查询和每个where条件周围的无用()

 SELECT COUNT(1) AS [C1]
    FROM [dbo].[DevNews] AS [Extent1]
    WHERE 1 = [Extent1].[AdminCheck] 
    AND [Extent1].[Tags] LIKE @p__linq__0 ESCAPE N'~' 
    AND [Extent1].[NewsLabels] IS NULL
    AND [Extent1].[Source] IN (N'PTI',N'IANS',N'Reuters')

这应该避免建立与子查询相关的临时表

答案 2 :(得分:0)

您的查询实质上是:

SELECT COUNT(1) AS [C1]
FROM [dbo].[DevNews] AS [Extent1]
WHERE 1 = [Extent1].[AdminCheck] AND 
     [Extent1].[Tags] LIKE @p__linq__0 ESCAPE N'~' AND
     [Extent1].[NewsLabels] IS NULL AND
     [Extent1].[Source] IN (N'PTI', N'IANS', N'Reuters')

删除子查询应该对SQL Server的性能没有影响。但是,索引会。我建议使用以下各列的索引:(AdminCheck, NewsLabels, Source, Tags)

您需要确保将Source存储为NCHARNVARChAR。类型转换会降低查询速度。

最后,名为Tags的列是可疑的。如果这是存储为字符串的标记的列表,则应重新访问数据结构。这不是在SQL中存储列表的最佳方法。