bsp;
SELECT * FROM employee WHERE emp_id !=102
SELECT * FROM employee WHERE emp_fname LIKE '%n'
§在 WHERE 子句中应包含组合索引的领头列
比较是否含搜索变量 :
以下包含:
§emp_id = 102
§emp_id IS NULL
§emp_id > 200
§employee.emp_id =department.dept_head_id
§emp_id IN (102, 103, 104)
§emp_fname LIKE 'rob%'
以下不包含:
§emp_id !=102
§emp_id IS NOT NULL
§emp_id = 102 or emp_fname = 'Jane'
§employee.emp_id = employee.manager_id
§emp_id NOT IN (102, 103, 104)
§emp_fname LIKE '%bert'
设法把不含搜索变量转换为含搜索变量
§有些情况可通过重写 WHERE 子句来实现转换
§例如:
emp_id NOT IN (102, 103, 104)
emp_id < 102 and > 104
自我调谐
§相等约束
列值分布统计
§把数据库统计删掉以强迫它重新编译(更新统计值)
当数据库使用方式改变时
当数据大量变动时
DROP OPTIMIZER STATISTICS
优化处理过程
§1.对查询作语法分析转换
§2. Adaptive Server Anywhere 打开优化处理游标
§3. 把子查询展平为连接,去掉不必要的DISTINCT, 重写搜索变量。
§4. 评估连接次序和 GROUP BY 策略
§5. 利用统计和缺省去考察访问次序
§6. 在执行之后,更新数据库统计。
展平子查询
§嵌套子查询往往不如连接更为有效
§实例:
嵌套子查询不够有效:
SELECT * FROM sales_order o WHERE o.cust_id IN (SELECT id FROM customer c WHERE c.state='NY’)
如下连接较有效:
SELECT sales_order.* FROM sales_order KEY JOIN customer WHERE customer.state='NY'
人工估算
§可人工提供估算值
§优化器会优先考虑采用它
§实例:
SELECT ship_date FROM sales_order_items WHERE (ship_date > '1998/10/30', 1)
满足条件的行数为1%
§轻易不要在存储过程及触发器中采用!
因为信息无法更新
缺省的可选择性
比较 百分比为:
cola=colb 0.035
col=constant
col IS NULL
cola LIKE colb
col !=constant
Other LIKE or 25
EXISTS 50
Other equalities 5
Other inequalities 25
Other IS NULL or BETWEEN 6