在群里看到一个基础题,有关索引的使用。

题目就在这里,有的朋友说选B,有的选C,有的说题目不严谨,还有的说没答案,都是错误的。

讨论了很久,有两个共性的问题,值得拿出来说下:

  • a=1 and b=1 和 b=1 and a=1 会有效利用 idx(b,a) 吗?
  • b=1 还会利用索引 idx(a,b)吗?

实践出真知,我就试着上机操作下。

create database factory ;use factory
go create table dbo.workflow ( flowid int, flowamount int, flowcount int )go

先回答第一个问题,判断条件的顺序会影响索引使用吗

这儿模拟题目中的 idx(b,a) 索引结构create index idx_amt_id on dbo.workflow(flowamount,flowid)模拟 a=1 and b=1 的查询select * from dbo.workflow
where flowid = 1 and flowamount = 1 模拟 b=1 and a=1 的查询select * from dbo.workflow
where flowamount = 1 and flowid = 1

可以看到,当表新建,还没有数据时,优化器根本不会去判断用不用索引,而是直接全表扫描。反正就一个数据页。

当我们加点数据时,再看看反应:

这里不得不再提下 tally table 的用法,实在看不下去利用循环来生成测试数据的方法

DECLARE @BEGIN DATETIME = '2010-01-01',@END DATETIME = '2017-10-30'DECLARE @INC INT ;SELECT @INC = DATEDIFF(DAY,@BEGIN,@END); WITH L0 AS ( SELECT * FROM (VALUES(1),(2),(3)) AS T(C) ),    L1 AS (SELECT a.C,b.C AS BC FROM L0 AS a cross join L0 AS b ),    L2 AS (SELECT a.C,b.C AS BC FROM L1 AS a cross join L1 AS b ),    L3 AS (SELECT a.C,b.C AS BC FROM L2 AS a cross join L2 AS b ),    L4 AS (SELECT a.C,b.C AS BC FROM L3 AS a cross join L3 AS b ),    L5 AS (SELECT a.C,b.C AS BC FROM L4 AS a cross join L4 AS b )insert into  dbo.workflow (flowid,flowamount,flowcount)            SELECT TOP 50000 RNK , RNK * 10, RNK + 20 FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RNK FROM L5) M

此时表里有5万条数据,再看上面两条查询的执行计划:

这儿模拟题目中的 idx(b,a) 索引结构create index idx_amt_id on dbo.workflow(flowamount,flowid)模拟 a=1 and b=1 的查询select * from dbo.workflow
where flowid = 1 and flowamount = 1 模拟 b=1 and a=1 的查询select * from dbo.workflow
where flowamount = 1 and flowid = 1

很明显,都会走索引 idx(b,a) 这种模式,与 b 在前和 a 在前无关。优化器可以优化这部分表达式的重组。

但,是不是所有条件表达式都没有先后顺序要求呢?肯定不是

只有在相等条件判断时,先后顺序不重要,一旦有表达式用于非等判断,顺序就很重要了,如下:

select * from dbo.workflow
where flowamount > 39 and flowid = 1 select * from dbo.workflow
where flowid = 1 and flowamount > 39

这里优化器提示,建立一个相等判断条件的索引在前,非等判断字段在后的索引 (flowid,flowamount)。所以本质上,索引结构中字段先后不受制于查询中相等判断条件表达式字段的顺序,而受制于非等条件判断表达式。即非等判断字段(flowamount>39)需要放在相等判断字段(flowid=1)的后面。

create index idx_id_amtr on dbo.workflow(flowid,flowamount)select * from dbo.workflow
where flowamount > 39 and flowid = 1 select * from dbo.workflow
where flowid = 1 and flowamount > 39

再看两者的执行计划:

这里就走了我们刚才新建的索引 idx_id_amtr

第二个问题,b=1 还会利用索引 idx(a,b)吗

在上面的示例中,建立 index(flowamount,flowid) 的索引,那么对应到要解决的问题,便是 where flowid = 1 会走 index(flowamount,flowid)的索引吗?

select * from dbo.workflow
where  flowid = 1

由此可见 b=1 是不会利用索引 idx(a,b) 了。

