1. 表做过统计了吗? analyze table TableName compute statistics; 2. 做过查询计划了吗? 是否真正用上了索引? 是 INDEX FAST FULL SCAN 吗? 3. 如果不是统计整个表的函数,查询一条记录是否存在可以用下面 的方法: SELECT ORDER_ID INTO :ll_OrderID FROM ORDER WHERE PROD_ID = :ls_CheckProd AND ROWNUM < 2 USING SQLCA; IF SQLCA.SQLNRows <> 0 THEN ...
这种方式比使用count(*)效率高很多.
try select count(rowid) from tablename
select count(rowid) from tablename这个方法速度没select count(*) from table; 快! 不过500万的数据也不要那么久吧,不知道你在什么机器上运行的。下面是我在小型机上运行所花的时间: SQLWKS> set timing on; 计时 打开 SQLWKS> select count(*) 2> from tablename 3> COUNT(*) ---------- 1019854 已选择 1 行。 分析 0.00(占用时间) 0.00 (CPU) 执行/读取 1.07(占用时间) 0.39 (CPU) 合计 1.07 0.39
select count(column1) from tablecolumn1有index
leecooper0918(PajeroFans),用了analyze之后确实提高了速度,请问如何查看是否使用了"INDEX FAST FULL SCAN"?
看查询计划啊步骤: 1. 创建plustrace 角色(以SYS用户登陆) set echo on drop role plustrace; create role plustrace; grant select on v_$sesstat to plustrace; grant select on v_$statname to plustrace; grant select on v_$session to plustrace; grant plustrace to dba(or other user) with admin option; set echo off 2. 创建PlanTable表(以上面被赋予角色的用户登陆)
create table PLAN_TABLE ( statement_id varchar2(30), timestamp date, res varchar2(80), operation varchar2(30), options varchar2(30), object_node varchar2(128), object_owner varchar2(30), object_name varchar2(30), object_instance numeric, object_type varchar2(30), optimizer varchar2(255), search_columns number, id numeric, parent_id numeric, position numeric, cost numeric, cardinality numeric, bytes numeric, other_tag varchar2(255), partition_start varchar2(255), partition_stop varchar2(255), partition_id numeric, other long, distribution varchar2(30)); 3. 进入sqlplus,敲入 set autotrace on 4. 运行SQL,你就能看见查询计划了.
1. 表做过统计了吗?
analyze table TableName compute statistics; 2. 做过查询计划了吗?
是否真正用上了索引? 是 INDEX FAST FULL SCAN 吗? 3. 如果不是统计整个表的函数,查询一条记录是否存在可以用下面
的方法: SELECT ORDER_ID INTO :ll_OrderID
FROM ORDER
WHERE PROD_ID = :ls_CheckProd
AND ROWNUM < 2
USING SQLCA; IF SQLCA.SQLNRows <> 0 THEN ...
这种方式比使用count(*)效率高很多.
select count(rowid) from tablename
不过500万的数据也不要那么久吧,不知道你在什么机器上运行的。下面是我在小型机上运行所花的时间:
SQLWKS> set timing on;
计时 打开
SQLWKS> select count(*)
2> from tablename
3>
COUNT(*)
----------
1019854
已选择 1 行。
分析 0.00(占用时间) 0.00 (CPU)
执行/读取 1.07(占用时间) 0.39 (CPU)
合计 1.07 0.39
看查询计划啊步骤: 1. 创建plustrace 角色(以SYS用户登陆) set echo on drop role plustrace;
create role plustrace; grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$session to plustrace;
grant plustrace to dba(or other user) with admin option; set echo off 2. 创建PlanTable表(以上面被赋予角色的用户登陆)
create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
res varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30)); 3. 进入sqlplus,敲入 set autotrace on
4. 运行SQL,你就能看见查询计划了.
统计的话,CBO(RBO)不会选择进行索引扫描,而是全表扫描. 如果一个表中的数据进行频繁的插入/删除/更新操作,那么需要定期
更新这个表上的统计信息。一般我的做法是建立一个JOB,每个月底定期
更新统计信息. analyze table Tablename compute statistics 是对全表进行统计,
在数据量很大时,非常慢,也非常占用temp表空间.为了节省时间,可以
采用部分数据,进行统计.例如:
ANALYZE TABLE tablename ESTIMATE STATISTICS
SAMPLE 20 PERCENT 上面语句的意思是采用表中20%的数据进行统计,可以自行设置,
一般不能小于20%,否则统计出来的信息会不准确.