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快得多?
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'。我不能索引状态,因为它经常改变值。
发布于 2017-09-21 18:23:21
为什么此更新1比更新2快得多
更新一是使用它的主键 WHERE [OrderID] =查询表。这本质上是O(log n)的二叉树搜索复杂度(n是表中的记录数)
更新二是通过主键和另一个列进行搜索
WHERE [OrderID] = " + orderID.ToString("0") + " AND [Status] = 'NEW'它现在可以使用二叉树来获取与订单id匹配的值(仍然是O(log n)),但是它必须遍历所有这些记录,以查看哪些记录与"NEW"的[Status]匹配。我不是百分之百确定SQL将如何优化这一点,我认为它仍然会首先使用二叉树进行匹配,然后迭代这些结果,所以复杂性如下:
O((x=(log n)) * x)复杂度越高=查找记录的时间越长。
但是,根据SQL认为什么是优化此查询的最有效方法,这将略有不同。如果你包含了一个执行计划,你将能够看到这一点。
参考资料:
Big O cheat cheeet
https://stackoverflow.com/questions/46341078
复制相似问题