您现在的位置是:亿华云 > 系统运维
使用变量对 SQL 进行优化
亿华云2025-10-08 20:53:23【系统运维】8人已围观
简介1.什么是变量变量其实就是我们定义的一个可变参数,其基本语法如下:--定义一个名称为@I的变量,指定其类型为整数DECLARE @I VARCHAR(20)--对变量@I赋值为SET @I=SQL数据
1.什么是使用变量
变量其实就是我们定义的一个可变参数,其基本语法如下:
--定义一个名称为@I的变量变量,指定其类型为整数
DECLARE @I VARCHAR(20)
--对变量@I赋值为
SET @I=SQL数据库开发
--输出@I的进行值
SELECT @I
结果:SQL数据库开发
其中DECLARE @部分是固定写法,@I是优化变量名称,变量必须定义类型,使用一般会定义为字符型,变量整数型,进行时间类型等。优化 赋值部分SET也是使用固定写法,就是变量对变量@I进行赋值,=右边的进行就是赋值内容了 定义好变量后就可以将其带入到查询语句中了,每次只需要修改赋值部分,优化查询语句就会根据赋值内容查询出相应的使用结果2.为什么要使用变量
使用变量后,相同的变量查询语句如果只是赋值不同,可以重复使用第一次的进行执行计划,做到一次解析,多次复用的效果,减少执行计划的站群服务器解析就会相应提高查询速度了。我们看如下示例:
SELECT * FROM T1 WHERE ORDER_ID=112; SELECT * FROM T1 WHERE ORDER_ID=113;如果单独执行这两条查询语句,查询优化器认为是不同的SQL语句,需要解析两次。我们使用变量对其进行修改
DECLARE @ORDER_ID VARCHAR(20) SET @ORDER_ID=112 SELECT * FROM T1 WHERE ORDER_ID=@ORDER_ID;执行完之后,只需要修改@ORDER_ID的值为113’,就可以重复使用上面的执行计划了。由于上面的语句比较简单,可能看不出效果,但是如果遇到比较复杂的查询语句,变量查询往往能起到很好的效果。
3.什么时候该/不该使用变量
常见的在线查询一遍都可以使用到变量,将变量作为参数传递给数据库,可以实现一次查询,重复使用执行计划。 如果单独查询某个语句时间很久,比如超过半个小时了,这种使用变量没有什么明显的效果。4变量窥测
事物都存在两面性,变量对常见查询可以提高查询效率。但是也有例外,比如在WHERE条件中的b2b供应网字段是“倾斜字段”的时候。
“倾斜字段”指该列中的绝大多数的值都是相同的,比如人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在WHERE条件中。这个时候如果采用绑定变量@NATION会存在很大问题。
如果@NATION传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。
DECLARE @NATION VARCHAR(50) SET @NATION=汉族 SELECT * FROM People WHERE AGE=30 AND NATION=@NATION;当第二个值传入的是“畲族”,正常情况下“畲族”在表中占的比例可能只有万分之一,应该采用索引查找。
DECLARE @NATION VARCHAR(50) SET @NATION=畲族 SELECT * FROM People WHERE AGE=30 AND NATION=@NATION;由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“变量窥测”,b2b信息网建议对于“倾斜字段”不要采用绑定变量。
很赞哦!(192)
相关文章
- 新手可以注册cc域名吗?cc域名有什么特点?
- 巧用Dictionary实现日志数据批量插入
- VS Code Go 语言扩展将默认启用 gopls
- 用于基本社区管理任务自动化的 5 个 Python 脚本
- 2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
- React Core Team 成员开发的「火焰图组件」技术揭秘
- 推荐一个阅读代码、文档的利器:屏幕贴图工具
- 面试官给我个字符串问里面有多少个bigsai子序列给我难住了
- 并非一个好米任何人都会给你一个好的价格。那你该如何用以有的好米卖出最理想的价格呢?
- 设计模式 | 单例设计模式