Tsql SQL事务-允许在提交之前读取原始数据(快照?)

Tsql SQL事务-允许在提交之前读取原始数据(快照?),tsql,transactions,sql-server-2012,Tsql,Transactions,Sql Server 2012,我面临一个问题,可能很容易解决,我只是新的高级事务设置 每隔30分钟,我会运行一次INSERT查询,从链接服务器获取最新数据到我客户机的服务器,到一个我们可以称为importable的表。为此,我有一个简单的工作,如下所示: BEGIN TRAN DELETE FROM ImportTable INSERT INTO ImportTable (columns) SELECT (columns) FROM QueryGettingRe

我面临一个问题,可能很容易解决,我只是新的高级事务设置

每隔30分钟,我会运行一次
INSERT
查询,从链接服务器获取最新数据到我客户机的服务器,到一个我们可以称为importable的表。为此,我有一个简单的工作,如下所示:

BEGIN TRAN
     DELETE FROM  ImportTable

     INSERT INTO ImportTable (columns)
          SELECT (columns)
          FROM QueryGettingResultsFromLinkedServer
COMMIT
问题是,每次作业运行时,importable都会在查询运行时(2-5分钟)被锁定,没有人可以读取记录我希望该表可以随时读取,停机时间尽可能少。

现在,我了解到可以在数据库设置中允许
快照隔离
,这可能会解决我的问题(目前设置为
FALSE
),但我从未使用过不同的事务隔离类型,因为这不是我的DB,而是我客户的,如果我不确定它是否会破坏某些东西,我宁愿不改变任何数据库设置

我知道我可以有一个中间表,将记录插入到中间表中,然后插入到最终表中,这当然是一个可能的解决方案,我只是希望有更复杂的东西,并在这个过程中学习一些新的东西

PS:我的客户机的服务器和数据库是相当新的,几乎没有使用过,所以我希望如果我更改一些设置,影响很小,但我仍然不能为了学习目的随机更改各种设置


非常感谢

Inserts通常不会阻止表,除非它升级到表级。在这种情况下,您首先删除表,然后再次插入数据,为什么不只插入更新的数据?。对于查询,您使用事务级(rsci)快照隔离将有助于您,但行版本会增加影响,这意味着sql将存储在tempdb中更改的行的行版本


请观看Kimberle tripp的MCM隔离视频,以便深入了解,也不要忘记在舞台环境中进行测试。

您正在使这比需要的更难
问题在于你让2-5分钟成为交易的一部分
只有几千行-这部分需要几毫秒
如果您需要importable在这几毫秒内可用,请将其放在快照中

Delete ImportTableStaging;
INSERT INTO ImportTableStaging(columns)
          SELECT (columns)
          FROM QueryGettingResultsFromLinkedServer;
BEGIN TRAN
     DELETE FROM ImportTable
     INSERT INTO ImportTable (columns) with (tablock)
          SELECT (columns)
          FROM ImportTableStaging
COMMIT

如果您担心并发更新到ImportableStaging,那么使用#temp

如果您有需要2-5分钟的查询,那么您应该使用中间表。除了快照。是什么阻止了你安装自己的DB进行学习?@Blam,在我工作的公司,我有足够的空间来试验大多数SQL,但我从不需要更改DB设置,也不想在我的本地机器上安装一台服务器,可能只是为了一次测试。为什么建议同时使用中间表和快照?这不是太过分了吗?另外,在服务器更频繁地使用temdb时,允许快照与磁盘空间隔离有什么缺点吗?(我希望我理解正确)杀伤力过大?如果没有必要,您为什么要保留任何交易2-5分钟?为什么没有测试环境?真的只有生产环境吗?@Blam,如果将2-5分钟的查询结果插入到中间表,然后将这些记录插入到最终表中,那么实际的停机时间将是最小的。查询对数亿条记录执行大量计算,但结果只有几千条,这使得插入几乎是立即的。是的,在这种情况下,我只有一个生产环境。那么,中间表是如何过度使用的呢?“为什么不只插入更新的数据?”-这可能是一个好主意,但我仍然必须识别并删除与查询结果不匹配的行。我在technet上找到了Kimberly关于隔离的博客和视频,这似乎是一个很好的信息来源,非常感谢!这显然是个糟糕的答案。如果这是一组新的数据,则需要阻止该表。看到部分数据集通常不是一件好事。插入时阻塞是一件好事。这是几千行,但如果是1000万行呢?问题是插入速度慢,因为索引。@SQLPolice什么??但这不是1000万行。OP说了几千,我在回答中重复了这一点。即使是1000万行,临时表也会更快。由于索引的原因,插入速度很慢,从何处获得?结果是几千行。再多的索引也不会使几千行的删除和插入变慢。而且在几千行上不需要索引。