none
两个小问题 RRS feed

  • 问题

  • 所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???

    不使用“事故”也是这样的吗???


    另外,还想问一下大师。


    为什么“SqlServer”使用“openrowset”可以从“Oracle”数据库中取数据???

    这是为什么呢???

    Science and technology is my lover.

    2012年11月30日 11:16

答案

  • 事务是必须的,就算你不用, sql server 在处理时, 也会自己开事务

    openrowset 是一个访问其他数据的操作接口, 就像你在程序中, 为什么能够访问 oracle 呢?

    2012年11月30日 11:28
  • 所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???:

    SQL会在两个时候写数据文件,但是无论哪个时候都会先写事务日志

    (1)

    严格来讲,SQLSERVER不是直接将日志记录写入日志文件里的,中间还有一层日志记录缓存。SQL会将修改所产生的日志记录

    写入日志记录缓存区,而SQL又会保证缓存区里的内容很及时地写入日志文件,哪怕有任何意外发生(包括掉电,服务异常)

    所以对用户来讲,可以粗略理解为在任何insert/update/delete提交之前,SQL都必须将他所对应的日志记录写入日志文件里

    每次写的数量和数据的修改量有关,这种技术叫write ahead logging

    当SQLSERVER做checkpoint (检查点)的时候,需要将内存缓冲区中已经发生过修改的数据页面同步到硬盘中的数据文件里

    一般情况下,SQL会以一分钟左右(默认值)的间隔 (这个值可以在下图里设置一般默认值就行了)做checkpoint。如果数据库

    上的修改比较多,checkpoint的频率会高一些,反之会低一些。做checkpoint的时候,会发生数据文件的写操作。写的数量和

    上次checkpoint以来发生的数据修改量有关

    (2)

    当SQLSERVER buffer pool内存数据缓存区有压力的时候,会触发lazy writer懒惰写入,主动将内存里的一些很久没有使用过

    的数据页面和执行计划清空。如果这些页面上发生的修改还未有checkpoint写回硬盘,lazy writer会将其写回,这个时候会发生

    数据文件的写操作。写的数量和lazy writer需要清空的数据页面有直接关系,也就是说,和内存的缺口(内存的大小)和SQL

    自己的数据修改量有关系

    不使用“事故”也是这样的吗???

    就是LZ你不显式指定BEGIN TRANSACTION

    SQLSRVER默认都已经开启了事务

    说到事务就要说到事务隔离级别,SQLSERVER有四个事务隔离级别:未提交读,已提交读,可重复读,可序列化。SQLSERVER 的默认事务隔离级别是已提交读

    已提交读的意思是:指定语句不能读取已由其他事务修改当尚未提交的数据。其他事务可以在当前事务的各个语句之间更改数据

    就是说,一条语句运行完毕就会自动提交事务

    未提交读隔离级别和已提交读隔离级别都是一条语句运行完毕就会自动提交事务,只是未提交读可以读取已由其他事务修改但尚未提交的行,就是说允许脏读

    说得有点多了

    LZ可以看一下msdn上的解释

    http://msdn.microsoft.com/zh-cn/library/ms174377.aspx

    openrowset:

    是访问OLEDB数据源的接口,你可以使用openrowset来访问access或者oracle等数据库

    详细的解释LZ也可以看一下MSDN

    OPENROWSET (Transact-SQL)

    http://msdn.microsoft.com/zh-cn/library/ms190312.aspx


    给我写信: QQ我:点击这里给我发消息


    2012年12月1日 5:36
  • 不错不错,桦仔水平长进了。

    补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。

    另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。


    想不想时已是想,不如不想都不想。

    2012年12月2日 4:47
    版主

