数据库概念相关问题

上传人:cn****1 文档编号:563754629 上传时间:2024-02-19 格式:DOCX 页数:6 大小:24.58KB
返回 下载 相关 举报
数据库概念相关问题_第1页
第1页 / 共6页
数据库概念相关问题_第2页
第2页 / 共6页
数据库概念相关问题_第3页
第3页 / 共6页
数据库概念相关问题_第4页
第4页 / 共6页
数据库概念相关问题_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《数据库概念相关问题》由会员分享,可在线阅读,更多相关《数据库概念相关问题(6页珍藏版)》请在金锄头文库上搜索。

1、数据库概念相关问题1. 什么是存储过程?它有什么优点?答:存储过程是一组予编译的SQL语句,它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。 减少网络流量,例如一个需要数百行的 SQL 代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。2. oracle 的存储过程和函数有什么区别?Oracle中的函数与存储过程的区别:A:函数必须有返回值,而过程没有.B:函数可以单独执行

2、.而过程必须通过execute执行.C:函数可以嵌入到SQL语句中执行.而过程不行. 其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数.Oracle 中的函数与存储过程的特点:A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。C. 存储过程一般是作为一个独立的部分来执行,而函数可以作为査询语句的一个部分来调用,由于函数可以返回一个表对 象,因此它可以在査询语句中位于FROM关键字的后面。3. 什么是事务? 答:事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体

3、一起向系统提交或撤消请求操作,即 这组命令要么都执行,要么都不执行。原子性: 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保 持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务査看数据时数据所处的状态,要么是另一 并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会査看中间状态的数据。这称为可串行性,因为它能 够重新装载起始数据,并且重播

4、一系列事务,以使数据结束时的状态与原始事务执行的状态相同。持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。4. 什么是索引?它有什么优点? 答:索引象书的目录类似,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值 的列表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能 够大大提高数据库性能。5. 什么是触发器,它有哪些优点?说说你遇到过的常见应用?答:触发器是一种特殊类型的存储过程,触发器主要通过事件触发而被执行的,触发器的优点: .强化约束,触发器能够提供比CH

5、ECK约束。 .跟踪变化,触发器可以跟踪数据库内的操作,从而不允许未经允许许可的更新和变化。 .联级运算,比如某个表上的触发器中包含对另一个表的数据操作,而该操作又导致该表上的触发器被触发。6. 触发器分为事前触发和事后触发的区别。语句级触发和行级触发有何区别?事前触发器运行于触发事件发生之前,通常可以获取事件之前和新的字段值 事后触发器运行于触发事件发生之后。语句级触发器可以在语句执行前或后执行, 行级触发在触发器所影响的每一行触发一次7. 视图是什么?游标是什么?答:视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增该查操作,视图通常是一个或多个表的行或列 的子集,视图的结

6、果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如 需要隐藏某些行或列),维护更方便。游标对查询出来的结果集作为一个单元来有效的处理,游标可以定位在结果集的特定行、从结果集的当前位置检索一行或多行、 可以对结果集中当前位置进行修改。8. 怎么优化数据库(在数据百万条记录的数据库中 Oracle)?使用索引建立分区,分区索引使用存储过程9. 如何优化SQL语句 . 对操作符的优化 尽量不采用不利用索引的操作符如:in , not in , is nul, is not null, 等 . 对条件字段的一些优化采用函数处理的字段不能利用索引,进行了显式或

7、隐式的运算的字段不能进行索引条件内包括了多个本表的字段运算时不能进行索引 .在业务密集的SQL当中WHERE后面的条件顺序影响 .应用ORACLE的HINT (提示)处理 . 查询表顺序的影响10. 使用索引查询一定能提高查询的性能吗?为什么?不能。如果返回的行数目较大,使用全表扫描的性能较好。11. 操作符优化 .IN操作符用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的, 从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子査询,

8、再査询外层的表记录,如果转换成功则直 接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分 组统计等方面的 SQL 就不能转换了。推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS方案代替。 . NOT IN 操作符此操作是强列不推荐使用的,因为它不能应用表的索引。推荐方案:用 NOT EXISTS 方案代替 .IS NULL或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。推荐方案:用其它相同功能的操作运算代替,如:a is not null改为a0或

9、a等。不允许字段为空,而用一个缺省值 代替空值,如申请中状态字段不允许为空,缺省为申请。 . 及 2与A=3 的效果就有很大的区别了,因为A2时ORACLE会先找出为2的记录索引再进行比较,而A=3时ORACLE则直接找到=3的记 录索引。 . LIKE 操作符LIKE 操作符可以应用通配符査询,里面的通配符组合可能达到几乎是任意的査询,但是如果用得不好则会产生性能上的问题, 如LIKE %5400%这种査询不会引用索引,而LIKE X5400%则会引用范围索引。一个实际例子:用 YW_YHJBQK 表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE %5400% 这个条件会产生

10、全表 扫描,如果改成YY_BH LIKE X5400% OR YY_BH LIKE B5400%则会利用YY_BH的索引进行两个范围的查询,性能肯定 大大提高。.UNION操作符UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。 实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:select * from gc_dfysunionselect * from ls_jg_dfys这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能 会导致用磁盘

11、进行排序。推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。select * from gc_dfysunion allselect * from ls_jg_dfys12. 说说你知道的一些关于查询优化的方案?1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: ?select id from t where num is null?可以在num上设置默认值0

12、,确保表中num列没有null值,然后这样査询:?select id from t where num=03. 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。4. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: ?select id from t where num=10 or num=20?可以这样査询: ?select id from t where num=10?union all?select id from t where num=205.in 和 not in 也要慎用,否则会导致全表

13、扫描,如: ?select id from t where num in(1,2,3)?对于连续的数值,能用 between 就不要用 in 了: ?select id from t where num between 1 and 36. 下面的査询也将导致全表扫描: ?select id from t where name like %abc%? 若要提高效率,可以考虑全文检索。7. 如果在where子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计 划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的

14、,因而无法作为 索引选择的输入项。如下面语句将进行全表扫描: ?select id from t where num=num?可以改为强制査询使用索引: ?select id from t with(index(索引名)where num=num8. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: ?select id from t where num/2=100?应改为:?select id from t where num=100*29. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:?sel

15、ect id from t where substring(name,1,3)=abc-name以 abc开头的 id?select id from t where datediff(day,createdate,2005-11-30)=0-2005-11-30生成的 id?应改为:?select id from t where name like abc%?select id from t where createdate=2005-11-30 and createdate2005-12-110. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。11. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用 该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号