我有一段代码可以执行插入到高度非规范化的表中。这些表的列数从 ~100 到 300+ 不等。这是 SQL Server 2008 R2,在 Windows Server 2008 上运行。
每个插入包括插入到同一事务下的多个表。有些插入是由 NHibernate 批处理的,但有些不能,但它们都在同一个事务下。
当我通过重复调用一段执行插入的代码来执行插入 500 次时,我得到平均约 360 毫秒。
奇怪的是,当我使用 4 个进程(在 Windows Server 2008 下从 4 个不同的命令提示符运行相同的 exe)同时运行测试代码时,每次调用的插入性能变得更好。我看到突发速度高达 90 毫秒(快了几乎 X4)。我正在测量代码中的插入时间。
由于这 4 个进程彼此一无所知,我假设这与 SQL Server 有关,但我完全不知道为什么。我想知道为什么会发生这种情况,以及是否有任何配置可以让我在插入不那么频繁的情况下获得相同的性能。
同样欢迎有关 SQL Server 监视方法以了解数据库级别发生的情况的建议。
我目前在 PostgreSQL 中有一个函数,它创建一个临时表,填充它,执行一些棘手的选择并返回结果。postgresql 的临时表是函数的本地表,因此这有助于我避免在临时表中引入另一列来标记由函数的特定执行插入的所有行。如果我使用了一个需要的全局表,并且由于我的查询的性质,它会降低性能。
我想将这段代码移植到 VoltDB,但它不支持从存储过程创建临时表。这让我想到了其他方法。如果存储过程将启动一个事务并删除表中的所有行(不是临时表),那么此时运行的同一存储过程的其他执行会发生什么情况?
或者如果在删除之后,存储过程开始插入行,而另一个会话调用相同的 sp,它将再次删除所有行,那怎么办?
简而言之,我可以通过删除所有行,插入一些行,然后对插入的行执行查询,然后在 sp 执行结束(和事务提交)之前再次删除所有行来创建事务中数据的本地(对 sp 执行)视图吗? )?
这将让我避免为临时行使用 rowset_id 列,避免更慢的连接(这是一个 EAV 实现)。