全部回复

  • 事务是必须的,就算你不用, sql server 在处理时, 也会自己开事务

    openrowset 是一个访问其他数据的操作接口, 就像你在程序中, 为什么能够访问 oracle 呢?

    2012年11月30日 11:28
  • 所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???:

    SQL会在两个时候写数据文件,但是无论哪个时候都会先写事务日志

    (1)

    严格来讲,SQLSERVER不是直接将日志记录写入日志文件里的,中间还有一层日志记录缓存。SQL会将修改所产生的日志记录

    写入日志记录缓存区,而SQL又会保证缓存区里的内容很及时地写入日志文件,哪怕有任何意外发生(包括掉电,服务异常)

    所以对用户来讲,可以粗略理解为在任何insert/update/delete提交之前,SQL都必须将他所对应的日志记录写入日志文件里

    每次写的数量和数据的修改量有关,这种技术叫write ahead logging

    当SQLSERVER做checkpoint (检查点)的时候,需要将内存缓冲区中已经发生过修改的数据页面同步到硬盘中的数据文件里

    一般情况下,SQL会以一分钟左右(默认值)的间隔 (这个值可以在下图里设置一般默认值就行了)做checkpoint。如果数据库

    上的修改比较多,checkpoint的频率会高一些,反之会低一些。做checkpoint的时候,会发生数据文件的写操作。写的数量和

    上次checkpoint以来发生的数据修改量有关

    (2)

    当SQLSERVER buffer pool内存数据缓存区有压力的时候,会触发lazy writer懒惰写入,主动将内存里的一些很久没有使用过

    的数据页面和执行计划清空。如果这些页面上发生的修改还未有checkpoint写回硬盘,lazy writer会将其写回,这个时候会发生

    数据文件的写操作。写的数量和lazy writer需要清空的数据页面有直接关系,也就是说,和内存的缺口(内存的大小)和SQL

    自己的数据修改量有关系

    不使用“事故”也是这样的吗???

    就是LZ你不显式指定BEGIN TRANSACTION

    SQLSRVER默认都已经开启了事务

    说到事务就要说到事务隔离级别,SQLSERVER有四个事务隔离级别:未提交读,已提交读,可重复读,可序列化。SQLSERVER 的默认事务隔离级别是已提交读

    已提交读的意思是:指定语句不能读取已由其他事务修改当尚未提交的数据。其他事务可以在当前事务的各个语句之间更改数据

    就是说,一条语句运行完毕就会自动提交事务

    未提交读隔离级别和已提交读隔离级别都是一条语句运行完毕就会自动提交事务,只是未提交读可以读取已由其他事务修改但尚未提交的行,就是说允许脏读

    说得有点多了

    LZ可以看一下msdn上的解释

    http://msdn.microsoft.com/zh-cn/library/ms174377.aspx

    openrowset:

    是访问OLEDB数据源的接口,你可以使用openrowset来访问access或者oracle等数据库

    详细的解释LZ也可以看一下MSDN

    OPENROWSET (Transact-SQL)

    http://msdn.microsoft.com/zh-cn/library/ms190312.aspx


    给我写信: QQ我:点击这里给我发消息


    2012年12月1日 5:36
  • 不错不错,桦仔水平长进了。

    补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。

    另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。


    想不想时已是想,不如不想都不想。

    2012年12月2日 4:47
    版主
  • 不好意思,怡红公子大侠,查资料的时候看的是SQL99标准定义的事务隔离级别

    所以没有说行版本控制隔离级别

    快照隔离级别(SNAPSHOT)

    已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)

    还有你说的下一代SQLSERVER指的是SQL2014吗?


    给我写信: QQ我:点击这里给我发消息



    2012年12月2日 5:46
  • 不错不错,桦仔水平长进了。

    补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。

    另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。


    想不想时已是想,不如不想都不想。

    看过微软研究院的论文,Hekaton是需要写日志的。
    2012年12月3日 4:08
  • 是啊,意外掉电怎麽办?个人觉得像SAP HANA这些内存数据库也需要写日志的,不然遇到突发情况怎麽办?

    给我写信: QQ我:点击这里给我发消息

    2012年12月3日 5:05
  • 并且Hekaton还用到GC机制。



    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 5:46
  • 文章在哪里看的啊?jackie shen大侠


    给我写信: QQ我:点击这里给我发消息

    2012年12月3日 5:50
  • http://research.microsoft.com/en-us/projects/main-memory_dbs/


    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 6:55
  • 不错不错,桦仔水平长进了。

    补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。

    另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。


    想不想时已是想,不如不想都不想。

    看过微软研究院的论文,Hekaton是需要写日志的。

    准确点说,Hekaton可以不写日志。

    想不想时已是想,不如不想都不想。

    2012年12月21日 10:50
    版主
  • 关注了怡红公子斑竹的新浪微博发现怡红公子斑竹的确经验丰富

    之前看了infoQ中文网对Hekaton的介绍,不过也是很粗略的


    给我写信: QQ我:点击这里给我发消息

    2012年12月21日 14:03
  • 主要是因为目前还是NDA阶段,所以细节不能对外公布。我也是刚装好Hekaton。

    想不想时已是想,不如不想都不想。

    2012年12月21日 14:15
    版主
  • MVP就是好,可以先试用

    给我写信: QQ我:点击这里给我发消息

    2012年12月21日 14:30