使用变量对 SQL 进行优化
共 1787字,需浏览 4分钟
·
2021-05-10 14:05
点击关注上方“SQL数据库开发”,
设为“置顶或星标”,第一时间送达干货
SQL专栏
新手小伙伴平时可能比较少用到变量,其实变量在数据查询过程中经常使用到,而且可以有效提高查询速度。
变量其实就是我们定义的一个可变参数,其基本语法如下:
--定义一个名称为@I的变量,指定其类型为整数
DECLARE @I VARCHAR(20)
--对变量@I赋值为
SET @I='SQL数据库开发'
--输出@I的值
SELECT @I
结果:SQL数据库开发
其中DECLARE @部分是固定写法,@I是变量名称,变量必须定义类型,一般会定义为字符型,整数型,时间类型等。
赋值部分SET也是固定写法,就是对变量@I进行赋值,=右边的就是赋值内容了
定义好变量后就可以将其带入到查询语句中了,每次只需要修改赋值部分,查询语句就会根据赋值内容查询出相应的结果
SELECT * FROM T1 WHERE ORDER_ID='112'; SELECT * FROM T1 WHERE ORDER_ID='113';
DECLARE @ORDER_ID VARCHAR(20) SET @ORDER_ID='112' SELECT * FROM T1 WHERE ORDER_ID=@ORDER_ID;
常见的在线查询一遍都可以使用到变量,将变量作为参数传递给数据库,可以实现一次查询,重复使用执行计划。
如果单独查询某个语句时间很久,比如超过半个小时了,这种使用变量没有什么明显的效果。
事物都存在两面性,变量对常见查询可以提高查询效率。但是也有例外,比如在WHERE条件中的字段是“倾斜字段”的时候。
“倾斜字段”指该列中的绝大多数的值都是相同的,比如人口调查表,其中“民族”这列,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;
由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“变量窥测”,建议对于“倾斜字段”不要采用绑定变量。
今天的内容讲到这里,如果对变量还有什么不明白的,可以在底下留言,我会一一回复的。
推荐阅读
50 款数据可视化分析工具大集合,总有一款适合你 悟空无姓无名的时候,阎王生死簿是怎么写的呢? 5号发工资和25号发工资,还能看出公司是否靠谱?🤫 如果把14亿中国人都拉到一个微信群。。。 假如面试中大家都说实话....
后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群