首页 新闻 搜索 专区 学院

Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因

0
悬赏园豆:20 [待解决问题]
DECLARE @mid INT= 429;
DECLARE @mi_phone VARCHAR(50)= '18505959580';
--第一种
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY mi.mi_id DESC ) row ,
                    mi.mi_id ,
                    mi_name
          FROM      m_memberinfo mi
          WHERE     mi.mid = @mid
                    AND mi_phone = @mi_phone
        ) Tbl
WHERE   row BETWEEN 1 AND 15;
--第二种
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY mi.mi_id DESC ) row ,
                    mi.mi_id ,
                    mi_name
          FROM      m_memberinfo mi
          WHERE     mi.mid = @mid
                    AND mi_phone = '18505959580'
        ) Tbl
WHERE   row BETWEEN 1 AND 15;

第一种执行非常慢,第二种执行很快

摩根船长的主页 摩根船长 | 初学一级 | 园豆:182
提问于:2016-03-27 17:45
< >
分享
所有回答(3)
0

在我们所使用的SqlServer工具是微软推出的,当您使用带有传参类型的函数语句时就类似于面向对象的编程方式。直接放入参数执行语句就相当于将原来的字符串拉长插入参数,相当于直接作用于您所执行的函数对象。而声明的时候是提前为数据分配了内存空间,多了一个为参数查找地址的过程。
如果对我的回答满意,请采纳,谢谢

薛兆敬 | 园豆:170 (初学一级) | 2016-03-27 19:58

这个明白,但是并不是引起这个查询慢的原因

支持(0) 反对(0) 摩根船长 | 园豆:182 (初学一级) | 2016-03-27 20:53
0

你看下库里面mi_phone是什么类型的是VARCHAR还是n的

死白的man | 园豆:2135 (老鸟四级) | 2016-03-27 20:36

都是VARCHAR类型没错

支持(0) 反对(0) 摩根船长 | 园豆:182 (初学一级) | 2016-03-27 20:48
1

在查询最后加下OPTION (RECOMPILE)。

Daniel Cai | 园豆:10374 (专家六级) | 2016-03-28 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册