文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用变量对 SQL 进行优化

2024-12-03 05:21

关注

变量其实就是我们定义的一个可变参数,其基本语法如下:

--定义一个名称为@I的变量,指定其类型为整数

DECLARE @I VARCHAR(20)

--对变量@I赋值为

SET @I='SQL数据库开发'

--输出@I的值

SELECT @I

结果:SQL数据库开发

2.为什么要使用变量

使用变量后,相同的查询语句如果只是赋值不同,可以重复使用第一次的执行计划,做到一次解析,多次复用的效果,减少执行计划的解析就会相应提高查询速度了。我们看如下示例:

 

  1. SELECT * FROM T1 WHERE ORDER_ID='112'
  2. SELECT * FROM T1 WHERE ORDER_ID='113'

如果单独执行这两条查询语句,查询优化器认为是不同的SQL语句,需要解析两次。我们使用变量对其进行修改

 

  1. DECLARE @ORDER_ID VARCHAR(20) 
  2. SET @ORDER_ID='112' 
  3. SELECT * FROM T1 WHERE ORDER_ID=@ORDER_ID; 

执行完之后,只需要修改@ORDER_ID的值为'113’,就可以重复使用上面的执行计划了。由于上面的语句比较简单,可能看不出效果,但是如果遇到比较复杂的查询语句,变量查询往往能起到很好的效果。

3.什么时候该/不该使用变量

4变量窥测

事物都存在两面性,变量对常见查询可以提高查询效率。但是也有例外,比如在WHERE条件中的字段是“倾斜字段”的时候。

“倾斜字段”指该列中的绝大多数的值都是相同的,比如人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在WHERE条件中。这个时候如果采用绑定变量@NATION会存在很大问题。

如果@NATION传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。

 

  1. DECLARE @NATION VARCHAR(50) 
  2.  
  3. SET @NATION='汉族' 
  4.  
  5. SELECT * FROM People WHERE AGE=30 AND NATION=@NATION; 

 

当第二个值传入的是“畲族”,正常情况下“畲族”在表中占的比例可能只有万分之一,应该采用索引查找。

 

  1. DECLARE @NATION VARCHAR(50) 
  2.  
  3. SET @NATION='畲族' 
  4.  
  5. SELECT * FROM People WHERE AGE=30 AND NATION=@NATION; 

 

由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“变量窥测”,建议对于“倾斜字段”不要采用绑定变量。

来源:SQL数据库开发内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