点击(此处)折叠或打开 --在sal列上创建非唯一索引 scott@TESTDB11>create index idx_emp1_sal on emp1(sal); Index created. --查询年薪 > 20,000的员工的编号.姓名.薪水.年薪 --不走索引 select empno, ename, sal, sal * 12 from emp1 where sal * 12 > 20000; 点击(此处)折叠或打开 --修改为等价的写法,走索引 select empno, …
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL  > 25000/12;   这是一个非常实用的规则,请务必牢记…
通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. 举例: 低效: (这里,不使用索引) SELECT … FROM DEPT WHERE DEPT_CODE NOT = 0; 高效: (这里,使用了索引) SELECT … FROM DEPT WHERE DEPT_CODE > 0; 需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符. NOT > …
非索引列上的统计 有时候,可能在连接或过滤条件中的列上没有索引.即使对这种非索引列,如果查询优化器知道这些列的数据分布(统计),它也很可能做出最佳的选择. 除了索引上的统计,SQL Server可以在没有索引的列上建立统计.即使不是索引列,当你开启了SQL Server自动创建统计功能,SQL Server就自动在执行WHERE.JOIN等查询列上创建统计.数据分布的信息或者特定值出现在非索引列上的可能性,都能够帮助查询优化器确定最优的处理策略.即使查询优化器不能真正使用索引来定位这些列,这也仍…
一.索引在查询优化中的角色 SQL Server的查询优化器是基于开销的优化器.它通过确认选择性.数据的唯一性以及过滤数据(通过WHERE或JOIN子句)所使用的列来决定最佳的数据访问机制.统计与索引一同存在,但是它们也作为断言的一部分存在于没有索引的列上. 作为谓词引用的列中数据分布的最新信息帮助优化器确定所使用的查询策略.在SQL Server中,这个信息以统计的形式维护,这对于基于开销的优化器创建一个有效的查询执行计划是很重要的.通过统计,优化器能做出返回结果集或中间结果集所花费时间的精确…
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中. 举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果 所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入…
组合索引(concatenated index):由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引. 在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列.当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col…
本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. 今天来写一下统计信息对于复合索引在预估时候的计算方法和潜在问题. 本文原形来自于是个实际业务问题,某SQL在利用一个符合索引做查询的时候,发现始终会出现预估误差较大的情况, 而改变复合索引的列顺序,这个预估行数的误差会发生变化, 也就是说,Create index idx_index1 ON Ta…
有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracle的执行计划. 以下为NULL影响执行计划的测试示例. /*1.构建test表,其中create table方式建立的test表结构object_id非空*,走索引/ SELECT Count(*) FROM all_objects WHERE object_id IS NOT NULL; --41…
在查询中,WHERE 条件也是一个比较重要的因素,尽量少并且是合理的 where条件是徆重要的,尽量在多个条件的时候,把会提取尽量少数据量的条件放在前面,减少后一个 where 条件的查询时间.有些 where 条件会导致索引无效: 1.where 子句的查询条件里有!=,MySQL 将无法使用索引.  2.where 子句使用了 Mysql 函数的时候,索引将无效,比如:select * from tbwhere left(name, 4) = 'xxx'  3.使用 LIKE 迕行搜索…
在一次的优化过程中,由于没有关注执行计划中type列,仅看key列来查看"使用到的索引",导致优化过程走了不少弯路. 以下面SQL为例: SELECT wave_no, SUM(IF(picking_qty IS NULL, , picking_qty)) AS PICKED_QTY, SUM(IF(differ_qty IS NULL, , differ_qty)) AS PICKED_DIFFER_QTY, SUM(IF(relocate_qty IS NULL, , reloca…
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123’ 实际上,经过ORACLE类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123’) 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 现在,假设EMP_TYPE是一个字符类型的索引列. SELECT … FROM EMP WHERE…
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS staff ( id INT PRIMARY KEY auto_increment, name ), age INT, pos ) COMMENT '职位', salary ,) ); 1.2 插入数据 , ); 2 测试&Explain分析 2.1 有索引的情况下%的影响(提出问题) 2.1.1 建立…
摘录自博客:http://www.cnblogs.com/morvenhuang/archive/2009/03/30/1425534.html 一.引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同? 二.B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree.例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree.所以在最开始,简单地介绍一下B-Tree. B-Tree不同于…
原文:第十二章--SQLServer统计信息(2)--非索引键上统计信息的影响 前言: 索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引.一般情况下,默认会在创建索引时,索引列上均创建统计信息.但是不代表在非索引键上的统计信息对性能没有用. 如果表上的所有列都有索引,那么将会是数据库负担不起,同时也不是一个好想法,包括谓词中用到的所有列加索引同样也不是好方法.因为索引会带来负载.因为需要空间存放索引,且每个DML语句都会需要更新索引. 一般…
mybaitis书写sql需要特别注意where条件中的语句,否则将会导致索引失效,使得查询总是超时.如下语句会出现导致索引失效的情况: with test1 as (select count(C_FUNDACCO) val,'a' v from TINF_REQUEST a where a.C_FUNDCODE = #{cFundcode} and a.D_DATADATE = #{dDatadate}), test2 as (select count(C_FUNDACCO) val,'a'…
参考链接:https://blog.csdn.net/zhanghuaishu0/article/details/78505045 调试过程中发现 同一列上的按键 任意两个按键 按下 检测不到低电平(电平拉不下来),在网上找到一个类似的 资料说是:pin脚初始化时,配置的驱动能力不够.修改后测试正常了. 原GPIO初始化如下: nrf_gpio_cfg_output(GPIO0); 修改后如下: nrf_gpio_cfg( pin_number, NRF_GPIO_PIN_DIR_OUTPUT,…
 -- 查询一个数据库表中的索引及索引列use [RuPengWangDB]GOSELECT  indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indidFROM    sysindexes a JOIN sysindexkeys b ON a .id = b .id  AND a .indid = b.indid        JOIN sysobjects c ON b .id = c .id   …
A表字段与B表中的关联,关联条件中一列是随机关联的实现方式 create table test( rsrp string, rsrq string, tkey string, distan string ); '); '); '); '); select * from test; +------------+------------+------------+--------------+--+ | test.rsrp | test.rsrq | test.tkey | test.distan…
很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是"访问类型",更通俗一点就是:mysql找到需要的数据行的方式.一下就是从效率最差到最好顺序分别介绍下: All 这个就是所谓的全表扫描,没有用到任何的index,mysql就是从头到尾把整个表遍历一边,找到所需要的数据行.效率是最差的.如下图,这个表中的usertype不是索引,这个查询中没有用到任何索引,所以就出现…
说说复合索引 写索引的博客太多了,一直不想动手写,有一下两个原因:一是觉得有炒剩饭的嫌疑,有兄弟曾说:索引吗,只要在查询条件上建索引就行了,真的可以这么暴力吗?二来觉得,索引是个非常大的话题,很难概括出所有的情况,你不整出点新意来,倒是有抄袭照搬的嫌疑 既然写了,就写一点稍微不一样的东西出来,好了,废话打住,开搞 搭建测试环境: 创建一张表,模拟实际业务中的一个表,往里面填入数据,时间字段上,相对按照时间均匀地填充,其他字段以GUID填充 Create table BusinessInfoTab…
很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是“访问类型”,更通俗一点就是:mysql找到需要的数据行的方式.一下就是从效率最差到最好顺序分别介绍下: All 这个就是所谓的全表扫描,没有用到任何的index,mysql就是从头到尾把整个表遍历一边,找到所需要的数据行.效率是最差的.如下图,这个表中的usertype不是索引,这个查询中没有用到任何索引,所以就出现了全表扫描…
说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解决由于使用了 OR 导致的全表扫描.然而,实际是不是如此呢?flymorn就拿5万多条数据的MSSQL数据库来测试. 在SQL Server查询分析器中键入如下代码: SET STATISTICS profile ONSET STATISTICS io ONSET STATISTICS time O…
在介绍mysql的多版本并发控制mvcc的过程中,我们提到过mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文我们就来重点讨论一下诸多隐藏列中的行标识DB_ROW_ID,实际上,将行标识称为隐藏列并不准确,因为它并不是一个真实存在的列,DB_ROW_ID实际上是一个非空唯一列的别名.在拨开它的神秘面纱之前,我们看一下官方文档的说明: If a table has a PRIMARY KEY or UNIQUE…
摘要:在mysql的多版本并发控制mvcc中,我们知道mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文分享自华为云社区<眼见为实,看看MySQL中的隐藏列!>,作者:码农参上. 在mysql的多版本并发控制mvcc中,我们知道mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文我们就来重点讨论一下诸多隐藏列中的行标识DB_R…
其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3);   set @bamboo_Code='-01';     SELECT DISTINCT yarn_lot FROM   dbo.rsjob WITH ( nolock ) WHERE  RIGHT(ges_no, 3) = @bamboo_Code        AND Isnull(yarn…
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Scan))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正.   堆表单索引 首先我们构建我们测试需要实验环境,具体情况如下所示: DROP TABLE TEST    CRE…
做苹果开发的朋友在地区列表可能会遇到在页面的右侧有一列类似与导航的索引列,这次有机会遇到了,细细研究了一下,原来没有想象中的困难,只需要简单的几步就能做出自己的索引列.本来想和搜索条在一块讲解,后来考虑了一下,这个东西和搜索条功能虽有相似之处,却并非需要一起使用,所以就单独摘出来,独立介绍吧! 索引列看着就很高大上,实际做出来的效果也挺不错的.这个既不需要引入第三方的类库,还不需要单独的委托,它是uitableview列表控件的一个功能的延伸,将用户的体验做到极致,这也就是苹果细致.人性化的地方…
在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 12/17/1980 800.00 20 7499 ALLEN SALESMAN 7698 2/20/1981 1600.00 300.00 30 7521 WARD SALESMAN…
获取选中行中某一列的值: int index = dg_Product.CurrentRow.Index; //取得选中行的索引 txt_ProductId.Text = dg_Product.Rows[index].Cells["Id"].Value; //获取单元格列名为‘Id’的值…