如何优化占用高CPU资源的SQL查询
我使用LINQ和MVC6平台,托管在Microsoft Azure云上。以下查询占用大量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]
(@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不会具体化子查询(作为一般规则),因此重写查询不会影响性能。