关于SQL优化
说句大废话,那就是“合理的平衡各种资源的使用,内存,cpu,io 等等”。这也是很有道理的,但是实际就不好做了,如何平衡呢?
具体点的么,通过比较,应该是响应时间做为主要的评判因素了。但是可能由于一些不确定的因素,可能会出现:这次跑的快,不等于下次也跑的快了。
那就要根据表的数据量的变化,确定一个比较合理的执行计划了,主要还是要降低逻辑读为调优的目标,其实物理读意义不大,一个sql语句第一次执行物理读肯定是很大的,到了第2次物理读也许就很小了。
某高人说:
在数据库整体上来讲,是要降低 物理读
而对于单条 sql 来讲,是以逻辑读的降低为标准的
道理很简单,对于单条sql来说,如果反复运行,物理读决定于 data buffer 的大小 ,第一次运行 和 第二次运行也是不一样的。
但比较稳定的是 逻辑读。 如果以物理读为标准,那难道物理读为0的sql就是好sql 了?如果sql的逻辑读都良好,那数据库整体的物理读降下来也是很自然的事情
高人又说:
临时段是不会生产redo 的
buffer gets 就可以理解为 对 buffer cache 中 buffer 的访问 buffer*次 ,也可以看做访问的 buffer数量,当然可能存在着一个buffer被访问多次的情况
至于 buffer gets,如果访问的块不在内存中自然就产生物理读,可物理读并不影响buffer gets ,因为对数据的访问最终是在内存中完成的,虽然额外地有物理读。
db block gets 仅仅表示 类似dml这类操作去访问数据块,dml 操作数据最终也是在访问buffer的过程中完成的啊,而 consistent gets 表示类似 select这样的查询去访问buffer。 更严格来说,是叫 current mode and query mode .这是oracle的读一致性的特点决定的
相关文档:
一、 简单查询
简单的Transact-SQL查询只包括选择列表、from子句和WHERE子句。它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email
from testtable
WHERE name='张三'
(一) 选择列 ......
建表
create table users(
id number(4) primary key,
username varchar2(10),
password varchar2(10)
)
查询表并解锁表(即可以点击输入框下面的"锁"图标工具, 即"Edit data")
select * from users for update
删除表中多余的列
alter table mobilephone drop column mobiletype
转载
------------------- ......
二、以形参的形式定义和使用记录、对象类型
在用作形式参数时,记录类型和对象类型有很多相同之处。在将它们作为游标、函数或过程的形式参数以前,事先都必须定义一个记录类型或者对象类型。
如下例所示:
记录
DECLARE
-- Define a record type.
TYPE individual_record IS RECORD
(individual_id ......
三、嵌套表的使用方法
1、将嵌套表定义为PL/SQL的程序构造块
TYPE type_name IS TABLE OF element_type[NOT NULL];
如下例所示:
DECLARE
-- Define a nested table of variable length strings.
TYPE card_table IS TABLE OF VARCHAR2(5 CHAR);
-- Declare and initialize a n ......
上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,往往需要反复试验比较不同的语句以得到最佳方案。最好的方法当然是测试,看实现相同功能的SQL语句哪个执行时间最少,但是数据库中如果数据量很少,是比较不出来的,这时可以用查看执行计划,即:把实现相同功能的多条SQL语句考到查询分析器,按 ......