热门标签 | 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
推荐阅读
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本视频教程将带你快速了解 Android 开发的基础知识,并详细讲解如何在 Android 应用中使用 SQLite 数据库进行数据存储和管理。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
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社区 版权所有