首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server查询优化:何处(Col=@Col或@Col=Null)

Server查询优化:何处(Col=@Col或@Col=Null)
EN

Stack Overflow用户
提问于 2009-12-20 19:21:38
回答 1查看 1.7K关注 0票数 3

不知道从哪里开始--不确定问题是我在愚弄查询优化器,还是在涉及nulls时索引的工作方式固有的问题。

我遵循的一个编码约定是编写这样的存储过程:

代码语言:javascript
运行
复制
declare procedure SomeProc
  @ID int = null
as
  select
    st.ID,st.Col1,st.Col2
  from
    SomeTable st
  where
    (st.ID = @ID or @ID is null) --works, but very slow (relatively)

当然,在这个简单的测试用例中不太有用,但是当您希望存储的proc对满足某些条件的整个表或行进行操作时,它在其他场景中很有用。但是,在更大的桌子上使用是很慢的.如果我将where子句替换为:

代码语言:javascript
运行
复制
where
    st.ID = @ID --3-5x faster than first example

更让我困惑的是,用-1替换空的速度与上面的“固定”WHERE子句的速度几乎相同:

代码语言:javascript
运行
复制
declare procedure SomeProc
  @ID int = -1
as
  select
    st.ID,st.Col1,st.Col2
  from
    SomeTable st
  where
    (st.ID = @ID or @ID=-1) --much better... but why?

很明显,使事情变得古怪的是零,但为什么,确切地说呢?对我来说,从执行计划上看,答案并不明确。多年来,我在各种数据库、表和Server版本上都注意到了这一点,所以我不认为这是我当前环境的怪癖。我已经通过将缺省参数值从null转换为-1来解决这个问题;我的问题是为什么会工作。

备注

  1. SomeTable.ID被索引
  2. 它可能与(或者实际上可能是)一个参数嗅探问题SQL Server中的参数嗅探(或欺骗)有关,无论它的价值如何,在每次编辑/重新编译proc之后,我几乎一直在用"exec SomeProc“进行测试,省略了可选的参数。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-20 19:34:44

你有很多问题,很有可能

  1. 参数嗅探
  2. 或者不是一个很好的操作人员。

但没有看到这些计划,这些都是有根据的猜测。

参数嗅探

..。默认的"NULL“。尝试使用不同的默认值,例如-1或没有默认设置。

缺省值为NULL的@ID = -1,参数嗅探=普通检查,因此速度更快。

您还可以在Server 2008中尝试使用未知数优化

OR运算符

一些想法..。

如果列不可空,则在大多数情况下,优化器将忽略该条件。

代码语言:javascript
运行
复制
st.ID = ISNULL(@ID, st.ID)

此外,还可以使用IF语句。

代码语言:javascript
运行
复制
IF @ID IS NULL
   SELECT ... FROM...
ELSE
   SELECT ... FROM... WHERE st.ID

或者以类似的方式联合起来。

就我个人而言,在大多数情况下,我会使用参数掩蔽(总是)和ISNULL (我会先尝试)。

代码语言:javascript
运行
复制
alter procedure SomeProc
  @ID int = NULL
AS
declare @maskID int
select @maskID = @ID
...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1936685

复制
相关文章

相似问题

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