SQL中的Sargable可求值

日期: 2008-07-01 作者:Rudy Limeback 来源:TechTarget中国 英文

问:有可求值或就像它们被称作的阶段1谓词的例子,和不可求值或阶段2谓词的例子吗?他们在今天的SQL中还适合吗?   答:感谢提问。我有段时间没有听到这个词了。实际上,它可以追溯到最初,当IBM创造DB2的时候。据Wikipedia,如果数据库管理系统引擎可以利用一个索引来加速查询的执行(利用索引搜索,不覆盖索引),那么查询中的条件(或断言)可以被称呼为sargable(可求值)的。

这个词是来自Search ARGument的缩写。   所以是的,这个概念在今天仍是适合的。如果我们在订单表里搜索某一特定客户的订单,如果在customer_id列上存在一个索引,那么这个查询是可求值的。   一般说……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:有可求值或就像它们被称作的阶段1谓词的例子,和不可求值或阶段2谓词的例子吗?他们在今天的SQL中还适合吗?


  答:感谢提问。我有段时间没有听到这个词了。实际上,它可以追溯到最初,当IBM创造DB2的时候。据Wikipedia,如果数据库管理系统引擎可以利用一个索引来加速查询的执行(利用索引搜索,不覆盖索引),那么查询中的条件(或断言)可以被称呼为sargable(可求值)的。这个词是来自Search ARGument的缩写。

  所以是的,这个概念在今天仍是适合的。如果我们在订单表里搜索某一特定客户的订单,如果在customer_id列上存在一个索引,那么这个查询是可求值的。

  一般说来,有两个规则:

  1. 避免 NOT

  2. 把列本身放置在操作符的左边

  例如,下面的就不是可求值的:  


select id 
  , cust_id
  , amount
  from orders
  where month(date_ordered) = 05

  当一个函数执行于一个列上,优化不能做索引搜索。把列本身放在左边:  


select id 
  , cust_id
  , amount
  from orders
  where date_ordered between ’2007-05-01’
  and ’2007-05-31’

 
  除了BETWEEN之外,其他的可求值操作符有=,>,<,>=,<=和like,like其后跟着一个——不在最前位置上——通配符。但是避免任何人产生误解,它不意味着你可以做下面的查询:  


select id 
  , cust_id
  , amount
  from orders
  where date_ordered like ’2007-05%’

  没有人会这么做,虽然。。。是吧?

相关推荐