使用变量对 SQL 进行优化

数据库 SQL Server
新手小伙伴平时可能比较少用到变量,其实变量在数据查询过程中经常使用到,而且可以有效提高查询速度。

 1.什么是变量

[[398270]]

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

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

DECLARE @I VARCHAR(20)

--对变量@I赋值为

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

--输出@I的值

SELECT @I

结果:SQL数据库开发

  • 其中DECLARE @部分是固定写法,@I是变量名称,变量必须定义类型,一般会定义为字符型,整数型,时间类型等。
  • 赋值部分SET也是固定写法,就是对变量@I进行赋值,=右边的就是赋值内容了
  • 定义好变量后就可以将其带入到查询语句中了,每次只需要修改赋值部分,查询语句就会根据赋值内容查询出相应的结果

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数据库开发
相关推荐

2023-07-13 11:24:14

SQL优化赋值

2010-07-08 17:40:27

2010-04-19 17:09:30

Oracle sql

2009-04-16 17:44:46

性能优化扩展高性能

2023-01-30 08:30:09

Tomcat性能优化

2010-07-14 09:17:17

SQL Server数

2010-07-22 17:25:23

2018-04-19 15:13:53

javascriptwebpackvue.js

2009-12-23 13:23:29

ADO.Net Sql

2010-07-15 15:15:48

SQL Server使

2018-07-05 22:38:23

大数据搜索引擎SEO

2010-05-17 17:09:29

Mysql LIMIT

2011-08-10 16:44:22

电脑老年人

2021-06-15 20:59:14

Kubernetes调试容器

2023-12-12 07:30:54

IstioWasm前端

2010-03-01 18:01:45

Python环境变量

2010-12-14 11:30:11

2011-07-04 14:28:18

SQL Server分区

2016-09-13 19:51:01

移动应用图片流量优化

2009-04-16 17:24:54

性能优化SQL Server 数据收集
点赞
收藏

51CTO技术栈公众号