数据库查询优化
逻辑层查询优化策略
1.尽可能的早做选择和投影(基本思路):可以使中间结果变小,节省几个数量级的执行时间
2.把选择和投影串接起来:一元运算序列可一起执行,只需对整个关系进行一趟扫描
3.把投影与其前或后的二元运算结合:在第一次用关系时去掉一些无关属性,可以避免多次扫描整个关系
4.把某些选择与其前的笛卡尔积合并成一个连接:当RxS前有选择运算且其中条件是R,S属性间比较运算的时。可以将其转换为连接运算节省时间
5.执行连接运算前对关系做适当的预处理:排序,索引
6.找出表达式里的公共子表达式:若公共的子表达式结果不大,则预先计算,以后直接读入结果,尤当视图情况下使用
- 关系代数的基本操作
并(Union)交(Intersect)差(Except) 选择 投影
待优化查询示例背景
图书馆关系数据库
books(title,author,pname,lc_no);
publishers(pname,padder,pciy)
borrowers(name,addr,city,card_no)
loans(card_no,lc_no,date)
pname为出版社名,lc_no图书馆编目号
padder为出版社地址,pcity为出版社所在地
name为读者名,addr为读者所在地址,city为读者所在城市,card_no为图书证号,date为借出日期
创建视图
CREATE VIEW xloans(
select title,author,pname,lc_no,name,addr,city,card_no,date
from books bs,borrowers b,loans l
where bs.lc_no=l.lc_no and b.card_no=l.card_no
);
关系代数
xloans=⊓s (σ F (loans x booksb x orrowers))
s=title,author,pname,lc_no,name,addr,city,card_no,date
F=(bs.lc_no=l.lc_no)∧ b.card_no=l.card_no
基本关系代数的等价变换公式
select title from xloans where date<=1/1/79;
⊓ title (σ date<=’1/1/79’ (xloans))
物理查询优化策略
DBMS衡量物理查询计划的优劣,I/O 访问次数,cpu占用时间,网络通信量等。
- oracle收集统计信息放入表中
anlalyze {index|table|cluster} {indexname|tablename|clustername}
compute statistics {for table|for all[indexed] |columns[size n]}
- 进行代价估算