- 浏览: 574316 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
使用索引前需要用explain查看下执行计划,然后根据基数是否需要创建索引。
巧用索引
a.如果表中大部分status是1,2 但我们需要查询查询少量的3时,也可以为status添加索引
b.为sql语句添加额外的条件,如查询员工时可以添加城市等字段过滤
c.如果表数据按城市进行查询慢时,可以换个思路如通过城市找到staffId然后再通过staffId查询,这样可以增加区分度加快查询效率
优化前:
优化后:
d.统计个数时可以把查询语句放到select中,这样可以避免生成派生表
优化前:
优化后:
1.应该建索引的字段:
a.经常作为查询条件的字段
b.外键
c.经常需要排序的字段
d.分组排序的字段。
e.有些需要联合使用的需要考虑使用联合索引查询,比如查询男的员工可以使用加上其他的查询条件比如城市等等
2.应该少建或者不建索引的字段有:
a.表记录太少
b.经常需要插入,删除,修改的表
c.表中数据重复且分布平均的字段
3.一些SQL的写法会限制索引的使用:
a.where子句中如果使用in、or、like、!= <>,均会导致索引不能正常使用,将"<>"换成">and<";将"is not null "换成">=chr(0)";
b.使用函数时,该列就不能使用索引,+号属于函数所以会停用索引。
c.比较不匹配数据类型时,该索引将会被忽略。
停用索引例子:
4.一些SQL语句优化的写法:
1.如果from是双表的查询时,大表放在前面,小表放在后面(基础表)。最后面的表是基础表。(只在基于规则的优化器中有效)
2.如果三表查询时,选择交叉表(intersection table)作为基础表.(只在基于规则的优化器中有效)
3.写where条件时,有索引字段的判断在前,其它字段的判断在后;如果where条件中用到复合索引,按照索引列在复合索引中出现的顺序来依次写where条件;
4.查询数量较大时,使用表连接代替IN,EXISTS,NOT IN,NOT EXISTS等。
5.ORACLE采用自下而上的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
5.某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;
下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX'
AND ACCOUNT_TYPE='A';
下面的例子中, ‘+'是数学函数. 就象其他数学函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');
巧用索引
a.如果表中大部分status是1,2 但我们需要查询查询少量的3时,也可以为status添加索引
b.为sql语句添加额外的条件,如查询员工时可以添加城市等字段过滤
c.如果表数据按城市进行查询慢时,可以换个思路如通过城市找到staffId然后再通过staffId查询,这样可以增加区分度加快查询效率
优化前:
explain select * from a where reserve_date BETWEEN '2019-07-01' and '2019-07-31' and city_code = 'shanghai' ;
优化后:
select * from table where reserve_date BETWEEN '2019-07-01' and '2019-07-31' and staff_id in (select id from staff where city_code='shanghai' and virtual=0 and working_state in(3,4));
d.统计个数时可以把查询语句放到select中,这样可以避免生成派生表
优化前:
explain select a.id,c.skillNum from staff a,staff_skill b,( SELECT ssc.staff_id, count(1) AS skillNum FROM staff_skill ssc GROUP BY ssc.staff_id ) c where a.id = b.staff_id and b.skill_id=24 and a.id=c.staff_id order by c.skillNum desc;
优化后:
explain select a.id,( SELECT count(1) FROM staff_skill ssc WHERE ssc.staff_id = a.id GROUP BY ssc.staff_id )skillNum from staff a,staff_skill b where a.id = b.staff_id and b.skill_id=24 order by skillNum desc;
1.应该建索引的字段:
a.经常作为查询条件的字段
b.外键
c.经常需要排序的字段
d.分组排序的字段。
e.有些需要联合使用的需要考虑使用联合索引查询,比如查询男的员工可以使用加上其他的查询条件比如城市等等
2.应该少建或者不建索引的字段有:
a.表记录太少
b.经常需要插入,删除,修改的表
c.表中数据重复且分布平均的字段
3.一些SQL的写法会限制索引的使用:
a.where子句中如果使用in、or、like、!= <>,均会导致索引不能正常使用,将"<>"换成">and<";将"is not null "换成">=chr(0)";
b.使用函数时,该列就不能使用索引,+号属于函数所以会停用索引。
c.比较不匹配数据类型时,该索引将会被忽略。
停用索引例子:
不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0; 使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0; 不使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA'; 使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = ‘AMEX' AND ACCOUNT_TYPE='A'; 不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT + 3000 >5000; 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT > 2000 ; 相同的索引列不能互相比较,这将会启用全表扫描 不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME); 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');
4.一些SQL语句优化的写法:
1.如果from是双表的查询时,大表放在前面,小表放在后面(基础表)。最后面的表是基础表。(只在基于规则的优化器中有效)
2.如果三表查询时,选择交叉表(intersection table)作为基础表.(只在基于规则的优化器中有效)
3.写where条件时,有索引字段的判断在前,其它字段的判断在后;如果where条件中用到复合索引,按照索引列在复合索引中出现的顺序来依次写where条件;
4.查询数量较大时,使用表连接代替IN,EXISTS,NOT IN,NOT EXISTS等。
5.ORACLE采用自下而上的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
5.某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;
下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX'
AND ACCOUNT_TYPE='A';
下面的例子中, ‘+'是数学函数. 就象其他数学函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');
发表评论
文章已被作者锁定,不允许评论。
-
sql 查询一些基础数据(不经常变)关联关系时可以把关联关系写入到表中
2018-04-16 15:18 402原来的查询语句 FROM table1 t LEFT ... -
sql 最小化表查询次(col1,col2) = (select col1,col2 from t)
2018-01-02 16:51 522最小化表查询次数 ... -
sql 用inner join取代in和exists
2018-01-02 16:48 1106使用表连接替换EXISTS ... -
oracle HINT详解
2017-09-01 10:42 483ORACLE的HINT详解 hints是oracle提供的 ... -
oracle jdbctemplate如何优化查询速度
2017-08-21 09:33 12681.设置setFetchSize进行优化 // 可以优化 ... -
oracle Parallel模式-Parallel用法(/*+PARALLEL(n)*/)
2017-08-18 16:48 17951.用途 强行启用 ... -
oracle where条件分支查询
2016-06-30 16:16 492select * from test xx where ... -
oracle 重复数据处理的sql整理
2016-06-22 14:44 371Oracle 删除重复数据只留一条 1、查找表中多余的重 ... -
oracle 常用sql语句积累
2016-01-28 11:01 5421.删除重复列 delete from t t1 where ... -
oracle 表中有子父关系列则使用CONNECT BY PRIOR
2014-10-27 10:08 393查询名字为xx xxx的所有子数据 SELECT re.U ... -
oracle 删除大量数据后整理表(analyze table xxx compute statistics)
2014-10-17 18:09 21721. DELETE 后 TRUNCATE TABLE ; 然 ... -
oracle 高效Sql语句总结
2014-10-08 11:23 484No SQL,No cost. SQL语句是造成数据库 ... -
oracle join关键字使用总结
2014-06-17 13:57 5741.内连接:选出两个表中所有符合连接条件的row构成的集合。 ... -
sql like与索引(后模糊匹配才能让索引有效)
2014-06-15 20:12 1696索引与优化like查询 1. like %keyword ... -
sql order by与索引之间的关系(where条件出现字段才有效)
2014-06-15 20:00 623ORDER BY 通常会有两种实现方法,一个是利用有序索引自动 ... -
oracle exists 和not exists 用法详解
2014-06-15 16:17 514有两个简单例子,以说明 “exists”和“in”的效率问题 ... -
几种范式详解
2014-05-04 10:46 480数据库的设计范式是数 ... -
oracle sql语句优化总结
2013-06-19 16:45 5881.直接路径读方式 --直接路径读方式 drop ta ...
相关推荐
修改SQL数据库排序规则修改表栏位排序规则 修改SQL数据库排序规则: 1.修改为单用户模式 2.然后关闭所有的查询窗口,修改Options的Collocation属性,如:Chinese_PRC_90_CI_AS 3.再修改为多用户模式 修改表栏位...
了解设计数据库的基本步骤 熟练使用T-SQL实现建库、建表、加约束 掌握T-SQL编程,实现功能强大的查询 掌握创建索引、视图,快速访问数据库 掌握创建存储过程,实现复杂的业务规则
通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称 按照从里到外,从上到下的次序解读分析的结果 EXPLAIN PLAN的分析结果是用缩进的格式...
数据库调优可以使数据库应用运行...数据库调优技术可以在不同的数据库系统中使用,它不必纠缠于复杂的公式和规则,然而它需要对程序的应用、数据库管理系统、查询处理、并发控制、操作系统以及硬件有广泛而深刻的理解。
掌握关系数据库SQL语言和使用技术 MySQL的数据类型、运算符、常用函数 Mysql中一种图形化管理工具的使用 MySQL的表类型、字符集 掌握创建索引、视图,快速访问数据库 掌握创建存储过程、触发器,实现复杂的业务规则...
Sql数据库设计规范 1,数据库表命名规范 2,表名命名规则 3,表字段名命名规则 4,索引命名规则 5,主键、外键命名规则 ......
掌握使用SQL语言创建数据库、表、索引和修改表结构。 2、掌握SQL语言对数据库完整性的支持。 掌握约束、规则、默认的使用方法 掌握参照完整性设置的方法 掌握用企业管理器创建和SQL创建、修改的方法 实验二...
附录 2 SQL Server 数据库命名与编码规范 一.数据库对象命名基本规范 1. 总体命名规范 名称的长度不超过 32 个字符。 名称采用英文单词、英文单词缩写和数字,单词之间用"_"分隔。 说明:除非用户提供文档化的行业...
达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...
1.3.4 外键的设计 外键作为数据库对象,很多人认为麻烦而不用,实际上,外键在大部分情况下是很有用的,理由是: 外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK 约束、规则约束、...
通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了SQL Server 2008的技术细节。 本书浓缩了作者作为SQL Server数据库架构师多年来丰富的...
这个.SQL脚本包括了需要创建数据库定义(表,视图,存储过程,触发器,全文索引目录,角色,规则等等,可在此处参考所有细节),以及把与你本地数据库同样的数据内容填充到新数据库里去的所有的东西(这类似于MySQL 的...
1.36 避免在索引列上使用IS NULL和IS NOT NULL 22 1.37 总是使用索引的第一个列 23 1.38 ORACLE内部操作 23 1.39 用UNION-ALL 替换UNION ( 如果有可能的话) 24 1.40 使用提示(HINTS) 25 1.41 用WHERE替代ORDER BY 25...
学习使用T-SQL进行数据库编程,实现多功能数据管理。 编写和使用存储过程,在数据库中实现高性能数据管理。 编写和使用触发器,根据业务规则,实现复杂的数据完整行约束。 学习使用事务处理,使用游标获取查询结果。...
SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则
2 命名规则: 2.1 数据库(Database)的定义 数据库名称 = 数据库内容标识(首字大写) 2.2 表(Table)的定义 命名应尽量反映存储的数据内容。 表名前缀:以该表及与该表相关联的一系列表的内容而得到一个代表统一的标识 ...
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 (1) 选择最有效率的表名顺序(只在基于规则的seo/’ target=’_blank’>优化器...
SQL自学资料、内有各类例题、语句详解 SQL 简史 数据库简史 设计数据库的结构 流行的SQL 开发工具 ...使用SQL 来生成SQL 语句 PL/SQL 简介. TRANSACT-SQL 简介 常见的SQL 错误及解决方法 在SQL 中的常见术语
2.1.3 使用SQL Server 2008的多维数据库和数据挖掘 2.1.4 使用SQL Server 2008管理报表 2.2 规划SQL Server 2008的部署 2.2.1 建立服务器的性能系统 2.2.2 配置I/O子系统 2.2.3 确保可用性和可伸缩性 2.2.4 确保连接...