如何提高效率
现在有两张没有任何关系的表,appointment表 和 consult表;
两个表都有字段:id,title,time ,organiname (id,一个是varchar2类型,一个是number类型)
现在需要: (1)约会和征友在一个页面的表格内根据时间顺序显示。
(2)每条记录增加字段,用来区别是date记录还是consult记录。
(3) 因为页面显示的原因,要对查询分页。
例如: id, title, time, name type
1011 heheheh 2005/11/23 aa date
2011 fsdfs 2005/10/10 bb date
1023 fasfasf 2005/05/01 cc consult
SELECT * FROM (SELECT TO_CHAR(ID) AS ID,ORGANIGER AS ORG,TITLE,TIME,ORGANINAME AS NAME
,'DATE' AS TYPE FROM APPOINTMENT
UNION
ALL SELECT ID AS ID,ORGANIGER AS ORG, TITLE,PUBLISHTIME AS TIME,ORGANINAME AS NAME,'CONSULT' AS TYPE FROM CONSULT ORDER BY TIME DESC) WHERE ROWNUM <30
MINUS
SELECT * FROM (SELECT TO_CHAR(ID) AS ID,ORGANIGER AS
ORG,TITLE,TIME,ORGANINAME AS NAME ,'DATE' AS TYPE FROM APPOINTMENT
UNION ALL
SELECT ID AS ID,ORGANIGER AS ORG, TITLE,PUBLISHTIME AS TIME,ORGANINAME AS NAME,'CONSULT' AS TYPE FROM CONSULT ORDER BY TIME DESC) where rownum < 20
现在是我写的查询语句,但我一直担心效率问题,请各位帮忙看下,怎么提高,或者哪里写的不恰当,同时时间的排序是混乱的。
问题点数:100、回复次数:7Top
1 楼shazi_pig(傻子)回复于 2005-12-09 14:27:13 得分 0
有没有在?大家帮我看看??
Top
2 楼waterfirer(水清)回复于 2005-12-09 15:13:21 得分 60
不用minus
换成
select * from (SELECT a.*,rownum t FROM (SELECT TO_CHAR(ID) AS ID,ORGANIGER AS ORG,TITLE,TIME,ORGANINAME AS NAME,'DATE' AS TYPE FROM APPOINTMENT UNION ALL SELECT ID AS ID,ORGANIGER AS ORG, TITLE,PUBLISHTIME AS TIME,ORGANINAME AS NAME,'CONSULT' AS TYPE FROM CONSULT ORDER BY TIME DESC) a WHERE ROWNUM <30) where t>=20Top
3 楼ronny5(兔子林)回复于 2005-12-09 15:15:32 得分 40
我感觉你这么做还不如两个表都拿出前20条,然后union一下再取前20条Top
4 楼shazi_pig(傻子)回复于 2005-12-09 16:03:29 得分 0
waterfirer(水清):为什么不可以用minus,以及用rownum的between and 这些效率那个高些?Top
5 楼shazi_pig(傻子)回复于 2005-12-09 16:13:30 得分 0
SELECT * FROM (SELECT ID,ORG,TITLE,TIME,ROWNUM AS T ,NAME FROM (SELECT TO_CHAR(ID) AS ID,ORGANIGER AS ORG,TITLE,TIME,ORGANINAME AS NAME
,'DATE' AS TYPE FROM APPOINTMENT
UNION ALL SELECT ID AS ID,ORGANIGER AS ORG, TITLE,PUBLISHTIME AS TIME,ORGANINAME AS NAME,'CONSULT' AS TYPE FROM CONSULT ORDER BY TIME DESC) WHERE ROWNUM <30 )WHERE T>20;
这个我测试了,用的时间是0.015,我上面的方法用的时间是0.062,却是提高了很多。大家还有没有更好的方法。Top
6 楼shazi_pig(傻子)回复于 2005-12-09 16:22:13 得分 0
兔子林的方法好是好,关键时间很容易错误,约会和征友两个表的时间相差很大,按照你的方法时间是0.009,但结果不正确。呵呵。Top
7 楼waterfirer(水清)回复于 2005-12-09 17:20:23 得分 0
单个表取中间记录的方法是用rowid和rownum,如下。在这里并不适用。
Select * from tab where rowid in (SELECT r FROM (SELECT m.rowid r, rownum t FROM (SELECT a.rowid FROM tab a order by col1 desc) m WHERE rownum < 30) WHERE t >= 10) order by col1 desc;Top




