SQL开发中容易忽视的一些小地方( 三)

     目的:这篇文章我想说说我在工作中关于in和union all 的用法.

     索引定义 微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

     SARG的定义用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下: 列名 操作符 <常数 或 变量>或<常数 或 变量> 操作符列名列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。

     SARG的意义:如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。

      讨论问题:现在有些观点直接说in不符合SARG标准,故在查询中全产生全表扫描.

      我的观点:这个观点在早期的数据库中可能是这样,起码SQL2005足以证明上面的说法是错误的.

      案例:有一会员表(member),里面包含代理信息,其中代理号proxyID上创建有索引.数量量在百万以上。

      需求:查询指定代理的代理信息.
 
      查询SQL:
        方法1:   select 相关字段 from member where proxyID IN('ID1','ID2',.....)
        方法2:   select 相关字段 from member where proxyID='ID1'
                union all
                select 相关字段 from member where proxyID='ID1'
                union all
                ...
       如何比较:
               第一:proxyID的数量比较多,我测试时输入了30个proxyID
                    下面是两种方法的执行计划图:

                     1:union all的执行计划图:由于图比较长,所有分成两部分显示。

 

 

                       2:in的执行计划图:


                    结论:
                       1:无论哪种方法,都会用上索引.
                       2:两都的执行计划不同:当proxyID的数量比较多时,用in会直接查找索引,并有过滤的操作.union all则是连接了 n 个嵌套查询.  

                       3:代理号比较多时,union all的效率明显高于in

 

               第二:proxyID的数量比较小,现在分别输入两个,6个,15个,执行计划图可以看出,当proxyID的数量为15时,直接查找索引,而2个和6个时都选择嵌套查询来完成.因为union all的执行计划图总是一样的,所有贴于不同proxyID下,用in查询的执行计划图:

                    1:两个代理的执行计划图:

                       2:六个代理的执行计划图:

 

                        3:十五个代理的执行计划图:

 

                    结论:
                         1:无论哪种方法,都会用上索引.

                         2:proxyID的数据量比较小的时候在执行时间上和union all差距不大.

                         3:in里面的数据个数不同时,执行计划也会相应的同,数据量小时会采用嵌套查询,反之则直接查询索引以及其它相关辅助操作。


     结论:现在的数据库引擎一般都会通过查询成本分析来选择最优的查询算法来执行,不能把以前的观点拿到现在说.in与union all的差别并不是永远不变的,看什么情况而定.类似in的还有or,对于or,有观点也说不能应用索引,其实和in一样,高版本中的都会用上索引。

 

注:

    本文引用:MSDN,网络相关资料

   

                      

转载于:https://www.cnblogs.com/ASPNET2008/archive/2008/10/15/1311962.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题26 java语言的下面几种数组复制方法中,哪个效率最高?

java面试题26 java语言的下面几种数组复制方法中&#xff0c;哪个效率最高&#xff1f; A for 循环逐一复制 B System.arraycopy C Array.copyOf D 使用clone方法 效率&#xff1a;System.arraycopy > clone > Arrays.copyOf > for循环 1、System.arraycopy的用法…

pycharm使用笔记2-远程连接(转)

原文地址:https://blog.csdn.net/jinxiaonian11/article/details/70208920 随着科技的发展&#xff0c;远程办公已经是一种趋势&#xff0c;远程开发能力对于每一个程序员来说都是必不可少的。有时候就算在公司&#xff0c;在进行开发的时候有许多的数据都是储存在服务器上的&a…

第三章 使用属性升级MyBank

1、C#中的访问修饰符&#xff1a; a) public 【公共的】访问不受到任何限制&#xff0c;级别最高。一般用于修饰方法&#xff0c;提供给其他类调用。 b) private 【私有的】只有类的内部可以使用&#xff0c;一般用于修饰字段&#xff0c;保证数据的安全性。 注&#xff1a;如果…

java面试题27 java中下面哪些是Object类的方法()

java面试题27 java中下面哪些是Object类的方法&#xff08;&#xff09; A notify() B notifyAll() C sleep() D wait() 蒙蔽树上蒙蔽果&#xff0c;蒙蔽树下你和我。遇到这种题&#xff0c;我默默的打开了编译工具 Object类中方法&#xff1a; protected Object clone()…

HK-2000 数采仪系统说明之 7.HK7710 DTU 简单配置说明

DTU配置列表: 1 移动服务中心设置(MSC) 2 终端单元设置 3 网络通道设置 4 用户串口设置 移动服务中心设置(MSC) 一般默认&#xff0c;当需要连接的网络是APN网络是需要配置&#xff0c;该项下的APN接入点信息 MSC设置列表: 1 服务代码 2 P…

shiro学习(1):shiro简介

