1。什么是变量?变量其实就是我们定义的可变参数。其基本语法如下:--定义一个名为@I的变量,并指定其类型为整数DECLARE@IVARCHAR(20)--将变量@I赋值给SET@I='SQL数据库开发'--输出@I的值SELECT@I结果:SQL数据库开发其中DECLARE@部分是固定的写法,@I是变量名,变量的类型必须定义,一般定义为字符型、整型、时间型,etc赋值部分SET也是固定的写法,就是给变量@I赋值,=右边的就是赋值内容。定义好变量后,就可以将其带入查询语句中。每次只需要修改赋值部分,查询语句就会根据赋值内容查询出相应的结果2.为什么要使用变量使用变量后,如果同一条查询语句只是赋值不同,可以复用首先执行计划达到一次性分析多次复用的效果,减少对执行计划的分析会相应提高查询速度。让我们看下面的例子:SELECT*FROMT1WHEREORDER_ID='112';SELECT*FROMT1WHEREORDER_ID='113';如果这两条查询语句分开执行,查询优化器会认为它们是不同的SQL语句,需要进行两次解析。我们用变量修改一下DECLARE@ORDER_IDVARCHAR(20)SET@ORDER_ID='112'SELECT*FROMT1WHEREORDER_ID=@ORDER_ID;执行后,只需要将@ORDER_ID的值修改为'113',就可以重用上面的执行计划了。由于上面的语句比较简单,效果可能看不出来,但是如果遇到比较复杂的查询语句,变量查询往往能起到很好的效果。3.什么时候应该/不应该使用变量常见的在线查询可以使用一次变量,将变量作为参数传递给数据库可以实现一次查询并重用执行计划。如果单独查询某条语句需要很长时间,比如半小时以上,这种使用变量的效果不明显。4变量窥物有两个方面,对于普通查询,变量可以提高查询效率。但也有例外,比如WHERE条件中的字段是“倾斜字段”时。“倾斜字段”是指该列中的大部分值都是相同的,比如人口普查表,其中“民族”这一列90%以上都是汉族。所以如果一条SQL语句要查询30岁的汉族人口,那么WHERE条件中必须要有“种族”这一列。这时候如果使用绑定变量@NATION,就会出现很大的问题。如果@NATION传入的第一个值为“Han”,那么整个执行计划必然会选择表扫描。DECLARE@NATIONVARCHAR(50)SET@NATION='汉'SELECT*FROMPeopleWHEREAGE=30ANDNATION=@NATION;在“她人”中传递第二个值时,一般情况下,“她人”在表中的比例可能只有万分之三,应该使用索引查找。DECLARE@NATIONVARCHAR(50)SET@NATION='She'SELECT*FROMPeopleWHEREAGE=30ANDNATION=@NATION;由于复用了第一次解析的“汉族”的执行计划,所以第二次也会使用表扫描的方式。这个问题就是著名的“variablesnooping”,建议不要对“slantedfields”使用绑定变量。
