由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 北京等高手,请帮忙tone一下这个query,周五才被DBA嘲笑过 :-(
相关主题
吐血了aks a simple SQL question
请教一个sql query比较sqlplus和sql developer
咋样选一个表中在另一个表中不含有的记录Oracle DBA position at Austin TX
关于学习数据库我也说几句急! 急!向sybase表中插入数据不好用?
SQL Query Question求教(SQL/Access): Join两个query tables 出错
correlated subqueryhow to make this query
[转载] 求教数据库的query optimization 工作的面试business analyst (SQL) opening in NYC
A sql question请教一个SQL query该怎么写
相关话题的讨论汇总
话题: int话题: bbb话题: aaa话题: start话题: end
进入Database版参与讨论
1 (共1页)
l******y
发帖数: 60
1
有两个table: AAA, BBB,两个table共有的column有start_int, end_int,其中end_int
比start_int大,AAA表中的start_int到end_int的跨度比BBB表更大,现在要从BBB中
挑出所有AAA表中ID=12345的row 中的start_int 和end_int。我用了一个subquery:
select * from AAA where id=12345. 这一步从AAA中大概挑出2000行左右,但BBB很大
,有3千多万行
我的query是:
select start_int, end_int from BBB
where
exists (select * from
(select * from AAA where id=12345)temp
where temp.start_int <= BBB.start_int and temp.end_int>=BBB.end_int);
比方说:
subquery 中一行为:
start_int end_int
1 10
那么BBB中的以下列都要选出:
start_int end_int
1 2
3 4
5 6
7 8
9 10
我的query run 了几个小时没有结果。我知道一定要很长时间,但没想到会长成这个样
子,最后我自己停了 :-(
高手帮帮我,如何写才会快一些?为什么?谢谢
l******y
发帖数: 60
2
现在要从BBB中 挑出所有AAA表中ID=12345的row 中的start_int 和end_int。
——大概说得不清楚,应该是:从AAA表中挑出所有ID为12345的start_int 和end_int,
然后再从BBB表中挑出所有范围在上一步中已挑出的start_int 和end_int内的start_
int 和end_int
c*****d
发帖数: 6045
3
首先,用join就能实现
select b.start_int, b.end_int
from AAA a, BBB b
where a.start_int <= b.start_int
and a.end_int>=b.end_int
and a.id=12345;
其次,你说“select * from AAA where id=12345. 从AAA中大概挑出2000行左右”
id难道不是PK,返回一条结果?
再次,BBB表有3千多万行,有没有索引?在哪个字段上?
l******y
发帖数: 60
4
多谢coolbid大拿。我怎么糊涂到不用join呢?难怪被DBA鄙视。我原来用的数据库也就
几万条,最多10万条,这次很震撼。
AAA中的id不是PK(它是另一个表的PK,这个表的FK),返回近2000条记录。BBB的索引
建在另一个我不涉及的字段上。
join 的效率是不是要比subquery和exists高?如何判断?多谢指点!
c*****d
发帖数: 6045
5
BBB的start_int和end_int字段都没有索引?
你这不是相当于做2000*30,000,000 = 60,000,000,000?
我的建议:
1. BBB start_int和end_int字段分别创建索引
2. 创建一个函数,作用是简化这个sql语句的结果集
select start_int,end_int from AAA where id=12345
例如结果是
1, 10
2, 8
4, 12
20,22
这个函数的结果就是
1,12
20,22
这个函数的好处就是减少了AAA返回的记录条数,因此减少了总循环的次数

【在 l******y 的大作中提到】
: 多谢coolbid大拿。我怎么糊涂到不用join呢?难怪被DBA鄙视。我原来用的数据库也就
: 几万条,最多10万条,这次很震撼。
: AAA中的id不是PK(它是另一个表的PK,这个表的FK),返回近2000条记录。BBB的索引
: 建在另一个我不涉及的字段上。
: join 的效率是不是要比subquery和exists高?如何判断?多谢指点!

l******y
发帖数: 60
6
谢谢coolbid, 第二步创建函数的建议非常好。
我从BBB中挑出来的记录预计在千分之一(3万条)以内,如果分别给BBB start_int和
end_int字段创建索引,效率会提高多少呢(如何计算)?多谢!
B*****g
发帖数: 34098
7
大牛给说说,如果2个表能保证能够保证end_int大于等于start_int,下面这个sql能改
善吗?
SELECT b.start_int, b.end_int
FROM aaa a, bbb b
WHERE b.start_int BETWEEN a.start_int AND a.end_int
AND b.end_int BETWEEN a.start_int AND a.end_int
AND a.id = 12345

【在 c*****d 的大作中提到】
: BBB的start_int和end_int字段都没有索引?
: 你这不是相当于做2000*30,000,000 = 60,000,000,000?
: 我的建议:
: 1. BBB start_int和end_int字段分别创建索引
: 2. 创建一个函数,作用是简化这个sql语句的结果集
: select start_int,end_int from AAA where id=12345
: 例如结果是
: 1, 10
: 2, 8
: 4, 12

c*****d
发帖数: 6045
8
如果能保证能够保证end_int大于等于start_int
我觉得从逻辑的角度,下面这个更简单
至于性能能否改善,我觉的差不多,要看执行计划了
SELECT b.start_int, b.end_int
FROM aaa a, bbb b
WHERE b.start_int > a.start_int
AND b.end_int < a.end_int
AND a.id = 12345

【在 B*****g 的大作中提到】
: 大牛给说说,如果2个表能保证能够保证end_int大于等于start_int,下面这个sql能改
: 善吗?
: SELECT b.start_int, b.end_int
: FROM aaa a, bbb b
: WHERE b.start_int BETWEEN a.start_int AND a.end_int
: AND b.end_int BETWEEN a.start_int AND a.end_int
: AND a.id = 12345

B*****g
发帖数: 34098
9
你觉得有可能b的2个index都用到吗?

【在 c*****d 的大作中提到】
: 如果能保证能够保证end_int大于等于start_int
: 我觉得从逻辑的角度,下面这个更简单
: 至于性能能否改善,我觉的差不多,要看执行计划了
: SELECT b.start_int, b.end_int
: FROM aaa a, bbb b
: WHERE b.start_int > a.start_int
: AND b.end_int < a.end_int
: AND a.id = 12345

1 (共1页)
进入Database版参与讨论
相关主题
请教一个SQL query该怎么写SQL Query Question
包子请教querycorrelated subquery
NOT= , NOT IN 有啥区别[转载] 求教数据库的query optimization 工作的面试
怎么reference temp table的columnA sql question
吐血了aks a simple SQL question
请教一个sql query比较sqlplus和sql developer
咋样选一个表中在另一个表中不含有的记录Oracle DBA position at Austin TX
关于学习数据库我也说几句急! 急!向sybase表中插入数据不好用?
相关话题的讨论汇总
话题: int话题: bbb话题: aaa话题: start话题: end