图片 2

正则基础知识,SSM三大框架整合

正则的一些基础知识

SQL
Server In-Memory OLTP Internals for SQL Server 2016

三大框架整合的思路

创建正则

  • 通过构造函数
    const pattern = new RegExp(pattern,modifiers)

    • pattern:
      匹配的字符串形式,可以有变量

    • modifiers:
      匹配的模式,g(全局),i(忽略大小写),u(多行)

  • 字面量的形式:
    const pattern = /pattern/g

    • pattern: 匹配的内容

这份白皮书是在上一份《SQL Server In-Memory OLTP
Internals Overview》基础上的,很多东西都是一样的不再介绍,只介绍不相同的部分。

1、Dao层:

正则的方法

  • reg.test(str):
    检测一个字符串是否有要匹配的内容,返回一个布尔值

  • reg.exec(str):该方法为专门为捕获组而设计的(每一个小括号是一个捕获组)

    • 参数:要匹配的字符串

    • 返回值:返回的是一个数组。如果不匹配则返回null

    • 关于返回值数组的说明:

      • 它确实是Array的实例。

      • 但是这个数组有两个额外的属性:index和input

      • index:表示匹配的字符串在源字符串中的索引

      • input:表示匹配的源字符串。

      • 数组的第一项目是与整个模式匹配的字符串,其他项是与模式中捕获组匹配的字符串

      • 如果没有捕获组,则数组中只有第一项

行和索引存储

Mybatis的配置文件:SqlMapConfig.xml

正则表达式的一些规则

  • /[0-9a-zA-Z]/:
    匹配[]里面的任意字符

  • /(abc|def)/:
    匹配|中的一项

  • /[^0-9]/: 匹配非数字

  • \d: 匹配数字

  • \D: 匹配非数字

  • \w: 匹配字母和数字以及
    _

  • \W:
    匹配非(字母和数字以及_)

  • \b: 匹配空格子字符

  • \n: 匹配换行符

  • \t: 匹配制表符

  • \0: 匹配null字符

  • \r:匹配回车字符

  • \s:
    匹配空白字符、空格、字表符和换行符

  • \S: 匹配非空白字符

  • ^: 行首匹配

  • $: 行尾匹配

  • ?: 0或1个

  • *: 0或多个

  • +: 至少一个

  • {m}: m次

  • {m,n}: m到n次

  • {m,}: 至少m次

Range索引

Range索引在2014的时候还是不支持的。Range index 使用bwtree数据结构。Bwtree和btree一样有叶子结点和中间节点。最重要的不通点是,bwtree page指针是一个逻辑的page id,而不是物理的page no。PID表示mapping table 上的位置,mapping table把PID和物理内存地址关联。Bwtree的index page是从来不更新的,而是增加一个新的,然后让mapping table的相同PID指向一个不同的物理内存地址。

具体的bwtree的算法可以看:http://www.cnblogs.com/Amaranthus/p/4375331.html

不需要配置任何内容,需要有文件头。文件必须存在。

支持正则表达式的字符串方法

  • search:
    检索与正则表达式相匹配的第一个匹配项的索引

  • match:
    找到一个或多个正则表达式的匹配。其实和正则表达式的exec方法比较像

  • replace(reg|str,str|fn)

    • 第二个参数是一个字符串时,会对匹配到的字符进行替换.(正则可以全局替换)

    • 第二个参数是函数时,会对匹配到每一个字符进行回调,回调的第一个参数是匹配到的字符

      • 第一个参数是字符串时,回调的第二个参数时匹配到的字符的索引,第三个参数是整个字符

      • 第二个参数是正则时,若匹配到的字符没有捕获时,和上面一样.若有捕获,则捕获的项会作为参数传进来,捕获后面的参数则和上面的一样

  • 一些例子

    • 获取query的参数

      function getQueryByName(name) {
          const search = location.search
          const ret = search.match(new RegExp('[?&]'+name+'([^&]'*))
          return ret&&ret.length > 0 ? ret[1] : ''                         
      }
      

       

       

列存储索引

applicationContext-dao.xml:

列存储索引基本结构

SQL Server
2016内存优化表支持聚集的列存储索引。列存储索引是高复合的索引,并不是由行来组织,而是用列来组织的。行被分为多个组,一个组最多可以有2^20行,然后把某一列的数据放入行组中,不会去管剩下的行。

每个行组,SQL Server都会使用Vertipaq压缩算法,重新编码和排列行组中的顺序来打到最有的压缩效果。每个行组中的列都是独立保存的,这个结构称之为段(segment),每个段都是一个LOB,保存在LOB的分配段元中。段是数据读写的基本单元,如图,表示吧一组多个索引列转化为几个段

图片 1

上图中,表被分为3个行组,每个行组有4个段,一共有12个段。

为了支持聚集行存储索引的更新,有2个额外的结构。一个独立的内部表(deleted rows table
DRT)。顾名思义是用来做被删除行的bitmap,用来保存所有已经删除的行的rowid。新行加入会被保存在一个堆中,Delta Store。当行数达到一定行数(通常是2^20或者10万行),SQL Server会吧这些行转化为新的压缩的行组。

