对于内存数据库与常规数据库对比的一点疑问。

[复制链接]
查看11 | 回复9 | 2015-4-24 16:04:24 | 显示全部楼层 |阅读模式
我刚接触内存数据库的时候也拿到过一大堆的性能对比报告,那时我一直在想一个问题,拿oracle来说,oracle本身提供将对象固定到内存的功能,如果将主要对象也都全部钉入内存后再跟内存数据库比会怎么样呢?速度可能不及,但在这种情况下会差多少呢?我问过一些官方,altibase都没有给出明确的回答,而oracle的工程师则认为没有必要。我曾试过将一张上亿条记录的表钉入内存,全表查询的时间基本为10秒左右(主机p690),速度同样惊人。(这个测试说明不了什么,高并发和高响应的生产环境比这个要复杂的多。)
我觉得既然是对比,条件就应该公平,拿内存速度跟磁盘比,不出报告也知道差距了。如果非要这么比,就应该说明为什么这么比,oracle对象都钉入内存会不会出现什么问题(其实这是我最希望知道的)。
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
首先是 内存数据库 与磁盘数据库 的算法上不一样,还有 你把oracle对象都钉入内存,ORALCE 内存算法是LRU算法,还有 内存管理等 一些列复杂算法。oracle对象只能在SHARE POOL 中,对内存管理更加加重了负担。
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
那里有第三方的测试报告么???
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
原帖由 liyongdong 于 2007-11-20 14:15 发表
首先是 内存数据库 与磁盘数据库 的算法上不一样,还有 你把oracle对象都钉入内存,ORALCE 内存算法是LRU算法,还有 内存管理等 一些列复杂算法。oracle对象只能在SHARE POOL 中,对内存管理更加加重了负担。


都Keep在Memory里了,还需要什么LRU算法。
IN Memory DB 利用index的寻址路径要比Oracle Database短。所以理论上要更快。
还可以同应用嵌在一起,避免进程间的IPC,这点对效率提高很有帮助。
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
原帖由 nocode 于 2007-11-20 11:45 发表
我刚接触内存数据库的时候也拿到过一大堆的性能对比报告,那时我一直在想一个问题,拿oracle来说,oracle本身提供将对象固定到内存的功能,如果将主要对象也都全部钉入内存后再跟内存数据库比会怎么样呢?速度可 ...

俺Keep过table and index ,都没什么问题,可以提高不少性能。
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
原帖由 jolly 于 2007-11-20 17:31 发表
俺Keep过table and index ,都没什么问题,可以提高不少性能。

keep过多大的table?keep过多少index?怎么样都没有问题?性能提高到底多少?最好用数据说话!!!
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
原帖由 nocode 于 2007-11-20 11:45 发表
我刚接触内存数据库的时候也拿到过一大堆的性能对比报告,那时我一直在想一个问题,拿oracle来说,oracle本身提供将对象固定到内存的功能,如果将主要对象也都全部钉入内存后再跟内存数据库比会怎么样呢?速度可 ...


SGA是否越大越好?如何用statspack的报表来验证?
如果你有足够的内存,你会不会将SGA开得足够大?
有位朋友的物理内存16G,将SGA开到9G左右,实际上他的数据库才13G,
数据库几乎全被缓存到SGA中,但下边的人还是说慢,
statspack的报表显示如下:
Load Profile
~~~~~~~~~~~~
Per Second Per Transaction

--------------- ---------------

Redo size:
6,679.72
15,071.00

Logical reads:
80,724.11
182,132.26

Block changes:
23.75
53.58

Physical reads:
0.70
1.57

Physical writes:
1.48
3.34
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Buffer Nowait %:100.00 Redo NoWait %:
100.00

BufferHit %:100.00In-memory Sort %:
100.00

Library Hit %: 99.74Soft Parse %:
99.93
Execute to Parse %: 31.87 Latch Hit %:
99.87
Parse CPU to Parse Elapsd %: 95.57 % Non-Parse CPU:
98.71
由于SGA足够的大,它的数据库中Buffer Hint是100%,其它的各项指标也非常好,
但在Load Profile项中可以看到Logical reads比较突出,
然后看statspack报表的TOP SQL部分,发现SQL的单次逻辑读都比较大,
通过优化SQL,系统速度明显提高,然后将SGA从9G依次调到3G,
通过报表观察,各项指标并没有显示下降,top 5 event也没有什么变化,
然后将SGA从3G调到1G这时,虽然Load profile及Instance Efficiency per
的各项指标没有明显下降,但top 5 event中等待事件的数量上升的较多.
从这也可以看出,运转良好的数据库,它的数据量与SGA有一定的比例关系,
如果数据量一定的情况下,SGA大大超过那个比例,系统的性能并不能有很大的提高.
随着业务及数据量的增加,数据库的性能应该是慢慢恶化,
如果性能调优的速度赶不上系统恶化的速度,那应用的速度就会让客户无法忍受
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
各位大侠们可以先看看Oracle精华区的帖子:
http://www.itpub.net/124424.html
记住了Oracle磁盘数据库的SGA设置并非越大越好!!!毕竟Oracle磁盘数据库不是内存数据库,虽然都是关系型数据库管理系统还是存在内在机制的区别的!!!
[ 本帖最后由 tom_111 于 2007-11-21 01:53 编辑 ]
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
对于linux操作系统下的数据库,由于在正常情况下Oracle对SGA的管理能力不超过1.7G。所以总的物理内存在4G以下。SGA的大小为物理内存的50%―75%。对于64位的小型系统,Oracle数据库对SGA的管理超过2G的限制,SGA设计在一个合适的范围内:物理内存的50%―70%,当SGA过大的时候会导致内存分页,影响系统性能。
回复

