在一个项目中用户登录要每次查询未读的信息,我写的未读信息存储过程如下:
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之类的关键字。
总之是一门很广的学问,还是听听专家的解答吧...