首页 > 解决方案 > “不必要的表扫描”到底是什么意思

问题描述

我有一个带有 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)可能会导致不必要的表扫描。”

在这种情况下,“不必要的表扫描”指的是什么?

有没有更好的方法来编写程序?

标签: sql-serversql-server-2017

解决方案


删除表扫描的最简单方法是在Id列上创建一个索引(可能是唯一的)。一般来说,人们不会期望一个可为空的Id值。有了该索引,查找名称 byId将不需要扫描(或遍历表中的每一行)。

关于“编写程序的更好方法” - 一旦删除了可空性,SELECT没有的简单WHERE应该没问题。


推荐阅读