我正在使用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]
答案 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
存储为NCHAR
或NVARChAR
。类型转换会降低查询速度。
最后,名为Tags
的列是可疑的。如果这是存储为字符串的标记的列表,则应重新访问数据结构。这不是在SQL中存储列表的最佳方法。