求讨论:一个查询速度为0.3秒的sql语句让linux直接cpu下降20%

[复制链接]
查看11 | 回复9 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
sql语句如下:
SELECT*
FROM POSTINFO WHERE (IS_TOP_FIRST=1
OR ((CATALOG_ID=84 OR CATALOG_ID=94)
AND BAR_ID NOT IN(470,482,9023,9024,9025,9027,928,422)))
AND ISDELETED = 0ORDER BY IS_TOP_FIRST DESC,REPLY_TIME_MS DESC
这个语句之前我在论坛讨论过,现在的执行计划是:
description
object object name
cost card
bytes
SELECT STATEMENT,GOAL=FIRST_ROWS
231690 311949 38369727
TABLE ACCESS BY INDEX ROWID
POST POST_INFO 231690 311949 38369727
INDEX FULL SCAN
POST INC_TOP_RTIME759 613876

只要session里面有4个用户访问,用到这个语句,而且迅速没有用户使用这个语句。linux中的sar -f的idle cpu直接从90下降到70.而且在em中的top sql他占有了76%。
SQL> /
SIDSERIAL# OSUSER
---------- ---------- ------------------------------
153945907
158119559
161759657
求高手帮忙讨论下这个问题。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
explain plan for SELECT*
FROM POSTINFO WHERE (IS_TOP_FIRST=1
OR ((CATALOG_ID=84 OR CATALOG_ID=94)
AND BAR_ID NOT IN(470,482,9023,9024,9025,9027,928,422)))
AND ISDELETED = 0ORDER BY IS_TOP_FIRST DESC,REPLY_TIME_MS DESC
select * from table(dbms_xplan.display);

INC_TOP_RTIME是哪个字段上的索引,索引字段的数据类型是什么
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
原帖由 棉花糖ONE 于 2008-7-11 15:28 发表
explain plan for SELECT*
FROM POSTINFO WHERE (IS_TOP_FIRST=1
OR ((CATALOG_ID=84 OR CATALOG_ID=94)
AND BAR_ID NOT IN(470,482,9023,9024,9025,9027,928,422)))
AND ISDELETED = 0ORDER BY IS_TOP_FIRST DESC,REPLY_TIME_MS DESC
select * from table(dbms_xplan.display);

INC_TOP_RTIME是哪个字段上的索引,索引字段的数据类型是什么

INC_PI_TOP_RTIME(IS_TOP_FIRST DESC, REPLY_TIME_MS DESC)---之前发现就是orderby慢,所以使用两个order by的字段创建的组合索引;
数据类型分别为:number(1)和number(12);
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Error: cannot fetch last explain plan from PLAN_TABLE
[ 本帖最后由 lotus1024 于 2008-7-11 15:40 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
索引中再 加个 字段CATALOG_ID看看
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
这样的加order by的索引能快吗,你不扫描整个表,但是扫描完整个索引再回头去访问表
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
select count(distinct catalog_id),count(*) from POSTINFO;看看分别多少行
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
IS_TOP_FIRST=1的数据是不是很多 很多?
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
原帖由 花好月不圆 于 2008-7-11 16:11 发表
IS_TOP_FIRST=1的数据是不是很多 很多?


60万条数据的表:
SQL> select count(*) from postinfo where IS_TOP_FIRST=1;

COUNT(*)
----------
13
但是IS_TOP_FIRST=1后面是一个or.....是个and就好办了。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
原帖由 棉花糖ONE 于 2008-7-11 16:11 发表
select count(distinct catalog_id),count(*) from POSTINFO;看看分别多少行

SQL> select count(distinct catalog_id),count(*) from POSTINFO;

COUNT(DISTINCTCATALOG_ID) COUNT(*)
------------------------- ----------

8 625035
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
整个查询返回了是不是30多w
SELECT/*+full(POSTINFP) */*
FROM POSTINFO WHERE (IS_TOP_FIRST=1
OR ((CATALOG_ID=84 OR CATALOG_ID=94)
AND BAR_ID NOT IN(470,482,9023,9024,9025,9027,928,422)))
AND ISDELETED = 0ORDER BY IS_TOP_FIRST DESC,REPLY_TIME_MS DESC
SELECT*
FROM POSTINFO WHERE (IS_TOP_FIRST=1
OR ((CATALOG_ID=84 OR CATALOG_ID=94)
AND BAR_ID NOT IN(470,482,9023,9024,9025,9027,928,422)))
AND ISDELETED = 0ORDER BY IS_TOP_FIRST DESC,REPLY_TIME_MS DESC
对比下这2句的逻辑读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行