【发布时间】:2022-01-03 17:33:04
【问题描述】:
在 SQL Server 2016 中,我有 5 个大表。在一个查询中从 5 个表中的每一个表中选择前 1000 条记录的最佳方法是什么?
这例如返回太多数据。
Select *
from table1
cross apply table2
cross apply table3
cross apply table4
cross apply table5 with(nolock)
此外,我希望从 5 个表中的每一个中获取每一列..但只是每个表中的前 1000 行。
【问题讨论】:
-
旁白:为什么你有
with(nolock)你认为它对你的查询有什么影响? -
默认事务隔离级别是 READ COMMITTED 隔离级别,在该隔离级别中检索更改的数据将被阻止,直到这些更改被提交。 WITH (NOLOCK) 表提示用于覆盖特定查询中表或视图内表的默认事务隔离级别,允许用户在不受锁影响的情况下检索数据
-
我想你也知道它可能返回完全错误的结果,包括但不限于:读取行甚至整页两次或根本不读取,读取数据唯一或外键约束失败,甚至检查约束,本应是唯一的行导致连接加倍,可能导致“数据已移动”错误,等等。对于几乎所有涉及锁的问题,这都是错误的解决方案:如果您有并发写入者,请使用
SNAPSHOT。如果没有并发作者,那么您还担心什么?最多你可以为性能做TABLOCK -
另请参阅这些文章 sentryone.com/blog/aaronbertrand/bad-habits-nolock-everywhere 和 brentozar.com/archive/2019/08/… 和 itprotoday.com/sql-server/… 以及来自实际 Microsoft 员工 dba.stackexchange.com/a/281562/220697 的文章
-
如果我们假设每个表有 10 列,您希望结果集包含 5000 行包含 10 列还是 1000 行包含 50 列之一?
标签: sql sql-server