为什么不建议SQL Server中使用Not In子查询

大家好,今天来为大家分享在SQL Server中为什么不建议使用Not In子查询的一些知识点,和sql中为什么不建议使用子查询的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

本文目录

  1. sql一次查询需要关联十几张表,有什么优化方案么
  2. sql在使用游标时,有哪些注意事项
  3. SQL server中子查询的作用是什么
  4. 在SQL Server中为什么不建议使用Not In子查询

sql一次查询需要关联十几张表,有什么优化方案么

不知道开发的同学有没有遇到过类似这样的需求:

相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;

业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果;

系统做了分库分表,但是需要统计所有的数据。

那么此类需求要如何满足呢?我们选择了“通过ETL提前进行数据整合”的方案。

什么是ETL

说到ETL,很多开发伙伴可能会有些陌生,更多的时候ETL是用在大数据、数据分析的相关岗位;我也是在近几年的工作过程中才接触到ETL的,现在的项目比较依赖ETL,可以说是项目中重要的一部分。

ETL是三个单词的缩写:

Extraction:抽取、提取;就是把数据从数据库里面取出来;

Transformation:转换;包括但不限于:数据筛选校验、数据关联、数据内容及结构的修改、运算、统计等等;

Loading:加载;将处理后的数据保存到目标数据库。

从这三个单词基本可以了解ETL的作用:将各个业务系统的数据,通过抽取、清洗、转换之后,将加工后的数据落地到数据库中(数据仓库);在这个过程中,ETL可以将分散、零乱、标准不统一的数据整合到一起。

使用场景

我接触过的项目,使用ETL工具的场景有这个几种:

1.报表、BI系统:

在公司建设的初期,业务比较少,系统也比较少,一台数据库就搞定了;随着公司业务的增加,业务系统被拆成很多系统;随着数据量的继续增加,单个系统的数据增加到一定程度的时候,也做了分库分表;

这时候领导、业务人员在用数据做分析的时候,数据来源可能是多个系统的多张表,这时候企图通过一个复杂的SQL跑出来结果就很困难了;通常公司会建立一个数据仓库,通过ETL工具把数据抽取到数据仓库中,再做数据的拟合和展示。

2.跨系统的数据加工或查询:

我们现在所在公司,业务系统有几百个,由于业务流程比较复杂,前端系统在做业务操作的时候,在正式提交交易之前,有很多业务校验;

比如要查询客户在X系统的交易历史,在Y系统的交易历史,在Z系统的交易历史;那么就需要分别调用X、Y、Z系统的接口,这个对前端系统很不友好,那么通常的解决方案是什么?

A方案:做一个中间服务,中间服务去调用X、Y、Z系统的接口,客户端直接调用这个中间服务;这种方案只是把前端要做的事情,转移到了中间服务;

B方案:整合X、Y、Z三个系统,建服务中台;这种方法很好,但是极为难,对于很多公司来说,别说把X、Y、Z三个系统整合成一个中台系统,就是其中一个系统本身进行重构,都是非常困难的;

C方案:把X、Y、Z三个系统中需要的数据,通过ETL抽取加工到一个数据仓库中,对外提供服务;这个系统最大的好处是在不改造X、Y、Z三个系统的前提下,又可以实现跨系统的查询。

我们在C方案的基础上又往前做了一步,就是将落地后的数据又做了一次加工,将需要跨表关联的数据,提前关联好存入MongoDB中,对外提供查询服务;这样可以将多表关联查询,变成了单表查询。

吐数据VS抽数据

接上文中第二个例子中的C方案,有些同学可能会有个疑问:数据抽取,需要抽取哪些数据呢?为什么不让这些系统把数据吐出来呢?

答案也简单,“有的时候,数据不一定能吐出来”。

MySQL数据库往外吐数据有比较成熟的中间件,比如Canal,它可以通过监听Mysql的binlog日志来获取数据,binlog设置为row模式,能够获取到每一条新增、删除、修改的日志,同时还能获取到修改前后的数据;

其他商用数据库,比如Oracle、DB2等,我也查阅过相关的资料,也是有触发器机制,可以当数据发生变化的时候通知出来,比如调用一段程序,将数据发送到消息队列中,再由其他程序监听消息队列做后续处理。

不管什么类型的数据库,这种“吐数据”的方案,对于基础设施的要求都比较高,并且对原有系统有一定的侵入性;所以我们采用了对原有系统侵入性更小的方案:主动抽数据。

ETL方案的优缺点

1.优点

侵入性较低,数据源系统只需要开通数据库的访问权限即可,为保证数据抽取对业务的影响,通常是访问源系统的备库,并且单独设置一个只读权限的数据库用户;

支持不同类型数据源的数据抽取,比如源库有Mysql、DB2、Oracle,通过ETL也可以轻松搞定;

数据整合,将不同业务系统的相同数据整合在一起,比如有些系统M/F表示男女,有些系统1/0表示男女,ETL在抽取加工后转换成统一的编码;

2.缺点

比较致命的一个缺点,就是数据抽取和加工有一定的延迟,需要根据业务场景进行评估,是否接受这个延迟;

可能会受到源库表结构变化的影响;

如果源库中的表没有时间戳,或者时间戳不准确,那么增量抽取就变得很困难;

需要招聘ETL开发岗,从我目前的经验看,不是特别好招。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

sql在使用游标时,有哪些注意事项

优点:游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力缺点:处理大数据量时,效率低下,占用内存大一般来说,能使用其他方式处理数据时,最好不要使用游标,除非是当你使用while循环,子查询,临时表,表变量,自建函数或其他方式都无法处理某种操作的时候,再考虑使用游标

SQL server中子查询的作用是什么

子查询的作用:

1、方便理解。

2、实现更复杂的查询。

3、提高查询效率。扩展知识:1、当直接从SQL的数据库中查询(列出)某些数据很困难或办不到时,可以通过从“查询结果集”中再次提取数据集来实现复合查询。这个“查询结果集”就被叫做子查询。2、例,当表1与表2中以ID1关联,表2与表3以ID2关联,要以表1为基准复合查询三表中的数据时,就需要先查出表2与表3的子查询集,然后再与表1进行多表联查。

在SQL Server中为什么不建议使用Not In子查询

where是查询条件的意思,后面跟上你的查询条件,如果没有查询条件,则不需要where部分。SQL语法:SELECT列名称FROM表名称WHERE条件举例:

文章分享结束,在SQL Server中为什么不建议使用Not In子查询和sql中为什么不建议使用子查询的答案你都知道了吗?欢迎再次光临本站哦!

为什么不建议SQL Server中使用Not In子查询