重写不带where子句的查询以提高性能

时间:2015-11-13 15:19:16

标签: sql-server

我使用以下查询来更新我的表格数据

Update BudCustomers
 set    BudCustomers.ImportedRecord = ImportedRecord
       ,BudCustomers.VersionID = @VersionId
       ,BudCustomers.STATUSID = @StatusId
       ,BudCustomers.MajorCode = EBIC.MajorCode
FROM BudCustomers BCUST
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName
Where     BCUST.ImportedRecord <> @ImportedRecord
       OR BCUST.STATUSID <> @StatusId
       OR BCUST.MajorCode <> EBIC.MajorCode

但由于性能问题,我不想使用where子句而是我想做那些在连接本身的子句事情但我怀疑我是否正确。请为下面的查询提供以下建议。那会是一样的吗?我担心AND和OR条件的连接是否会起作用

Update BudCustomers
 set    BudCustomers.ImportedRecord = ImportedRecord
       ,BudCustomers.VersionID = @VersionId
       ,BudCustomers.STATUSID = @StatusId
       ,BudCustomers.MajorCode = EBIC.MajorCode
FROM BudCustomers BCUST
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName AND BCUST.ImportedRecord <> @ImportedRecord OR BCUST.STATUSID <> @StatusId OR BCUST.MajorCode <> EBIC.MajorCode      

1 个答案:

答案 0 :(得分:1)

不,你的第二个查询不会给出与第一个相同的答案。将其重写为仅限连接的方法是

...
JOIN External_Blk_Itm_Contracts EBIC 
   ON BCUST.LegalName = EBIC.CustomerName 
     AND (BCUST.ImportedRecord <> @ImportedRecord
          OR BCUST.STATUSID <> @StatusId
          OR BCUST.MajorCode <> EBIC.MajorCode)

或者您可以将其重写为仅限WHERE。在任何现代SQL服务器(包括SQL Server)上,所有三个备选方案都应针对同一查询计划进行优化,因此您的第一次尝试可能最容易理解。

如果您遇到性能问题,我会查看您的索引是否适合等值连接,以及连接是否正确...您是否真的使用客户的“合法名称”?作为主键,而不是一些分配或外部标识符?如果客户更改了他的名字怎么办?如果两个独立的客户碰巧具有完全相同的名称会怎样?