如何优化占用高CPU资源的SQL查询

如何优化占用高CPU资源的SQL查询,sql,sql-server,asp.net-mvc,database-connection,azure-sql-database,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]

我使用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]

只是一个建议。。通过查看示例,可以避免每个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')

这应该避免构建与子查询相关的临时表,这只是一个建议。。通过查看示例,可以避免每个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')

这应该避免构建与子查询相关的临时表,您所查询的子查询本质上是:

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
存储为
NCHAR
NVARChAR
。类型转换会减慢查询速度


最后,一个名为
Tags
的列是可疑的。如果这是存储为字符串的标记列表,那么您应该重新访问数据结构。这并不是在SQL中存储列表的最佳方式。

您查询的基本上是:

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
存储为
NCHAR
NVARChAR
。类型转换会减慢查询速度


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

如果查询执行计划中建议使用索引,请创建它们以帮助SQL更快更好地扫描大型表。

如果没有,则使用资源调控器使用SSRS限制登录资源,然后运行查询(这将降低执行性能)

如果查询执行计划中建议使用索引,则创建它们以帮助sql更快更好地扫描大型表。

如果没有,则使用资源调控器使用SSRS限制登录资源,然后运行查询(这将降低执行性能)

有索引吗?实际执行计划?有索引吗?实际执行计划。SQL Server不会具体化子查询(作为一般规则),因此重写查询不会影响性能。SQL Server不会具体化子查询(作为一般规则),因此重写查询不会影响性能。