关于sql性能问题,请各位大侠指教

来源:百度知道 编辑:UC知道 时间:2024/07/04 11:19:37
以下是我面试遇到的几个问题,很难自己解决,请各位大侠帮忙下
Sql 性能问题

T_plan表和t_plan_detail表为主从关系表,靠plan_id外键关联(存在索引)。
其中t_plan 100万行记录,t_plan_detail 1000万行记录,t_plan_detail.item_code上有索引。
简述下面sql语句有什么性能问题
(1)select count(*) from t_plan_detail t1 left join t_plan t2 on t1.plan_id = t2.plan_id where
t2.item_code = ‘P004’
上面提示说两处性能问题
(2)select count(1) from t_plan whre plan_id in(
Select plan_id from t_plan_detail where item_code =’p004’
) and plan status in(4,60)

(3)
Select plan_code , plan_status , create_date –create_date是t_plan_detail 的字段
From (select a.create_userid ,a.plan_code ,a..plan_status ,b*
From t_plan a ,t_plan_detail b
Where a.plan_id = b.plan_id
And b.item_code =’p004’
Order by b.create_date , a.plan_code
) X
Where x.create_userid = 1 order by x..plan_code desc

上面提示有三个性能问题

(4)
在某个数据表中有1000条记录,假设某状态字段有10个不同的值,且记录中状态的分布值会均等,那么按照该状态创建的索引的选择率是

1)select count(*) from t_plan_detail t1 left join t_plan t2 on t1.plan_id = t2.plan_id where t2.item_code = ‘P004’

一:count(*)改为count(1),1000万条记录的业务表,count(*)与count(1)会有较为明显的性能差别;
二:明显t_plan_detail是t_plan的子表,那么用明显表去左连接主表,是毫无意义的,直接关联即可;(楼主上面说item_code是明显表的,这个SQL是不是写错了?)

(2)select count(1) from t_plan whre plan_id in(
Select plan_id from t_plan_detail where item_code =’p004’
) and plan status in(4,60)
上面万的记录集,用in会极其损耗性能,改为
select count(1) from t_plan a whre plan_id exists(
select 1 from t_plan_detail b where b.item_code='p004' and a.plan_id=b.plan_id) and plan status in(4,60)
(如果楼主上面说的表和记录数是真实的,分别执行会有显著效果)

(3)
Select plan_code , plan_status , create_date –create_date是t_plan_detail 的字段
From (select a.create_userid ,a.plan_code ,a..plan_status ,b*
From t_plan a ,t_plan_detail b
Where a.plan_id = b.plan_id
And b.item_code =’p004’
Order by b.create_date , a.plan_code