热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer千万级数据量多表联查优化查询记录

  1、数据分区  1.1  通过时间列将大表分为多个小表,缩小数据范围,减少扫描纪录数,这样添加分区索引后存在多个B+索引,单分区查询时相对应索引树也小

  1、数据分区

    1.1  通过时间列将大表分为多个小表,缩小数据范围,减少扫描纪录数,这样添加分区索引后存在多个B+索引,单分区查询时相对应索引树也小

       1.1.1   在本地任意盘符下创建存放小表的文件夹

         

        1.1.2    通过SQLServerManagement创建数据库文件组

             数据库右键--属性--文件组--添加文件组      

         1.1.3 创建数据库文件

             数据库右键--属性--文件组--添加文件组--添加文件逻辑名称--选择文件对应存放的文件组--选择文件存放路径

           

    

        1.1.4 创建分区函数,告诉SQLServer以什么规则对分区表进行分区   

           分区表1:2020-1-1以前的数据(不包含2020-1-1)。

           分区表2:2020-1-1(包含2020-1-1)到2020-1-31之间的数据。

           分区表3:2020-2-1(包含2020-2-1)到2020-2-29之间的数据。

           分区表4:2020-3-1(包含2020-3-1)到2020-3-31之间的数据。

           分区表5:2020-4-1(包含2020-4-1)到2020-4-30之间的数据。

           分区表6:2020-5-1(包含2020-5-1)之后的数据。

 

           CREATE PARTITION FUNCTION part(datetime)  

           AS RANGE RIGHT FOR VALUES ('20200101','20200201','20200301','20200401','20200501')  

 

    CREATE PARTITION FUNCTION是创建一个分区函数。

    part为分区函数名称。

    AS RANGE RIGHT为设置分区范围的方式为Right,也就是右置方式。

    FOR VALUES ('xx','xx','xx','xx','xx')为按这几个值来分区,分区条件。

    为什么值“ 20200201”会放在表2中,而不是表1中,这是由AS RANGE RIGHT中的RIGHT所决定的,RIGHT的意思是将等于这个值的数据放在右边的那个表里,也就是表2中。如果您的SQL语句中使用的是Left而不是RIGHT,那么就会放在左边的表中,也就是表1中。

 

        1.1.4 创建分区方案,分区方案的作用是将分区函数生成的分区映射到文件组中去,告诉SQLServer已分区的数据放在那个文件组下。

     CREATE PARTITION SCHEME partsch

     AS PARTITION part

     TO (  part01,    part02,  part03,  part04,   part05,part06)  

 

    CREATE PARTITION SCHEME意思是创建一个分区方案。

    partschSale为分区方案名称。

    AS PARTITION partfunSale说明该分区方案所使用的数据划分条件(也就是所使用的分区函数)为partfunSale。

    TO后面的内容是指partfunSale分区函数划分出来的数据对应存放的文件组。

      

        1.1.4 查看方案与函数

            脚本执行完成后展开数据库目录,“存储”下的分区方案、分区函数中查看。

 

        1.1.5 创建分区表

            CREATE TABLE Sale(     

              [Id] [int] IDENTITY(1,1) NOT NULL,      

              [time][datetime] NOT NULL  

             ) ON partsch([time])  

 

              ON partsch 表明关联名为partsch的分区方案,括号中为分区条件字段。

 

        1.1.4 普通表转为分区表

            --删掉主键  

              ALTER TABLE 表名 DROP constraint 主键名  

             --创建主键,但不设为聚集索引  

               ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY NONCLUSTERED  

                (  

                    [ID] ASC  

                 ) ON [PRIMARY]  

             --创建一个新的聚集索引,在该聚集索引中使用分区方案  

               CREATE CLUSTERED INDEX 索引名 ON 表名(列名)  ON 分区方案名([分区索引列名])  

 

        1.1.4 查询

            每个物理分区表中存放了哪些记录,可以使用$PARTITION函数。

 

2、索引

     2.1 SQLServer索引分类

          索引就类似于中文字典前面的目录,按照拼音或部首都可以很快的定位到所要查找的字。

          唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)

          主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。

          聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼            音 a 过了后面肯定是 b 一样。

          非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并            不连续。

                     聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。

     2.2 添加位置

           单表查询在where列添加对应索引。

           多表关联查询在关联表的两列分别对应索引,where条件列添加索引,根据条件数量选择对应索引,不易添加过多索引占             用索引空间,会导致添加、修改时的效率底下。

           注意:部分sql函数以及条件判断式,多变关联查询时主表、子表逻辑顺序前后等sql语句写法都会导致索引失效。

           目的是为了减少sql语句执行时全盘扫描的现象,按照定义好的逻辑以最小开销查询出期望数据才能显著提高查询语句的               效率。

3、完

    主表一千万左右数据,子表一千四百多万数据加五张关联表,多表联查时sql效率显著提升!


版权声明:本文为M13134471原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/M13134471/article/details/106423584
推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
Jessica_猪猪到_697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有