困扰很久的一个问题,同一SQL语句不同环境就会出问题(换环境就要加上select * from (...))

simonezhlx 2009-08-19 05:44:42
SELECT BB.* FROM (SELECT MM.* FROM (select distinct A.DOCID,A.DOCNAME as 文档名称,D.USERCNAME as 上传人,substr(A.UPLOADDATE,1,4)||'年'||substr(A.UPLOADDATE,5,2)||'月'||substr(A.UPLOADDATE,7,2)||'日' as 上传日期, A.PROJECTID,A.ACTIONID,A.DOCTYPE  from (SELECT BBB. * FROM TABLEAD BBB  WHERE BBB.MODEDOCID IS NULL OR BBB.MODEDOCID ='')  A,TABLE06 C,TABLEREG005 D WHERE   C.NORMATIVEVAL=A.DOCTYPE AND D.USERID=A.UPLOADMANID AND A.ISAUDITING!=2 AND A.DOCID NOT IN (SELECT DOCID FROM TABLEAD_1) ) MM LEFT JOIN  TABLEAD07 F ON MM.ACTIONID=F.ACTIONID ) BB LEFT JOIN TABLEAD01 E  ON BB.PROJECTID=E.PROCASEID


例如,如上的一条SQL语句,在有的服务器上运行正常,在有的服务器(操作系统与数据库系统的版本都是一模一样的)上就是一执行就长时间无响应,但是在最外层在加一层select * from 再执行就可以正常执行了,为什么呢?
先谢了!
...全文
165 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonezhlx 2009-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wildwave 的回复:]
引用 4 楼 simonezhlx 的回复:
引用 3 楼 majy 的回复:
没有收集statistic信息:

dbms_stats.gather_table_stats(........);

不太明白你说的意思?能否详细解释?


SQL codebegin
dbms_stats.gather_table_stats
( ownname=>'user',--''里填用户名 tabname=>'tablename'--,填表名--method_opt => 'for all indexed columns',--cascade => TRUE );end;SELECT endpoint_number, endpoint_value,ENDPOINT_ACTUAL_VALUEFROM(SELECT endpoint_number, endpoint_value,ENDPOINT_ACTUAL_VALUEFROM USER_HISTOGRAMSWHERE table_name='tablename'and column_name='OWNER'--tablename和owner自己替换ORDERBY endpoint_number)WHERE rownum<=20;select num_rows,blocks,empty_blocks,avg_space,chain_cnt,
avg_row_len,avg_space_freelist_blocks,num_freelist_blocks,
sample_size,last_analyzedfrom user_tableswhere table_name=upper('tablename')
[/Quote]
分析表?
我只是想知道,为什么同样的SQL语句,为什么有的可以运行有的需要再加一层?而且我的查询中是多个表。。。
小灰狼W 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 simonezhlx 的回复:]
引用 3 楼 majy 的回复:
没有收集statistic信息:

dbms_stats.gather_table_stats(........);

不太明白你说的意思?能否详细解释?
[/Quote]

begin
dbms_stats.gather_table_stats
( ownname => 'user', --''里填用户名
tabname => 'tablename' --,填表名
--method_opt => 'for all indexed columns',
--cascade => TRUE
);
end;



SELECT endpoint_number, endpoint_value,ENDPOINT_ACTUAL_VALUE
FROM(
SELECT endpoint_number, endpoint_value,ENDPOINT_ACTUAL_VALUE
FROM USER_HISTOGRAMS
WHERE table_name = 'tablename' and column_name = 'OWNER' --tablename和owner自己替换
ORDER BY endpoint_number)
WHERE rownum <=20;

select num_rows,blocks,empty_blocks,avg_space,chain_cnt,
avg_row_len,avg_space_freelist_blocks,num_freelist_blocks,
sample_size,last_analyzed from user_tables where table_name=upper('tablename')
simonezhlx 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 majy 的回复:]
没有收集statistic信息:

dbms_stats.gather_table_stats(........);
[/Quote]
不太明白你说的意思?能否详细解释?
majy 2009-08-19
  • 打赏
  • 举报
回复
没有收集statistic信息:

dbms_stats.gather_table_stats(........);
小灰狼W 2009-08-19
  • 打赏
  • 举报
回复
这个语句太混乱了
需要优化一下
select distinct A.DOCID,A.DOCNAME as 文档名称,D.USERCNAME as 上传人,
substr(A.UPLOADDATE,1,4)||'年'||substr(A.UPLOADDATE,5,2)||'月'||substr(A.UPLOADDATE,7,2)||'日' as 上传日期,
A.PROJECTID,A.ACTIONID,A.DOCTYPE,c.*,d.*,f.*,e.* from (
SELECT BBB. * FROM TABLEAD BBB WHERE
(BBB.MODEDOCID IS NULL OR BBB.MODEDOCID ='')
AND bbb.ISAUDITING!=2
and not exists (select 1 from TABLEAD_1 where docid=bbb.docid)) A,
TABLE06 C,TABLEREG005 D
WHERE C.NORMATIVEVAL=A.DOCTYPE AND
D.USERID=A.UPLOADMANID
LEFT JOIN TABLEAD07 F
ON a.ACTIONID=F.ACTIONID LEFT JOIN TABLEAD01 E
ON A.PROJECTID=E.PROCASEID
bzcnc 2009-08-19
  • 打赏
  • 举报
回复
帮楼主顶一下,学习

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