如何解决如何优化查询
| 我使用Linq2Sql作为ORM并遇到以下问题:我有2个表,可以将它们称为客户端(id,名称)和client_action(id,clientid,日期)。 \'client \'表包含客户端,而client_action包含用户操作的日志,我只需要其中的一个。 有一个linq2sql查询(带有分页和排序),它产生以下sql:SELECT TOP (10) /* columns here */
FROM (
SELECT /* columns here */
FROM [dbo].[client] AS [t0]
CROSS APPLY ((
SELECT NULL AS [EMPTY]
) AS [t8]
OUTER APPLY (
SELECT [t9].[source]
FROM [action] AS [t9]
INNER JOIN (
SELECT MIN([t10].[actionID]) AS [value],[t10].[ClientID]
FROM [client_action] AS [t10]
GROUP BY [t10].[clientID]
) AS [t11] ON [t9].[ID] = [t11].[value]
WHERE [t0].[ID] = [t11].[ClientID]
) AS [t12])
) AS [t17]
WHERE /* filter for fields from the client table */
ORDER BY [t17].[date_created] DESC
在该查询中存在逻辑错误,我进行了更改。现在生成的sql如下所示:
SELECT TOP (10) /* columns here */
FROM (
SELECT /* columns here */
FROM (
SELECT /* columns here */
FROM [dbo].[client] AS [t0]
CROSS APPLY ((
SELECT NULL AS [EMPTY]
) AS [t3]
OUTER APPLY (
SELECT [t7].[value]
FROM (
SELECT [t5].[ClientID],(
SELECT TOP (1) [t6].[ID]
FROM [client_action] AS [t6]
WHERE [t5].[clientID] = [t6].[clientID]
ORDER BY [t6].[date_created]
) AS [value]
FROM (
SELECT [t4].[clientID]
FROM [client_action] AS [t4]
GROUP BY [t4].[clientID]
) AS [t5]
) AS [t7]
WHERE [t0].[ID] = [t7].[clientID]
) AS [t8])
LEFT OUTER JOIN [client_action] AS [t9] ON [t8].[value] = [t9].[ID]
) AS [t26]
) AS [t27]
WHERE /* filter for fields from client table */
ORDER BY [t27].[date_created] DESC
并且出现性能问题。我使用\'SET STATISTICS IO ON \'执行了两个查询,并得到了有趣的结果:
对于第一个查询:
客户表被过滤
\'排名前十\'
\'cross apply \'应用于结果10条记录
对于第二个查询:
客户端表已过滤(找到约1万条记录)
\'cross apply \'应用于该10K记录
\'排名前十\'
因此,这会使第二次查询的工作速度大大降低。有没有一种方法可以“调整”查询,以便在过滤后尽可能应用“交叉应用”?
问题是那里有2个“交叉应用”,那里有更多的联接,这一切都使其工作真的很慢。我创建了可以提高查询速度的索引,但索引的速度仍然很慢,令人讨厌。
帮助帮助帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。