精华内容
下载资源
问答
  • java保留两位小数

    2012-11-01 15:52:00
    相信大家对内存数据库的 概念并不陌生,之前园子里也有多大牛介绍过SQL内存数据库的创建方法,我曾仔细 拜读过,有了大致了解,不过仍有很多细节不清晰,比如: (1)内存数据库是把整个数据库放到内存的吗? ...

    相信大家对内存数据库的 概念并不陌生,之前园子里也有多位大牛介绍过SQL内存数据库的创建方法,我曾仔细 拜读过,有了大致了解,不过仍有很多细节不清晰,比如

    (1)内存数据库是把整个数据库放到内存中的吗?

    (2)数据都在内存里面,那宕机或者断电了,数据不是没有了吗?

    (3)据在内存是怎么存放的,还是按照页的方式吗,一行的大小有限制吗?

    (4)内存数据库号称无锁式设计,SQL是如何处理并发冲突的呢?

    相信这些疑问也是大家在思考内存数据库时经常遇到的难题,下文将为大家一一揭开这些问题的面纱,如有不对之处,还请各位看官帮我指出。

     

    一、内存数据库是如何存储的,只放在内存吗?是把整个数据库放在内存吗?

    答案:不是。

    如果你还没有看过宋大侠的博客,建议现在就看看。

    http://www.cnblogs.com/CareySon/p/3155753.html

    在这篇文章中,我想着重引用如下两个信息:

    (1)内存数据库其实就是将指定的表放到内存中,而不是整个数据库;

    (2)内存数据库用文件流的方式组织磁盘中的数据文件;

    我再补充一个信息

    (3)内存数据库的数据文件分data file和delta file,而且是成对出现;

    1、内存数据库其实就是将指定的表放到内存中,而不是整个数据库;

    从宋大侠的博客中可以知道,内存数据库的创建过程其实就是将表存放到内存中,而不是整个数据库。下图展示 了创建内存优化表的语法,红色框标注了内存与传统表创建时语法不相同的地方。

     

     

    内存优化表不仅仅是把数据存放到内存中,要不然跟传统数据的缓存没有区别。在内存数据库中,内存优化表也叫为" natively compile memory-optimized tables",翻译过来就是本地编译内存优化表,内存优化表在创建的同时被编译成本地机器代码装载到内存中,本地机器代码包含了能被CPU直接执行的机器指令,所以对内存优化表的访问和操作将非常快。

     

    内存优化表分两类,持久性表和非持久性表,对持久性表的改动会记录日志,即使数据库重启,数据也不会丢失;对非持久性表的操作不会记录日志,这些操作结果只保留在内存中,数据库重启后数据会丢失。

    上文只是介绍了新建一张表的情况,在正常的业务环境中我们不可能对一个业务系统数据库的每张表都去create,那对于已经存在的表,有没有配置方法呢?答案恐怕不太令人满意,目前SQL暂不支持迁移现有表到内存中,因此要想使用内存数据库,现有的业务数据表必须重新创建。

     

    2、内存数据库用文件流的方式组织磁盘中的数据文件

    在内存数据库中,磁盘上存储的数据文件不在是区、页的存储方式,而是基于文件流存储。文件流存储的一个特点之一就是支持快速的读操作,这在数据库重启时将文件流中的数据load到内存中时很能提高效率。

     

     

    3、内存数据库的数据文件分data file和delta file,而且是成对出现;

    内存数据库中插入、更新的数据和删除的数据物理分开存储的,分别用data file和delta file保存。

    (1)Data file

    Data file用来保存"插入"或者"更新"的数据行,data file中数据行的存储顺序严格按照事务执行的顺序组织,比如data file中第一行的数据来自于事务1,第二行数据来自于事务2,这两行可以是同一个表的数据,也可以是不同表的数据,取决于这两个连续的事务操作的内存优化表是否相同。 这种方式的好处是保证了磁盘IO的连续性,避免随机IO。

    Data file的大小是固定的,为128MB,当一个data file被写满了后,SQL会自动新建一个data file。因为数据在data file中保存的顺序是按照事务的执行顺序进行的,所以一张表的数据行(来自多个事务)可能跨越了多个data file,当对多行进行更新操作时,写操作可以分配到多个文件上,并且同时进行,这样就可以加快更新的效率。(下文介绍delta file时会介绍)

    如下图,一共有4个data files(浅蓝色),第一个data file的事务范围为100-200,第二个data file的事务范围为200-300……(100、200表示时间戳)

     

    在Data file中,如果一行被删除或者更新了,这行不会从data file中移除,而是通过delta file(上图黄色框)来标记删除的行,(update的本质是delete和insert的集合,所以执行update时也会有删除的动作),这样可以消除不必要的磁盘IO。

    如果data file的数据永不删除,那文件岂不是无限制的增大,以后备份不是得用很大的磁盘才行?当然不是,SQL在处理这个问题用到方法其实很简单——"合并",根据合并策略,将多个data file和delta file合并起来,依据delta file的内容删除data file中的多余记录,然后将多个data file合并成一个文件,从而减小数据文件占用的磁盘空间大小。

     

    (2) Delta file

    每个data file都有一个与之匹配的Delta File,这个匹配是指事务范围上的匹配,两者记录的是同一段事务(包括一个或者多个事务)上的数据,Delta File中记录了data file中被删除行的标记,这个标记其实就是一个关联信息{inserting_tx_id, row_id, deleting_tx_id }。它跟data file一样,也是严格按照事务操作的顺序来保存删除的行的信息。

    如上图,该内存数据库有5个data file,分别存放了事务范围在100-200、200-300、300-400、400-500及500的数据。如果有一个时间戳为501的事务需要删除时间戳为150、250、450的事务所产生的数据和增加一些新数据时,相应的IO请求就会被分配到第1、2、4的 delta file上和第5的data file上。删除操作可以分配到多个文件上,并且同时进行,这样就可以加快删除的效率。

     

     

    二、数据都在内存里面,那宕机或者断电了,数据不是没有了吗?

    答案:不是。

    内存数据库通过两种方式保证数据的持久性:事务日志和chcekpoint。

    (1)事务日志

    内存数据库的"写日志"和"写数据"在一个事务中进行,在事务执行期间,SQL会先"写数据"然后在才"写日志",这点与传统数据库不同,在传统数据库中,不管是在内存中还是磁盘中,"写数据"总是在"写日志"之后,也就是通常所说的WAL(Write-Ahead Transaction Log)。但是,在事务提交时,内存数据库和传统数据库在"写日志"上没有什么区别:日志会先于数据写入到磁盘中。

    因此,即使服务器发生了宕机或者断电,下次数据库重启时会按照已经保存在磁盘中事务日志将业务redo(重做),所以不要担心数据会丢失。

    另外,需要补充的是,内存数据库只会对持久性表将已提交的事物日志保存到磁盘中。这样做的好处可以减少写磁盘的次数。内存数据库支持频繁、快速的增、删、改等操作,这个强度远远高于传统数据库,数据库需要为每笔操作写日志,这样就会产生大量磁盘IO,写日志操作将有可能成为性能瓶颈,不记录未提交的事务日志就减少写日志的数量,从而可以提高数据库的性能。

    有同学会想,不记录未提交事务的日志会不会导致数据不一致呢?

    肯定不会,因为日志在写入磁盘前不可能发生先把"脏数据"写入到磁盘的现象(下面介绍checkpoint的时候会介绍原因)。

     

    (2)CheckPoint

    在内存数据库中,CheckPoint的主要目的就是将内存中的"数据"写入到磁盘中,从而在数据库崩溃或者重启时减少数据恢复的时间。不需要数据库逐条读取所有的日志来恢复数据。默认情况下Checkpoint是周期性进行的,当日志至上次checkpoint后增加了512M时会触发新一轮CheckPoint。

    在传统数据库这种,Checkpoint可以将未提交的数据flush到磁盘的mdf文件中,这个现象在内存数据库中不会发生,因为内存数据库只将已提交事务的日志,而在写日志(到磁盘)之前不可能将数据先写到磁盘中,因此可以保证写到磁盘中的数据一定是已提交事务的数据。

     

    三、数据在内存是怎么存放的,还是按照页的方式吗,一行的大小有限制吗?

           答案:不是按照页的方式,一行的限制大小为8060Bytes。

    内存优化表是基于行版本存储的,同一行在内存中会有多个版本,可以将内存优化表的存储结构看作是该表中 所有行的多个行版本的集合。

    内存优化表中的行跟传统数据库的行结构是不一样的,下图描述了内存优化表中一行的数据结构:

    在内存优化表中,一行有两个大部分组成:Row header和Row body,

    Row header记录这个行的有效期(开始时间戳和结束时间戳)和索引指针

    Row body记录了一行的实际数据。

    在内存优化表中,行版本的数量是由针对该行的操作次数决定的,比如:每更新一次,就会新产生一行,增加一个行版本,新行有新的开始时间戳,新行产生后,原来的数据行会自动填充结束时间戳,意味这行已经过期。

    备注:上图实际上只有3行,第1行有3个行版本,第2行有2个行版本,第3行有4个行版本。

     

    既然同一行在内存中存在这么多的行版本,那数据库在访问时是怎么控制的呢?

    在传统数据库中,表中每一行都是唯一的,一个事务如想找到一行,通过文件号、页号、槽位就可以了。

    在内存数据库中,每一行有多个行版本,一个事务不可能对将每个行版本都操作一遍,实际上,一个事物只能操作同一行的一个行版本,至于它能对哪个行版本进行操作,取决于事务执行时间是否在这行的两个时间戳之间。除此之外的其他行版本对该事务而言是不可见的。

    由于一行可能存在多个行版本,大家可能会提出这样一个疑问:每行都有这么多行版本,一张上百万行的表,内存哪够呀。不用担心,前文介绍过了,每个行实际上是有时间戳的,对于已经打上结束时间戳且没有活动事务访问的行,SQL Server会通过garbage collection机制回收它占用的内存,从而节省内存。所以不要担心内存不够。

     

     

    四、内存数据库号称无锁式设计,那如果发生了并发冲突怎么办,SQL是如何处理冲突的呢?

    答案:内存数据库用行版本来处理冲突。

    锁的一个重要作用就是避免多个进程同时修改数据,从而造成数据不一致。常见的冲突现象包括读写互锁和写写互锁。那内存数据库是如何通过行版本来解决这两种锁定现象的呢?

    (1)读写互锁

    在内存数据库中,所有对内存优化表的事务隔离都是基于快照的,准确的说是基于行的快照。从上文行的 结构可以知道,每行的行头包括开始时间戳和结束时间戳的,一个事务能不能访问到这行关键在于事务的启动时间是不是在这行的两个时间戳内。

    如果某个事务正在修改一行(快照),但还未提交到内存优化表中,也就是说"新行"还没有结束时间戳,对"读事务"而言,它读还是是原来行(快照),因此不会存在脏读的现象。

     

    (2)写写互锁

            两个事务同时更新一行时,就会发生写写互锁。

    内存数据库冲突发生的概率比传统数据库小很多,但如果实在遇到了冲突,只能调整应用程序,在应用程序中加入"重试逻辑"(等待一会,然后再重新发起事务)来解决。

    或许有同学觉得这种方式好像也没有什么大的性能改变。其实不然,举个例子,在传统数据库中一个锁可能将整个表都管住了,在表锁期间只能等待这个事务做完才能执行其他事务,而实际上这个事务可能只是修改了小部分行,因为表锁的存在,其他行那些不需要被这个事务操作的行。但内存数据库中写写冲突总是发生在行级别的,这个粒度小多了,影响没这么大。

    转载于:https://www.cnblogs.com/huapox/archive/2012/11/01/3516223.html

    展开全文
  • arcmap属性表显示数字,如何才能在保留两位小数显示小数点前面的0——字段显示的格式: 点亮字段,右键属性,“数字格式”按钮“...",寻自定义”,选下来框里的“0.0”,即可。 保留两位小数——字段结构: 在...

    arcmap属性表中显示数字,如何才能在保留两位小数显示小数点前面的0——字段显示的格式: 点亮字段,右键属性,“数字格式”按钮“...",寻自定义”,选下来框里的“0.0”,即可。 保留两位小数——字段结构: 在arcCatalog里修改该属性表里的字段精度;或者在新建字段时就设置好精度或小数位数。

    arcgis数据库建立双精度字段的保留2位小数怎么设置

    ARCGIS中如何调整图例中小数位数

    2d4c670352b85c2c38cad2c1f264b1c2.png

    图例显示的时候,总是小数位数太多,我想只保留2位小数。

    ARCGIS属性表FLOAT型只保留小数点钱三位

    我想在 label显示的时候 只保留前三位显示 但是它就是和属性表里面的一加LABEL的时候 选Expession表达式 Advanced打勾 FindLabel=Round([字段],3)

    mapgis里面积注记如何设成小数点后两位

    在属性库管理里改了,可没用啊,该改成两位又自动恢复成六位

    请问在C#中如何将操作结果只保留到小数点后面两位数,。

    C#中如何只保留小数点后面两位方法:

    num.ToString("#0.00"); //点后面几个0就保留几位 double num=0.121245;string result=num.ToString("#0.00"); //点后面几个0就保留几位Console.WriteLine(result)。

    num.ToString("f2"); //fN 保留N

    687440保留两位小数怎么保留?

    如何使Excel表格中的数字都保留小数点后两位

    要想使表格中的数字都保留小数点后两位,应该怎么办

    展开全文
  • pg数据库百分比处理

    2021-04-15 11:23:54
    PostgreSQL数据库中个integer类型数据,如何处理为百分比形式 有表 student ,其中id字段为character类型,total和complete字段为integer型 total为总任务量,complete为完成任务量,当前诉求,求出完成率,...

    PostgreSQL数据库中,两个integer类型数据,如何处理为百分比形式

    有表 student ,其中id字段为character类型,total和complete字段为integer型

    total为总任务量,complete为完成任务量,当前诉求,求出完成率,保留一位小数

    操作尝试

    一,直接相除   complete/total,可以看到结果为0

    这里为0,因为两个字段均为integer型,会按整数相除处理。

    二,使用round函数 round(complete/total, 1)

    这里结果与操作一类似,只是加了小数点。因为round只是对round(complete/total, 1)中输入的原值做格式化处理,而原值complete/total依然遵循两个integer数据相除的原则。

    查看round后的结果列,结果值类型为 numeric,尝试将除数或被除数设置为numeric类型

    三、除数小数化 complete::numeric,round(complete::numeric/total, 3)​​​​​​​

    这里的操作,将complete做了小数化,这里,可以同时将total做小数化,效果相同

    四,百分比形式

    如果要将结果展示为百分比形式,比如0.125要展示为12.5%

    这里做了一个操作 round(complete*100::numeric/total, 1)||'%'

    • 除数complete 乘以 100

    • round小数保留3位修改为了1

    • round函数外拼接 || '%' 

    五、除数为0处理

    如果除数total有为0的情况,complete/total 会报错,使用case when 关键字

    select complete, total, 
        (case when total=0 then '/' else round(complete*100::numeric/total, 1)||'%' end) as complete_rate
    from student;

    如此,除数为0的问题也成功解决。

     

    展开全文
  • Hibernate如何使用BigDecimal

    万次阅读 2017-06-16 09:48:58
    浮点计算精度损失的文章比较多,我就不多说了,搜了一篇,见参考1。 设置方式如下: ...运算过程中保留6位小数,保存到数据库保留4位小数。 hibernate的配置精度用默认值(19),精度设为4,格式如下:

    大数字有精度precision和小数位scale两个参数可设置,精度的位数是包含小数位数的,即整数位=精度-小数位。对于超过小数位的小数,用四舍五入法进行截取。

    运算过程中保留6位小数,保存到数据库时保留4位小数。

    hibernate的配置中精度用默认值(19),精度设为4,格式如下:

                  <propertyname="price" type="Java.math.BigDecimal">

                         <column name="price"scale="4" />

                  </property>

    由于BigDecimal类型的数据不能直接用==判断相等,因此在现有代码中用这比较的部分,需要替换为用compare函数的比较,如a.compareTo(b) == 0。运算均需要调用对应的函数,如:

    加:a.add(b)

    减:a.subtract(b)

    乘:a.multiply(b)

    除:a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN)

    模:a.remainder(b)

    比较:a.compareTo(b)==0

    展开全文
  • 显示两位小数00),并在头位 数字前显示本地货币符号“¥” 5. 设置sqlplus页宽为200字符,页高为100行,应使用什么 sqlplus命令实现? 6. 如何查看当前用户是什么数据库用户? 7. 如何将第4、5题的格式操作...
  • 首先需求是将数据库中的数据进行处理后 以保留2位小数的形式且最大位数不得超过9位数的形式以百分号的展现形式展现到页面。 比如说: (1)数据库存的数字是:25.56985 那么展现的形式应该就是:25.56% (2)数据...
  • 在日常编程--包括对话框、关系数据库、金融程序、SMS程序及一切处理数据...如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45...
  • 在日常编程--包括对话框、关系数据库、金融程序、SMS程序及...如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字...
  • double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字符串。表面上看来 这是一个意义不大的编程问题,然而,如果真要在实际中派上
  • 说明: 指定将用作组分隔符和小数位的字符。组分隔符就是用来分隔整数组 (如千, 百万等等) 的字符。小数分隔符用来将一个数字的整数部分与小数部分分隔开。其格式是 <decimal_character><group_separator>。 值...
  • 字节跳动-后端开发面试

    千次阅读 2019-10-08 20:09:58
    面试总结: 1.因为投的比较晚了,10月8日下午连续进行了一面,二面,三面。...编程题目包括:根号2保留10位小数如何快速的从几十万条IP地址段确定某一个IP是否属于其中;二叉树的和为某一值的路径;从1-10...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    122 <br>0205 如何使用正则表达式验证两位小数 122 <br>0206 如何使用正则表达式验证一年的12个月份 123 <br>0207 如何使用正则表达式验证一个月的31天 123 <br>0208 如何使用正则表达式验证数字...
  • Microsoft SQL Server 2005 Express Edition SP3

    热门讨论 2012-03-04 10:55:14
    在将 32 组件安装到 64 计算机的 Windows (WOW64) 32 位子系统的 Windows 时可能会出现该错误。例如,下列路径值为“C:\Program Files (x86)\”的脚本将生成一个错误,因为 shell 脚本解释器会将扩展的 PATH ...
  • orcale常用命令

    2009-08-04 00:34:59
    这种方式下可访问数据库中的数据。 4、startup,等于以下三个命令 startup nomount alter database mount alter database open 5、startup restrict 约束方式启动 这种方式能够启动数据库,但只允许具有一定特权...
  • SQL语法大全

    2014-03-30 11:00:11
    1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access driver (*.mdb)};uid=admin;...
  • 这种方式下可访问数据库中的数据。 4、startup,等于以下三个命令 startup nomount alter database mount alter database open 5、startup restrict 约束方式启动 这种方式能够启动数据库,但只允许具有一定特权...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

数据库中如何保留两位小数