高写入(10000+插入/小时),低读取(10读/秒)的最佳数据库?

rks*_*rst 7 sql database sql-server performance amazon-simpledb

我正在开发一个Web应用程序,目前正在使用sql server 2008.但是,我正在考虑转移到另一个数据库(simpledb)以提高性能.

我有一个后台进程,每小时最多10000行插入一个特定的表.该表也被读取以显示Web应用程序中的数据.后台进程运行时,Web应用程序无法使用,因为数据库连接超时.

因此,我正在考虑转向亚马逊的simpledb来提高性能.亚马逊的SimpleDB是否针对此用例进行了优化?如果没有,我可以使用另一种解决方案吗?

cle*_*tus 20

您的问题是您正在使用的隔离级别.除非您更改它,否则SQL Server(以及许多其他数据库)将以选择将阻止未提交读取的模式运行.您想要更改SQL Server,以便它使用MVCC(Oracle的默认设置; MySQL和SQL Server也都使用它),您的问题就会消失.

SET TRANSACTION ISOLATION LEVEL(Transact-SQL):

阅读提交

指定语句无法读取已修改但未由其他事务提交的数据.这可以防止脏读.数据可以由当前事务中的各个语句之间的其他事务更改,从而导致不可重复的读取或幻像数据.此选项是SQL Server的默认选项.

READ COMMITTED的行为取决于READ_COMMITTED_SNAPSHOT数据库选项的设置:

  • 如果READ_COMMITTED_SNAPSHOT设置为OFF(缺省值),则数据库引擎使用共享锁来防止其他事务在当前事务运行读取操作时修改行.共享锁还会阻止语句读取由其他事务修改的行,直到另一个事务完成为止. 共享锁定类型确定何时释放它.在处理下一行之前释放行锁.读取下一页时会释放页锁,并在语句结束时释放表锁.
  • 如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎使用行版本控制为每个语句显示事件一致的数据快照,因为它存在于语句的开头.锁不用于保护数据免受其他事务的更新.

当READ_COMMITTED_SNAPSHOT数据库选项为ON时,您可以使用READCOMMITTEDLOCK表提示为在READ COMMITTED隔离级别运行的事务中的各个语句请求共享锁定而不是行版本控制.

(重点补充)

更改数据库配置以将READ_COMMITTED_SNAPSHOT设置为ON.

此外,尽量保持您的事务尽可能短,并确保您在后台进程中提交事务(每小时执行10,000次插入),因为如果它从未提交,则选择将永久阻止(在默认设置下).

  • 短交易是避免阻止的关键. (2认同)
  • 了解事务和死锁对于理解关系/事务数据库的工作方式至关重要.有关更多信息,请参阅:http://www.rhphost.com/SQL-standard/8277final/LiB0058.html (2认同)
  • 谢谢,这似乎解决了问题。现在,网站在插入期间加载没有问题。 (2认同)

mrd*_*nny 5

正如其他人所说,您写入数据库的数据量不是问题.SQL Server可以轻松处理比这更多的数据.就个人而言,我每小时都有数十万到数百万行的表格没有问题,人们整天都在阅读这些行而没有任何减速.

  1. 您可能需要通过更改read语句的隔离级别或使用WITH(NOLOCK)提示来查看脏读.

  2. 您应该查看使用.NET中的批量上载对象将数据加载到数据库中.根据您在测试期间看到的性能,使用1000-5000的批次.您需要使用该数字才能获得最佳性能.将数据大量插入表中将比逐行插入记录提供更好的性能.确保您不在单个事务中执行整个上载.您应该每批执行一个事务.

  3. 在写入数据库时​​,磁盘IO的外观如何.

  4. 您为数据库设置了什么恢复模型?与使用SIMPLE恢复模式相比,数据库上的完全恢复将需要更多的IO.如果您确实需要随时恢复的时间点,请仅使用完全恢复.