内存优化表中聚集列存储索引和内存优化表的非聚集索引是分开保存的,是数据的一个副本。实际上,内存优化表的聚集列存储索引你可以理解为,保存了所有列的非聚集列存储索引。因为数据是高效压缩的,因此开销比较少。因为类存储索引可以压缩到原始数据的10%,因此开销也只有10%。

所有的类存储索引段都是在内存中的。为了恢复的目的,每个行组在内存优化文件组中都保存成一个独立的文件类型为LARGE DATA,在文件中对于某个行组,所有的段都是存放在一起的。SQL Server也维护了一个指针,指向每个段并且可以访问这个段,特别是访问了部分列的时候。这个部分会在下面CHECKPOINT
FILES的时候介绍。新的行会被以列存储索引保存,但是并不会马上加入到压缩行组中,新的行只能使用内存优化表的其他索引来访问。如图,新的行和整个表分开维护的。你可以认为这些行是“delta
rowgroup”和磁盘表的Delta Store类似,但是这些行是内存优化表的一部分,但是不是技术上的列存储索引的一部分。实际上是课件的delta rowgroup

图片 2

内存优化表中的列存储索引只能在interop模式下由优化器进行选择。查询使用类存储索引可以并发并且对于高性能有很多好处。原生编译过程是不会使用列存储索引的,并且所有的查询都不会并发执行。若一个SQL Server 2016的内存优化表有聚集列存储索引,那么就有2个varheap,一个用于压缩行组,另外一个用来保存新行,可以让SQL Server快速识别哪些行还没有进入压缩段,这些行也在可见的delta rowgroup中。

有2个后台线程每2分钟执行一次,用来检查delta rowgroup中的行。注意这些行包含最新插入的,和update的,在内存优化表update就是delete+insert。如果这些行数超过10万那么就有下面2个操作:

  1. 行会被复制到一个或者多个行组,每个段都会被压缩转化变成聚集列存储索引的一部分。
  2. 行会从特定的内存分配器移到常规的内存存储。

SQL
Server并不会是实际统计行数,而是使用评估。没有行组的行数可以超过1048576.如果超过有10万行,那么就会创建另外一个行组。如果小于10万行那么这些行还是会被留在原来的地方。

因为最新插入的行会被频繁更新,或者会被删除,想要延迟对最新行的压缩,可以设置一个等待量。当内存优化表有聚集列存储索引,那么就可以增加一个COMPRESSION_DELAY的参数,指定新行必须在delta rowgroup中呆多久。只有超过参数的行数超过10万才会被压缩到常规的列存储索引行组中。

当行被转换到压缩rowgroup之后,所有删除的行都会被放到Delete Rows表中,和磁盘表的聚集列存储索引。当行多的时候查询会很没有效率。这种情况下重组列存储索引并没有什么用,除非删除并且重建索引。一旦rowgroup中90%的行被删除,剩下的10%会自动被插入到未压缩的varheap,在内存优化表的Delta rowgroup中。Rowgroup的存储会被进行垃圾回收。

Note:
前面提到的,如果内存优化表有任何LOB或者溢出列,列存储索引不能在上面被创建。因为最大的行不能超过8060字节。另外一旦内存优化表有一个列存储索引,就不能使用alter table操作。需要先删除列存储索引,alter**,然后再创建列存储索引。

以下是创建内存优化表的脚本,有2个索引,一个range索引一个列存储索引,然后查询内存消费。并且设置COMPRESSION_DELAY为60分钟。

USE
master;

GO

SET
NOCOUNT
ON;

GO

DROP
DATABASE
IF
EXISTS
IMDB;

GO

CREATE
DATABASE
IMDB;

GO

ALTER
DATABASE
IMDB

   
ADD
FILEGROUP
IMDB_mod_FG

   
CONTAINS
MEMORY_OPTIMIZED_DATA;

GO

ALTER
DATABASE
IMDB

   
ADD
FILE

mybatis整合spring,通过由spring创建数据库连接池,spring管理SqlSessionFactory、mapper代理对象。需要mybatis和spring的整合包。

(   NAME

‘IMDB_mod’
,

                

2、Service层:

FILENAME

‘c:\HKData\IMDB_mod’

            
)

   
TO
FILEGROUP
IMDB_mod_FG;

GO

USE
IMDB;

GO

DROP
TABLE
IF
EXISTS
dbo.OrderDetailsBig;

GO

CREATE
TABLE
dbo.OrderDetailsBig

   
(

       
OrderID INT
NOT
NULL
,

       
ProductID INT
NOT
NULL
,

       
UnitPrice MONEY
NOT
NULL
,

       
Quantity SMALLINT
NOT
NULL
,

       
Discount REAL
NOT
NULL
INDEX
IX_OrderID
NONCLUSTERED
HASH
(
OrderID
)

                                  
WITH

applicationContext-service.xml:

(BUCKET_COUNT

20000000)
,

       
INDEX
IX_ProductID
NONCLUSTERED
(
ProductID
)
,

       
CONSTRAINT
PK_Order_Details

           
PRIMARY
KEY
NONCLUSTERED

               
(

                   
OrderID ,

                   
ProductID

               
)
,

       
INDEX
clcsi_OrderDetailsBig
CLUSTERED
COLUMNSTORE

           
WITH

所有的service实现类都放到spring容器中管理。并由spring管理事务。

(COMPRESSION_DELAY

60)

   
)

WITH
(

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图