发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

oracle 如何提高查询速度



oracle 如何提高查询速度

在一个项目中用户登录要每次查询未读的信息,我写的未读信息存储过程如下:
CREATE OR REPLACE PACKAGE returnPackage AS 
    TYPE returnCursor IS REF CURSOR; 
END returnPackage; 
/ 
--------------------------------------------------------------------------------------------------- 
CREATE OR REPLACE PROCEDURE listUnread( 
    param_lgname    IN  VARCHAR2, 
    param_r         IN  VARCHAR2, 
    resultCursor    OUT returnPackage.returnCursor 
) AS 
    op_type_receive CHAR(1); 
    lgname          VARCHAR2(30); 
BEGIN 
    op_type_receive := TRIM(param_r); 
    lgname := TRIM(param_lgname); 

    OPEN resultCursor FOR 
        SELECT DISTINCT 
            mb.dbid, 
            mb.parentDbid, 
            TRIM(mb.sender) AS sender, 
            TRIM(mb.receipt) AS receipt, 
            mb.type, 
            mb.mailDate, 
            mb.subject, 
            mb.attachNums 
        FROM 
            mailbox mb 
        LEFT OUTER JOIN 
            groups gp 
        ON 
            TRIM(gp.memberLoginName) = lgname 
        LEFT OUTER JOIN 
            ts_op_stream op 
        ON 
            mb.dbid = op.dbid AND op.op_status = op_type_receive 
        WHERE 
            op.op_status IS NULL 
        AND ( 
                TRIM(mb.receipt) = lgname 
            OR 
                TRIM(mb.receipt) = TRIM(gp.groupLoginName) 
            OR 
                INSTR(','  ¦ ¦ TRIM(mb.receipt)  ¦ ¦ ',', ','  ¦ ¦ lgname  ¦ ¦ ',') > 0 
            OR 
                INSTR(','  ¦ ¦ TRIM(mb.receipt)  ¦ ¦ ',', ','  ¦ ¦ TRIM(gp.groupLoginName)  ¦ ¦ ',') > 0 
        ) 
        ORDER BY mailDate DESC; 
END listUnread; 
/ 
在很多用户登录的时候发现会很慢,我目前想创建索引来提高速度,如下:
create index mailbox_date on mailbox(mailDate desc);
另外大家有没有好的方法来提高查询速度,多多指出,谢谢!


A:
未读的信息只有1个可能,那就是
1 收件人是自己
2 阅读状态是false

索引2个,
1是收件人,
2是阅读状态

这个查询一个select 足以,
你的存储过程我就不仔细看了,如果不能满足需求,那就完善你的数据结构吧!

分组消息要发到个人的收件箱,不要有什么组消息。用空间来换取速度是值得的。毕竟硬盘都T级别了!

Q:
这个组消息是必须的,不能修改,赵老师说的两个判断条件我已经在存储过程中表明,至于索引的问题,我这样的写法不知可否:
1. create index mail_receipt on mailbox (receipt);
2.create index mail_status on ts_op_streams(op_status);
因为消息需要有时间的条件我觉得是不是应该对mailbox再加一个关于时间的索引:create index mailbox_date on mailbox(mailDate desc);
希望指正.谢谢!

A:
时间的索引应该没必要了
老竹子已经说得很明确了
不过是不是可以把收件人的索引改成收件人ID 的索引呢
收件人ID 和 收件状态 这两个索引

A:
你join的条件,where子句的qualification没有用到date相关的条件,所以,不需要对date建索引
建议:
1。先把receipt trim好存到数据库里,然后用对它建索引
2。对status建索引

A:
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
(1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
  
(3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
  
(4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
  
(5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

A:
做SQL语句的优化要知道执行SQL条件的顺序,
SQL语句的执行条件部分是从后向前的,所以最后一个条件要安排好,还有就是尽量避免使用or、like、in之类的关键字。
总之是一门很广的学问,还是听听专家的解答吧...
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP

Re:oracle 如何提高查询速度

学习中。。。。。。
编辑 回复 快速回复 TOP

Re:oracle 如何提高查询速度

编辑 回复 快速回复 TOP

Re:oracle 如何提高查询速度

(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
以前是过于关注建立索引和在sql语句中进行优化了,想不到还可以这样,呵呵
编辑 回复 快速回复 TOP

Re:oracle 如何提高查询速度

再弱弱的问一句,执行一条sql需要多久算是效率低?
因为我在一个项目中嵌套了两个connect by prior ... start with...
谢谢
编辑 回复 快速回复 TOP
发新话题