问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql语句优化。oracle中,这两个sql语句,由于数据量非常的大。有几G。查询非常的慢。求高手帮忙优化

发布网友 发布时间:2022-05-05 04:52

我来回答

5个回答

热心网友 时间:2023-10-10 03:00

-- 以第2个sql 为例
1. 在数据库库系统中,如果经常用到一些大的查询语句,
应该要考虑将这些查询建立模型,并在模型上建立索引。
create table tr_resource2teammb as
SELECT DISTINCT resourceid
FROM tr_teammember WHERE teamid =20160
UNION
SELECT DISTINCT resourceid
FROM tr_resource WHERE genresteamid =20160;
2. 建立索引,要保证做关联的表的字段上都有索引。
create index idx_tr_resource2teammb_1 on tr_resource2teammb(resourceid);
create index idx_tr_resourcevalue_1 on tr_resourcevalue(userfieldid);
create index idx_tr_resourcevalue_2 on tr_resourcevalue(resourceid);
create index tr_userfield on tr_userfield(userfieldid);
3. 然后就是sql方面的优化,用 exists 替换 in
select select u.resourceid, u.userfieldid from
tr_resourcevalue u, tr_userfield p
where u.userfieldid = p.userfieldid
and exists (
select 1 from tr_resource2teammb t where u.resourceid=t.resourceid
)
order by u.userfieldid
4. 如果仍然很慢的话,要看一下
tr_resourcevalue,tr_userfield 表的是不是经常发生变化,
因为 表的属性已经存在 数据库的数据字典中,查询计划的定制也与
表的属性有关(对一条SQL按F5可以查看查询计划),
表结构或者表数据或者表索引发生变化,如果不及时更新到数据字典中,
会影响查询速度。以下语句用于更新表在数据库的中的属性。
analyze table tr_resourcevalue estimate statistics

5. 如果仍然很慢,就要看下数据库系统配置方面后者机器硬件的问题了。
-- 这方面我就不太懂了追问谢谢,只是分只能给一个人了

热心网友 时间:2023-10-10 03:00

1)如果可以用exist 就不要使用in 同时您看下相关联的表字段characvalueid resourceid,加上索引
select c.characvalueid, c.sequencekey, l.resourceid
from tr_characvalue c, tr_resourcecharac l
where c.characvalueid = l.characvalueid
and exists (select 1
from tr_teammember tt
WHERE tt.teamid = 20160
and tt.resourceid = l.resourceid)
union
select c.characvalueid, c.sequencekey, l.resourceid
from tr_characvalue c, tr_resourcecharac l
where c.characvalueid = l.characvalueid
and exists (select 1
from tr_resource tr
WHERE genresteamid = 20160
and tr.resourceid = l.resourceid)
--order by c.characid, c.sequencekey 这个没有给您排序。

或1楼提到的改成这个
select c.characvalueid, c.sequencekey, l.resourceid
from tr_characvalue c, tr_resourcecharac l
where c.characvalueid = l.characvalueid
and (exists (select 1
FROM tr_teammember
WHERE teamid = 20160
and resourceid = l.resourceid
)
or exists (select 1
FROM tr_resource
WHERE genresteamid = 20160
and resourceid = l.resourceid
)

2)userfieldid 两个表加索引
select u.resourceid, u.userfieldid
from tr_resourcevalue u, tr_userfield p
where u.userfieldid = p.userfieldid
and( exists (select 1
FROM tr_teammember
WHERE teamid = 20160
and resourceid = u.resourceid
)
or exists (select 1
FROM tr_resource
WHERE genresteamid = 20160
and resourceid = u.resourceid
)
)
order by u.userfieldid

热心网友 时间:2023-10-10 03:01

/** try this: */

-- 1)
select
c.characvalueid,
c.sequencekey,
l.resourceid
from tr_characvalue c
join tr_resourcecharac l on c.characvalueid = l.characvalueid
where 1=1
and (1=2
or exists (select 1
FROM tr_teammember
WHERE teamid = 20160
and resourceid = l.resourceid
)
or exists (select 1
FROM tr_resource
WHERE genresteamid = 20160
and resourceid = l.resourceid
)
)
order by c.characid, c.sequencekey

