oracle 50W数据,查询要好几分钟,怎么优化数据库?
表结构如下:
-- Create table
create table CSS_SUPPLY
(
supply_id VARCHAR2(20) not null,
user_id VARCHAR2(16) not null,
cont_no VARCHAR2(10),
reg_date VARCHAR2(20),
product_id VARCHAR2(20),
product_name VARCHAR2(200),
uom VARCHAR2(10),
trademark VARCHAR2(30),
origin VARCHAR2(30),
category VARCHAR2(10),
quantity NUMBER(10),
deliver_days NUMBER(10),
deadline VARCHAR2(20),
img_uri VARCHAR2(600),
status VARCHAR2(2),
product_name_en VARCHAR2(200),
trademark_en VARCHAR2(30),
origin_en VARCHAR2(30),
category_en VARCHAR2(10),
uom_en VARCHAR2(10),
remark_en VARCHAR2(4000),
visit_count NUMBER(16),
stock_number NUMBER(16),
enquiry_count NUMBER(16),
price NUMBER(20,2),
product_code VARCHAR2(20),
standard VARCHAR2(150),
standard_en VARCHAR2(150),
model VARCHAR2(150),
model_en VARCHAR2(150),
cont_name VARCHAR2(30),
cont_name_en VARCHAR2(30),
cont_email VARCHAR2(60),
cont_phone VARCHAR2(50),
cont_mobile VARCHAR2(50),
cont_fax VARCHAR2(50),
eval_count NUMBER(16),
oa_info_lvl VARCHAR2(20),
oa_operator_id VARCHAR2(20),
oa_info_date VARCHAR2(20),
stock_type VARCHAR2(10),
order_count NUMBER(16),
user_name VARCHAR2(200),
praise_count NUMBER(16),
share_count NUMBER(16),
store_status VARCHAR2(2),
shop_status VARCHAR2(2),
cate_id VARCHAR2(10),
brand_id VARCHAR2(100),
remark CLOB,
remark1 VARCHAR2(4000)
)
tablespace CSS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 40320
next 128
minextents 1
maxextents unlimited
pctincrease 0
);
-- Create/Recreate primary, unique and foreign key constraints
alter table CSS_SUPPLY
add primary key (SUPPLY_ID)
using index
tablespace CSS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 2M
next 128K
minextents 1
maxextents unlimited
pctincrease 0
);
表里有50W数据,
select * from css_supply 这样查询很快(在plsql查询之后返回几条)
但是加条件就会很慢 比如select * from css_supply where status='1' 经常查询的列都加了索引,但还是慢,是怎么回事?
大数据要怎么处理? 数据 数据库 优化 sql 结构
[解决办法]
这样的表列太多了,全表扫描肯定是很慢了。所以首先对需要的查询条件尽量去加索引。
1、对于像状态之类的列,不是很多的,就可以加位图索引,对于唯一的列,就加唯一索引,其余的创建普通索引。另外最好看一下 执行计划,是否走了你创建的索引。
2、尽量不要使用select * 这样的查询,你这么大的表,就查询你需要的列就可以了 select col1,col2这样就可以了
[解决办法]
这个 看这计划 走索引了吗。。。 就是耗时在全部扫描上了
如果status这列都是数字 可以将这个改为数字类型 查询起来会快点
需要哪列 就写出哪列 不要闲麻烦
[解决办法]
全表扫面肯定慢了
相应的索引都有建立吗?
1、status的索引:对于像状态之类的列,可选择的值不是很多的,就可以加位图索引
2、使用hits
select /*+index(索引名称) index(索引名称)*/ supply_id from CSS_SUPPLY
where ...
[解决办法]
alter session set sort_area_size=? 只对当前连接生效
alter sysetm set sort_area_size=? deferred 对随后登录的账号生效,而对当前连接不生效
alter system set sort_area_size=? scope=spfile 在数据库重新启动后生效
