之间有差异WHERE [BitField] = 1和WHERE [BitField] <> 0?
它们在逻辑上似乎是等价的。
但是,SQL Server 不同意并创建略有不同的执行计划。(这很糟糕,因为第二种形式不能非常有效地使用现有索引。)
我是否遗漏了什么,或者这只是不等式运算符的行为方式?
我有几百万行的表。它包含来自外部服务的日志,所以我决定不对其进行索引(大量插入,稀疏读取)。
当我运行从没有索引的表中读取的查询时,它需要(不出所料)很长时间。
但是,当我创建索引并运行查询然后删除索引时,速度要快得多(即使创建和删除索引也是如此)。
为什么创建临时索引更快,而不是让 SQL Server 做它的事情?这似乎不直观(为什么 SQL Server 不自己创建索引?)。这种方法有什么缺点吗?
有问题的查询看起来像这样,但我认为它不一定相关,因为我在其他地方也看到了类似的行为。
UPDATE Device
SET Col1 = l.Col1
,Col2 = l.Col2
,Col3 = l.Col3
FROM dbo.Device
OUTER APPLY (
SELECT MAX(Id) AS [Id]
FROM dbo.Logs
WHERE Logs.Device_FK = Device.Id
GROUP BY Logs.Device_FK
) lastLog
OUTER APPLY (
SELECT Col1, Col2, FORMAT(Col3) AS "Col3"
FROM dbo.Logs
WHERE Logs.Id = lastLog.Id
) l
Run Code Online (Sandbox Code Playgroud)