首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么AND on SQL update语句会减慢操作速度?

为什么AND on SQL update语句会减慢操作速度?
EN

Stack Overflow用户
提问于 2017-09-21 18:05:24
回答 1查看 59关注 0票数 0
代码语言:javascript
复制
CREATE TABLE [LB].[Orders]
(
    [OrderID] [bigint] IDENTITY(1,1) NOT NULL,
    [OrderDate] [date] NOT NULL,
    [Status] [nvarchar](max) NULL,

    CONSTRAINT [PK_MasterOrderID] 
        PRIMARY KEY CLUSTERED ([OrderID] ASC)
) 

CREATE NONCLUSTERED INDEX [PK_Index]  
    ON [BTP_NYA].[LB].[Orders] ([OrderDate]); 

为什么更新#1比更新#2快得多?

代码语言:javascript
复制
string newStaus = "Message";
long OrderID = 123;

// Update #1:
UPDATE [BTP_NYA].[XX].[Orders] 
SET [Status] = '" + newStatus + "' 
WHERE [OrderID] = " + orderID.ToString("0") + "";

// Update #2:
UPDATE [BTP_NYA].[XX].[Orders] 
SET [Status] = '" + newStatus + "' 
WHERE [OrderID] = " + orderID.ToString("0") + " 
  AND [Status] = 'NEW'

更新#1需要0-1毫秒,更新#2需要7-8毫秒

唯一的区别是我在更新#2中检查Status == 'NEW'。我不能索引状态,因为它经常改变值。

EN

回答 1

Stack Overflow用户

发布于 2017-09-21 18:23:21

为什么此更新1比更新2快得多

更新一是使用它的主键 WHERE [OrderID] =查询表。这本质上是O(log n)的二叉树搜索复杂度(n是表中的记录数)

更新二是通过主键和另一个列进行搜索

代码语言:javascript
复制
WHERE [OrderID] = " + orderID.ToString("0") + " AND [Status] = 'NEW'

它现在可以使用二叉树来获取与订单id匹配的值(仍然是O(log n)),但是它必须遍历所有这些记录,以查看哪些记录与"NEW"[Status]匹配。我不是百分之百确定SQL将如何优化这一点,我认为它仍然会首先使用二叉树进行匹配,然后迭代这些结果,所以复杂性如下:

代码语言:javascript
复制
O((x=(log n)) * x)

复杂度越高=查找记录的时间越长。

但是,根据SQL认为什么是优化此查询的最有效方法,这将略有不同。如果你包含了一个执行计划,你将能够看到这一点。

参考资料:

Big O cheat cheeet

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46341078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档