sql-server - “不必要的表扫描”到底是什么意思
问题描述
我有一个带有 ID 的名称表
Create table Names (
Id int,
Name nvarchar(500)
)
我正在尝试创建一个过程,如果提供了 Id,它将选择 1 个与提供的 Id 匹配的名称,或者如果没有提供 Id,则选择所有名称
Create Procedure SelectNames
@Id int = null
AS
BEGIN
Select * From Names
Where IsNull(@Id, 0) = 0
Or Id = @Id
END
GO
但我收到一个错误:“错误:SR0015:Microsoft.Rules.Data:确定性函数调用(ISNULL)可能会导致不必要的表扫描。”
在这种情况下,“不必要的表扫描”指的是什么?
有没有更好的方法来编写程序?
解决方案
删除表扫描的最简单方法是在Id
列上创建一个索引(可能是唯一的)。一般来说,人们不会期望一个可为空的Id
值。有了该索引,查找名称 byId
将不需要扫描(或遍历表中的每一行)。
关于“编写程序的更好方法” - 一旦删除了可空性,SELECT
没有的简单WHERE
应该没问题。
推荐阅读
- ios - 错误说安装后没有安装cocoapods
- spring-boot - 用于 webhook 帖子的 Springboot 身份验证
- django - 如何根据用户的查看权限编辑 Django 对象实例?
- java - 在 Java 中使用正则表达式模式检测非拉丁字符
- shopify - Bold Commerce - 订阅 - 将订单频率标签添加到 Shopify 订单
- vba - 在 Access 中以编程方式更改导航控件选项卡
- python - 字典值在两个不同的键中修改,而不是一个
- svg - 仅当应用过滤器时,SVG 元素才会在视网膜上像素化
- mqtt - Mosquitto - 订阅本地网桥上的主题
- visual-studio - 在 VS 2019 中找不到终端窗口