日期:2014-05-18  浏览次数:20593 次

sql 语句执行效率
平时写SQL大家都有多种方式 看看下面两条SQL的执行效率谁更优,
先别去用工具看二者的查询开销(这也是废话 表结构我都没给出来),用自己的思维去分析下 给出答案和理由



-------------where条件筛选--------------
SELECT b.*, 
CASE WHEN icsrm.message_id IS NULL THEN  
CASE WHEN DATEDIFF(dd,icsrm.create_time,GETDATE())<1 THEN 1 ELSE 2 END
ELSE
CASE WHEN DATEDIFF(dd,icsrm.create_time,GETDATE())<1 THEN 4 ELSE 8 END
END [state]  
FROM Business b 
LEFT JOIN info_com_service_remind_msg icsrm ON b.BusinessID=icsrm.bussiness_id
AND icsrm.message_id IN (
SELECT MIN(message_id) FROM info_com_service_remind_msg icsrm GROUP BY icsrm.message_id
);

------------with临时表-----------------
WITH csrm as (
SELECT * FROM info_com_service_remind_msg 
WHERE message_id IN (
SELECT MIN(message_id) FROM info_com_service_remind_msg icsrm GROUP BY icsrm.bussiness_id
)

SELECT b.*, 
CASE WHEN csrm.message_id IS NULL THEN  
CASE WHEN DATEDIFF(dd,csrm.create_time,GETDATE())<1 THEN 1 ELSE 2 END
ELSE
CASE WHEN DATEDIFF(dd,csrm.create_time,GETDATE())<1 THEN 4 ELSE 8 END
END [state]  
FROM Business b 
LEFT JOIN csrm ON b.BusinessID=csrm.bussiness_id;

------解决方案--------------------
只不过是用with嵌套了一下,我觉得效率是差不多的。

SQL code
select * from test

;with maco as(select * from test) select * from maco

------解决方案--------------------
不太清楚with的执行过程,建立缓存表以后,还能走索引吗,如果不能,那么应该第一个快点吧,当然with的表的数量很小的情况下一样,多处使用该表,with快,猜的。。。。。。。