Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-非常慢的记录检索_Sql - Fatal编程技术网

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表中,但这个案例肯定需要我指定的上述指标。我更喜欢编写关系查询(顺序/排序应该由显示数据的前端/应用程序来处理),我不同意排序是特定于应用程序的。例如,窗口/分析函数依赖于它。另外,在这种情况下,如果您断言排序不应该在这里进行,并且这可能是查询中最昂贵的部分,那么您应该在回答中说明这一点。适当的索引会有所帮助。确认索引能够完成排序和连接。适当的索引会有所帮助。确认索引能够完成排序和连接。