使用道具 举报

千问 | 2015-4-24 16:04:24 | 显示全部楼层
原帖由 tom_111 于 2007-11-21 01:45 发表

SGA是否越大越好?如何用statspack的报表来验证?
如果你有足够的内存,你会不会将SGA开得足够大?
有位朋友的物理内存16G,将SGA开到9G左右,实际上他的数据库才13G,
数据库几乎全被缓存到SGA中,但下边的 ...

你的这个报告说明不了问题的,因为自动cache和手工keep是有区别的。
而且那个SQL的单次逻辑读比较大也是调优问题,不在讨论范围之内。
你实际测一些简单的语句就会明白了。举个例子:
SQL> set timi on
SQL> set autot on
SQL> select count(*) from testfull;
COUNT(*)
----------
13897951
Elapsed: 00:00:21.02
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 SORT (AGGREGATE)
21 TABLE ACCESS (FULL) OF 'TESTFULL'


Statistics
----------------------------------------------------------

0recursive calls

0db block gets
33728consistent gets
33707physical reads

0redo size
521bytes sent via SQL*Net to client
655bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

0sorts (memory)

0sorts (disk)

1rows processed
SQL> /
COUNT(*)
----------
13897951
Elapsed: 00:00:16.82
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 SORT (AGGREGATE)
21 TABLE ACCESS (FULL) OF 'TESTFULL'


Statistics
----------------------------------------------------------

0recursive calls

0db block gets
33728consistent gets
33694physical reads

0redo size
521bytes sent via SQL*Net to client
655bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

0sorts (memory)

0sorts (disk)

1rows processed
SQL>
可以看到,连续两次执行的时间是差不了多少,都物理读了,而且都有逻辑读,再看看下面的:
SQL> set autot off
SQL> show parameter db_keep
NAME
TYPEVALUE
------------------------------------ ----------- ------------------------------
db_keep_cache_size
big integer 2147483648
SQL> alter table TESTFULL STORAGE ( BUFFER_POOL KEEP );
Table altered.
Elapsed: 00:00:00.01
SQL> set autot on
SQL> select count(*) from testfull;
COUNT(*)
----------
13897951
Elapsed: 00:00:17.11
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 SORT (AGGREGATE)
21 TABLE ACCESS (FULL) OF 'TESTFULL'


Statistics
----------------------------------------------------------
112recursive calls

0db block gets
33738consistent gets
33706physical reads

0redo size
521bytes sent via SQL*Net to client
655bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

2sorts (memory)

0sorts (disk)

1rows processed
SQL> /
COUNT(*)
----------
13897951
Elapsed: 00:00:06.41
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 SORT (AGGREGATE)
21 TABLE ACCESS (FULL) OF 'TESTFULL'


Statistics
----------------------------------------------------------

0recursive calls

0db block gets
33728consistent gets

0physical reads

0redo size
521bytes sent via SQL*Net to client
655bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

0sorts (memory)

0sorts (disk)

1rows processed
可以看到,第二次数据库被keep到内存之后,物理读没了。速度提高了3倍。
所以说有些情况下,数据如果被自动cache了同样要有物理读的,但手动钉入内存就不同了。这说明keep和不keep是不一样的。
你报告里的命中率只能做为调优的参考,大表的扫描会有很高的物理读的同时也会有很多的逻辑读的,在有些情况下会比物理读高更多,从而导致命中率依然很高(这是调优问题,有点跑题了)。
另外现在电信级系统已经跟4、5年前不一样了(那个帖子是03年的),我管的数据库所在主机最大的内存有64G,就算安装物理内存的70%,sga也能达到40多G了(我印象里江苏联通内存数据库开始只需要20多G内存),早就突破了以前的技术瓶颈。即使考虑页交换的问题,oracle也提供了lock sga的功能啊。
其实sga的问题,内存数据库一样存在,要保证内存数据库里的数据完全在实际物理内存才有用,一样要给系统和应用留有足够的内存空间的。
我不否认内存数据库肯定比传统数据库快,这是事实,机制决定的。但数据都在内存里到底能快多少?传统数据库把主要数据keep进内存到底有什么不妥。这需要数据来说明,至今我没有看到相关的数据。打不太恰当的比喻,如果花很多钱买的oracle就能完成的工作,为什么还需要花额外的钱买内存数据库呢?而且也不便宜!
[ 本帖最后由 nocode 于 2007-11-23 17:20 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行