SQL更新查询性能

SQL更新查询性能,sql,azure-sql-database,Sql,Azure Sql Database,我正在使用Azure SQL数据库。 如果我在Building表中有150K条记录。 Residental列的类型为bit。 一半的记录具有Residental=1。 在我的例子中,这两个查询中哪一个在性能方面更好 UPDATE p.Building SET Residental = 1 WHERE References > 100 UPDATE p.Building SET Residental = 1 WHERE References > 100 AND Residental

我正在使用Azure SQL数据库。 如果我在
Building
表中有150K条记录。
Residental
列的类型为
bit
。 一半的记录具有
Residental=1
。 在我的例子中,这两个查询中哪一个在性能方面更好

UPDATE p.Building
SET Residental = 1
WHERE References > 100

UPDATE p.Building
SET Residental = 1
WHERE References > 100
AND Residental <> 1
更新p.大楼
集合剩余=1
其中引用>100
更新p.大楼
集合剩余=1
其中引用>100
及住宅1
更新:

这是分析器结果。我想第一个更好?如果所有记录都有
Residental=1
0
,那会怎样?这会影响分析的结果吗?我尝试过执行测试,但分析器的结果几乎相同

编辑

现在,您已经发布了解释输出,有几件事:

  • 看起来DBMS正在使用的任何东西都没有索引。如果我是你,我会在“References”字段和“Residential”字段上添加一个索引,然后重新运行你的评测
  • 对于第二个查询,您可以在这两个字段上添加多列索引,这可能是性能方面的最佳选择
  • 您的“聚集索引扫描”应该更改为告诉您它正在使用新索引
这里有一个关于索引的详细的很好的解释,但是你可以作弊并添加推荐的索引,你应该做得很好

原始答案

在我的例子中,这两个查询中哪一个在性能方面更好

UPDATE p.Building
SET Residental = 1
WHERE References > 100

UPDATE p.Building
SET Residental = 1
WHERE References > 100
AND Residental <> 1
分类回答,你提供的信息无法判断。您需要查看RDBMS将用于执行查询的计划。您没有说是哪个数据库,所以这里是MySQL文档:

这主要取决于索引和统计数据以及数据库供应商,但您可以通过解释查询来生成所有这些信息。发布两个查询的解释结果,您将得到答案

到目前为止,答案是视情况而定编辑

现在,您已经发布了解释输出,有几件事:

  • 看起来DBMS正在使用的任何东西都没有索引。如果我是你,我会在“References”字段和“Residential”字段上添加一个索引,然后重新运行你的评测
  • 对于第二个查询,您可以在这两个字段上添加多列索引,这可能是性能方面的最佳选择
  • 您的“聚集索引扫描”应该更改为告诉您它正在使用新索引
这里有一个关于索引的详细的很好的解释,但是你可以作弊并添加推荐的索引,你应该做得很好

原始答案

在我的例子中,这两个查询中哪一个在性能方面更好

UPDATE p.Building
SET Residental = 1
WHERE References > 100

UPDATE p.Building
SET Residental = 1
WHERE References > 100
AND Residental <> 1
分类回答,你提供的信息无法判断。您需要查看RDBMS将用于执行查询的计划。您没有说是哪个数据库,所以这里是MySQL文档:

这主要取决于索引和统计数据以及数据库供应商,但您可以通过解释查询来生成所有这些信息。发布两个查询的解释结果,您将得到答案


到目前为止,答案是视情况而定

我删除了不兼容的数据库标记。请用你实际使用的数据库来标记这个问题。我想第二个是最快的。更新会更少,如果对Residental进行索引,则读取会更少。这是经常发生或仅发生一次的情况吗?在引用和Residental上添加一个索引,则第二个索引的速度将是原来的两倍。除了性能之外,您还发现,第一个查询可能会更新已经具有Residental=1的行。这将导致“无用”的锁。我只是尽量避免锁定超出实际需要的内容。我删除了不兼容的数据库标记。请用你实际使用的数据库来标记这个问题。我想第二个是最快的。更新会更少,如果对Residental进行索引,则读取会更少。这是经常发生或仅发生一次的情况吗?在引用和Residental上添加一个索引,则第二个索引的速度将是原来的两倍。除了性能之外,您还发现,第一个查询可能会更新已经具有Residental=1的行。这将导致“无用”的锁。我只是尽量避免锁定超过我实际需要的锁。谢谢你的详细回答!谢谢你的详细回答!