Apache Shiro是Java的一个安全框架。对比另一个安全框架Spring Sercurity&#xff0c;它更简单和灵活。 Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、Web集成、缓存等。 Apache Shiro特性 Authentication&#xff1a;身份认证/登录&#xff0c;验证用户是…

是要我向垃圾学习吗

之前把程序给改了&#xff0c;造成程序不能通过编译&#xff0c;然后 领导让我不要乱改&#xff0c;程序那么写肯定是有原因的&#xff0c;照着以前的弄。 我心里那叫一个羊驼&#xff0c;我改的是我自己写的那部分结构&#xff0c;我在编写新功能的逻辑的时候&#xff0c;发现…

微软启动了自爆程序,让我们一起帮它倒计时

……“公元2008年10月20日&#xff0c;注定成为人类信息技术史上不平凡的一天&#xff0c;因为在这一天&#xff0c;曾经创造了无数辉煌的计算机软件帝国微软公司&#xff0c;启动了自爆程序&#xff0c;剩下的&#xff0c;就是倒计时了……” ——《地球人类信息技术编年史》 …

python字典遍历的几种方法(转)

源地址&#xff1a;https://www.cnblogs.com/stuqx/p/7291948.html&#xff08;1&#xff09;遍历key值>>> a {a: 1, b: 2, c: 3} >>> for key in a:print(key:a[key])a:1 b:2 c:3 >>> for key in a.keys():print(key:a[key])a:1 b:2 c:3在使用上&a…

shiro学习(2):第一个shiro程序

工具idea 首先创建maven项目 配置文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

解决水晶报表部署时出错的问题

我在使用VS2008自带的水晶报表开发一个项目时&#xff0c;遇上这么一个问题&#xff0c;就是在开发环境下运行没有问题&#xff0c;而且在开发的机器上部署发布的项目时也没有问题&#xff0c;但是在服务器上部署发布的项目就出现web.config配置文件出错。 错误报的是&#xff…

用树莓派(等)为 USB Midi 键盘增添连接方式

我在去年买了一个 M-Audio 的 Midi 键盘&#xff0c;用来连接电脑或者 iPad 弹琴。但是由于琴摆放的位置没有办法拉充电线&#xff0c;所以我能弹琴多久很大程度上取决于设备还有多少电。前一阵子从朋友手里白嫖了个橘子派&#xff0c;我就考虑用这个板子给我的 Midi 键盘做个无…

python ftp 上传文档出现 553 Could not create file

报错内容&#xff1a; *cmd* TYPE I*put* TYPE I\r\n*get* 200 Switching to Binary mode.\r\n*resp* 200 Switching to Binary mode.*cmd* PASV*put* PASV\r\n*get* 227 Entering Passive Mode (10,65,252,38,254,125).\r\n*resp* 227 Entering Passive Mode (10,65,252,38,25…

shiro学习(3):用户权限

工具idea 首先创建maven项目 配置文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

WPF学习笔记(三)

1.1 事件概括 第一节中我们给窗体添加了一个按钮&#xff0c;不过好像Button点个几下也只有些发光样式的变化&#xff0c;什么你还把系统皮肤去掉了&#xff1f;算了承认下确实够寒碜&#xff0c;那让我们再动动手。 1.1.1 路由事件简述 public HelloWorld() { Button button …

结构体的赋值和初始化与取出结构体变量中的成员

1 /*结构体的赋值和初始化*/2 3 # include <stdio.h>4 5 struct Student 6 {7 int age;8 float score;9 char sex;10 };11 12 int main(void)13 {14 struct Student st { 80, 66.6, F};//定义同时就赋值15 struct Student st2;//下一行不能写一句类似于…

shiro学习(4):shiro认证流程

Shiro登录校验流程实现与分析 什么是Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 三个核心组件 Subject, Se…

python之Map函数

转载 https://www.cnblogs.com/gongxr/p/7247855.html# map()函数使用举例 # 功能&#xff1a;map()接受一个函数f和一个或多个list&#xff0c;将f依次作用在list的每个元素&#xff0c;得到一个新的列表 # 语法&#xff1a;map(方法名&#xff0c;列表&#xff0c;[列表2]) #…

Windows Mobile开发应该选择哪种开发语言?

Windows Mobile开发应该选择哪种开发语言&#xff1f;这个问题曾经被问了很多很多次&#xff0c;特别是打算开始学习Windows Mobile开发的朋友。Native Code or Managed Code? C/C or C#/VB.NET? 简单的说&#xff0c;Native Code的代码执行效率高&#xff0c;开发效率低&…

在ASP.NET MVC中实现Select多选

我们知道&#xff0c;在ASP.NET MVC中实现多选Select的话&#xff0c;使用Html.ListBoxFor或Html.ListBox方法就可以。在实际应用中&#xff0c;到底该如何设计View Model&#xff0c; 控制器如何接收多选Select的选中项呢&#xff1f; 实现效果如下&#xff1a; 初始状态某些选…