-- 2)
select u.resourceid, u.userfieldid
from tr_resourcevalue u
join tr_userfield p on u.userfieldid = p.userfieldid
where 1=1
and (1=2
or exists (select 1
FROM tr_teammember
WHERE teamid = 20160
and resourceid = u.resourceid
)
or exists (select 1
FROM tr_resource
WHERE genresteamid = 20160
and resourceid = u.resourceid
)
)
order by u.userfieldid追问谢谢。我这样写确实提升性能提升了不少。查询速度快了,能解释下为何要加“1=2”这个条件呢。我发现不加这个条件就变成死循环了一样,造成内存溢出了

追答其实没啥特殊的作用,只是为了方便格式化、调整逻辑,提供可读性。
若不用,可以这样:
...
and (exists (select 1
FROM tr_teammember
WHERE teamid = 20160
and resourceid = u.resourceid
)
or exists (select 1
FROM tr_resource
WHERE genresteamid = 20160
and resourceid = u.resourceid
)
)

热心网友 时间:2023-10-10 03:01

如果你的ORACLE是9I或者10G

可以通过在SQLPLUS中执行如下SQL命令得到执行计划:

set autot trace;

set timing on;

执行你要执行的SQL语句就可以得到SQL语句的执行计划了。

有什么问题给我留言

希望能帮助你,祝你好运
另外,团IDC网上有许多产品团购,便宜有口碑

热心网友 时间:2023-10-10 03:02

1)
c.characvalueid,l.characvalueid ,l.resourceid ,teamid =20160 ,genresteamid =20160
最好都有索引.
数据量太大就不要用ORDER BY

select c.characvalueid, c.sequencekey, l.resourceid from
tr_characvalue c, tr_resourcecharac l
where c.characvalueid = l.characvalueid and l.resourceid
IN(SELECT DISTINCT resourceid FROM tr_teammember WHERE teamid =20160
UNION all SELECT DISTINCT resourceid FROM tr_resource WHERE genresteamid =20160)
--order by c.characid, c.sequencekey
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 四川绵竹郡郎厥根粉好不好 蕨根粉可以和羊肉白菜一起炖吗? mysql 数据库中空值与0怎样区分 荣耀60上市时间 荣耀60发布时间 缺维生素b6和b1怎么办 68元老年手机能当充电宝 昨天买了个老年机,能当充电宝的那种,原装充电器好像是350ma的,充了 充电宝能帮手提电视机(老年看戏机)充电吗? 临时营业执照怎么刻公章? 一般刻一个公章要多少钱啊,普通的 我想刻个公章 刻公章刻公章刻公章 如何刻公章 公司公章打失了 请问有什么地方能刻 华盛新外滩能读什么学校? 温州顺锦国际宴会中心和华盛外滩宴会中心、嘉运国际大酒店哪个婚宴比较好? 上海外滩22号亚柏正规吗?谁来解疑惑 如何在怀集县注册公司 瓯海新桥去温州华盛外滩要坐什么车坐几路车去 梦见河水越涨越高,自己也拼命的往一座高山上爬 英语翻译 1 好记性,不如烂笔头.2 师父引进门,修行在个人. 要去越南旅游,怎么办理越南签证呢,需要注意什么问题 自由行,请教去越南怎么签证 重装系统后,佳能打印机打印图片颜色变浅怎么办? 佳能G2800打印机打印照片颜色很淡,与电脑的照片相比颜色差好多 开CS出现could not load library怎么解决 用浩方玩cs1.6点击“开始游戏”后跳出提示“could not load library"是怎么回事 我玩CS的时候,刚进去会弹出W_Couldnot load gfx.wad,然后就不能玩了?怎么搞的? CS on line 出现could not load hw.dll Please try again at a later time字样 安装CS 5 汉化补丁后出现could not load default keyboard 求生之路2一进游戏就显示Could not load library matchmaking怎么办啊 用850型旋转燃气木炭烤箱烤红薯可以吗 电脑玩CSGO进游戏1分钟就蓝屏 玩正版CSGO启动时出现错误?求解决是steam里面的 开机弹出could not load graphics dll窗口,该怎样解决? 我的电脑一玩游戏就死机,CSGO Probably caused by : nvlddmkm.sys ( nvlddmkm+1584ac ) 液化气红薯烧炉生意好吗? 求璀璨人生,背景纯音乐,就是每个重要场景的背景纯音乐! 璀璨人生49集叶琳赫凡结婚时的纯背景音乐叫什么?