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快,猜的。。。。。。。