SQL-非常慢的记录检索
我有一个SQL-非常慢的记录检索,sql,Sql,我有一个[User]表,它有35k条记录。我还有另一个表[UserNote],它有大约100万条记录 当我对User和UserNote表执行LEFT JOIN时,运行查询需要很长时间 我试着给表添加索引,但没有成功 有没有办法克服这个问题 查询: SELECT u.Name, un.Notes FROM [User] u LEFT JOIN [UserNote] un ON un.UserID = u.UserID ORDER BY u.Name 谢谢 按美国名称订购 我敢打赌这是你的罪魁祸
[User]
表,它有35k条记录。我还有另一个表[UserNote]
,它有大约100万条记录
当我对User
和UserNote
表执行LEFT JOIN
时,运行查询需要很长时间
我试着给表添加索引,但没有成功
有没有办法克服这个问题
查询:
SELECT u.Name, un.Notes
FROM [User] u
LEFT JOIN [UserNote] un ON un.UserID = u.UserID
ORDER BY u.Name
谢谢
按美国名称订购
我敢打赌这是你的罪魁祸首。您将生成一个3500万行的结果,然后必须在联接条件之外的列上对其进行排序。您没有说“长时间”是什么,但我敢打赌,如果您通过删除订单,或者在u.Name
上使用WHERE子句限制输出,速度会快得多
我假设u.UserID是唯一的,而un.UserID不是唯一的,因为每个用户都有许多注释,否则注释将在用户表中。我假设un.UserID是该表上某个唯一索引的第一列,可能是由该表隐式定义的。如果不是,它可能应该是
你可能会有更好的运气与内部连接。但是,这些建议,以及关于如何表述查询的任何推测,都取决于您的实现
按美国名称订购
我敢打赌这是你的罪魁祸首。您将生成一个3500万行的结果,然后必须在联接条件之外的列上对其进行排序。您没有说“长时间”是什么,但我敢打赌,如果您通过
删除订单,或者在u.Name
上使用WHERE子句限制输出,速度会快得多
我假设u.UserID是唯一的,而un.UserID不是唯一的,因为每个用户都有许多注释,否则注释将在用户表中。我假设un.UserID是该表上某个唯一索引的第一列,可能是由该表隐式定义的。如果不是,它可能应该是
你可能会有更好的运气与内部连接。但是,这些建议,以及关于如何表述查询的任何推测,都取决于您的实现 在UserNote表中为UserID添加一个非聚集索引,并包括如下所示的列注释
CREATE NONCLUSTERED INDEX UserId_Notes
ON UserNotes (UserId)
INCLUDE (Notes);
这称为覆盖索引,在这种情况下,当您进行连接并请求注释时,您的查询不需要在基表(用户注释)上进行查找,它在非聚集索引本身中拥有所有需要的列
您还可以考虑在非聚集索引中添加UserId和Notes。但我不建议这样做。如果不清楚,请发表评论。在UserID的UserNote表中添加一个非聚集索引,并包括类似以下内容的列注释
CREATE NONCLUSTERED INDEX UserId_Notes
ON UserNotes (UserId)
INCLUDE (Notes);
这称为覆盖索引,在这种情况下,当您进行连接并请求注释时,您的查询不需要在基表(用户注释)上进行查找,它在非聚集索引本身中拥有所有需要的列
您还可以考虑在非聚集索引中添加UserId和Notes。但我不建议这样做。如果不清楚,请发表评论。将您的问题添加,请检查编辑后的问题。您是否也可以添加执行计划。在第一个实例中,我假设UserId是INT。您是否尝试将索引添加到User.name?您添加了哪些列作为索引?我将索引添加到notes列。用户ID具有聚集索引,因为它是主键列!请添加您的问题,请检查已编辑的问题。您是否也可以添加执行计划。在第一个实例中,我假设UserId是INT。您是否尝试将索引添加到User.name?您添加了哪些列作为索引?我将索引添加到notes列。用户ID具有聚集索引,因为它是主键列!另外,在User(Name,UserID)
上添加索引可能更有益,因为OP会按名称对输出进行排序。是的,我同意,但这在users表中,但这种情况下肯定需要我指定的上述索引。我更喜欢编写关系查询(顺序/排序应该由显示数据的前端/应用程序来处理),我不同意排序是特定于应用程序的。例如,窗口/分析函数依赖于它。此外,在这种情况下,如果您断言排序不应该在这里进行,并且这可能是查询中最昂贵的部分,那么您应该在回答中说明。此外,在User(Name,UserID)
上添加索引可能更为有利,因为OP会按名称对输出进行排序。是的,我同意,但这在users表中,但这个案例肯定需要我指定的上述指标。我更喜欢编写关系查询(顺序/排序应该由显示数据的前端/应用程序来处理),我不同意排序是特定于应用程序的。例如,窗口/分析函数依赖于它。另外,在这种情况下,如果您断言排序不应该在这里进行,并且这可能是查询中最昂贵的部分,那么您应该在回答中说明这一点。适当的索引会有所帮助。确认索引能够完成排序和连接。适当的索引会有所帮助。确认索引能够完成排序和连接。