oracle判断时间条件相等_判断条件的先后顺序,会引起索引失效么?相关推荐

  1. z变换判断稳定性和因果性_判断因果性.PPT

    判断因果性 10.7离散时间系统系统函数与Z域分析 一.单位样值响应与系统函数 1.由零极点分布确定单位样值响应 由零极点分布确定单位样值响应(续) 利用z-s平面的映射关系 10.8 系统函数的方框 ...

  2. java线程条件变量_使用条件变量(多线程笔记)

    条件变量属性: 使用条件变量可以以原子方式阻塞线程,知道某个特定条件为真为止.条件变量始终与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,知道满足某个条件为止.对掉件的测试时在互斥锁的保护下 ...

  3. asp.net怎么实现按条件查询_【33期】分别谈谈联合索引生效和失效的条件

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 这道题考 ...

  4. php 判断来源 微信客户端_判断浏览器HTTP_USER_AGENT类型之微信浏览器判断

    在微信公众平台的开发过程中,我们有时需要开发网页并判断是否是是来自微信浏览器访问,本文介绍如何做出这一判断. 在学习这篇之前,应该先了解一下PHP 的 $_SERVER变量. 下面我们开始讲解具体方法 ...

  5. android 判断时间是否过期_眉笔眉粉有保质期吗?怎么判断眉笔眉粉是否过期?...

    眉笔和眉粉是我们日常化妆中都需要使用的化妆品,能画出完美的眉形.不过,很多人对于眉笔眉粉是否有保质期都是不清楚的,那下面让Audrey来为大家解答这个问题吧!想知道的朋友不要错过哦! 眉笔眉粉有保质期 ...

  6. sql 判断记录是否存在_判断数据库是否存在该条记录,count(0) or limit

    如题,当有场景需要你判断,数据库表中,有/没有的时候,你会怎么写SQL语句? 使用select count(0) ,select count(1),select count(*)嘛?顺便问一下啊!这三 ...

  7. 判断图有无环_判断无向图/有向图中是否存在环

    本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现 ...

  8. python123判断ip地址合法性_判断IP地址的合法性

    每台计算机都有独一无二的编号,称为ip地址,每个合法的ip地址由'.'分隔开的4个数字组成,每个数字的取值范围为0--255 输入一个字符串,判断其是否为合法的IP地址,若是输出'YES',否则输出' ...

  9. mysql多组合条件查询_多条件组合查询

    // 条件(criteria) 分别为 cname, gender, cellphone, email public List query(Customer criteria){ try{ // 给出 ...

  10. java判断时间是不是星期五_Java判断当前日期是星期几

    参考链接地址:http://blog.csdn.net/a9529lty/article/details/3206942 /** * 判断当前日期是星期几 * @param pTime 修要判断的时间 ...

最新文章

  1. win10系统上安装cmder并实现右键启动
  2. 37、iamgeview 图层叠加
  3. 科学家发现鱼会数学,5以内的加减法难不倒它,网友:要多吃鱼了
  4. 【Linux】15.mdc启动网卡并设置其ip和子网掩码
  5. 商城html源码_延边小程序商城
  6. MAC设置——企业邮箱标准版
  7. windows10 安装mqtt服务器和client客户端进行本地调试
  8. 类名作为方法和形参的返回值
  9. 树莓派教程 - 2.2 树莓派CSI摄像头,raspivid、raspistill常用参数
  10. 如何测试W5300的内部TX/RX存储器?
  11. 【PAT甲】1007 Maximum Subsequence Sum (25分),求最大字段和及区间
  12. 飞机大战小游戏3.0
  13. Windows下LaTeX安装教程与新手入门
  14. (外接屏幕亮度控制软件)AOC显示器、Dell显示器
  15. 2022张宇考研基础30讲 第六讲 中值定理
  16. 游戏加盟和游戏代理有什么区别?哪个更好?
  17. 上手简单的专业麦克风,室内户外清晰录音,唯乐狗G3S体验
  18. 智能手机的演变历程及发展趋势
  19. 南大庄建军计算机学院讲座,南京大学庄建军来校进行双创教育交流
  20. 世界500强高频逻辑推理智力面试题 (三)

热门文章

  1. BZOJ 1029 [JSOI2007]建筑抢修 已更新
  2. 淘宝面试题:小白鼠与毒药
  3. 视频码率,帧率和分辨率的联系与差别
  4. 汇编程序16位带符号变量计算
  5. linux普通用户配置自己的python环境
  6. 【LeetCode】【数组】题号:*665,非递减数列
  7. ENVI学习总结(八)——图像镶嵌
  8. 不透水面提取操作实现
  9. 利用 Global Mapper 软件下载 Google 影像(中英文对照)
  10. 实体关系抽取任务方法及SOTA模型总结