读书人

sql 语句执行效率,该如何解决

发布时间: 2012-03-20 14:01:10 作者: rapoo

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

读书人网 >SQL Server

热点推荐