我应该分解大型SQL查询(MS)吗
这与MS SQL Server 2005有关 我有一个SSIS包,用于验证两个不同数据源之间的数据。如果发现差异,则构建并执行SQL更新脚本来修复问题。找到所有差异后,SQL更新脚本将在包的末尾运行 我想知道如何将sql更新脚本分解为多个事务,以及最好的方法是什么,这是必要的还是一个好主意 更新脚本与此类似,但较长(示例): 对于发现的每个错误/差异,都会向更新脚本添加一个额外的更新查询。我应该分解大型SQL查询(MS)吗,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,这与MS SQL Server 2005有关 我有一个SSIS包,用于验证两个不同数据源之间的数据。如果发现差异,则构建并执行SQL更新脚本来修复问题。找到所有差异后,SQL更新脚本将在包的末尾运行 我想知道如何将sql更新脚本分解为多个事务,以及最好的方法是什么,这是必要的还是一个好主意 更新脚本与此类似,但较长(示例): 对于发现的每个错误/差异,都会向更新脚本添加一个额外的更新查询。 我只希望每天有大约300次更新,但有时可能有50000次。我是否应该将脚本分解为事务,比如说500个更新查
我只希望每天有大约300次更新,但有时可能有50000次。我是否应该将脚本分解为事务,比如说500个更新查询或其他什么?拆分应该不会有问题。但是,如果您希望A.保持项目之间的一致性,和/或B.执行得稍微好一点,您可能希望在while事务中使用单个事务
BEGIN TRANSACTION;
//Write 500 things
//Write 500 things
//Write 500 things
COMMIT TRANSACTION;
事务的存在正是因为这个原因——通过拆分查询,程序逻辑会更清晰,但需要多个操作之间的数据一致性。拆分事务应该不会有问题。但是,如果您希望A.保持项目之间的一致性,和/或B.执行得稍微好一点,您可能希望在while事务中使用单个事务
BEGIN TRANSACTION;
//Write 500 things
//Write 500 things
//Write 500 things
COMMIT TRANSACTION;
事务的存在正是因为这个原因——通过拆分查询,程序逻辑会更清晰,但需要多个操作之间的数据一致性。不,我认为这句话是正确的。这对速度没有多大影响。
如果您确实关心查询的可读性,那么Billy的观点是正确的(如果这是一个将来会看到或使用的查询,您应该这样做)。不,我认为这句话是正确的。这对速度没有多大影响。
如果您确实关心查询的可读性,Billy的观点是正确的(如果它是将来会看到或使用的查询,您应该这样做)。在您知道有问题之前,不要优化任何内容。如果它跑得快,就让它走。如果运行缓慢,请进行一些更改。在知道问题之前不要优化任何内容。如果它跑得快,就让它走。如果运行缓慢,请进行一些更改。您的系统是否会处理读取尚未更新数据的其他进程?如果是这样,您可能希望执行多个事务 执行多个事务的好处是不会不断累积锁。如果同时执行所有这些更新,SQL Server最终将耗尽小粒度锁资源(行/键),并升级到表锁。当它执行此操作时,在事务完成之前,其他人将无法从这些表中读取数据(除非他们使用脏读取或处于快照模式) 副作用是读取数据的其他进程可能会得到不一致的结果
因此,如果nodoby else在更新时需要使用此数据,那么请确保在一个事务中执行所有更新。如果有其他进程需要使用该表,那么是的,分块执行。您的系统是否会处理读取尚未更新的数据的其他进程?如果是这样,您可能希望执行多个事务 执行多个事务的好处是不会不断累积锁。如果同时执行所有这些更新,SQL Server最终将耗尽小粒度锁资源(行/键),并升级到表锁。当它执行此操作时,在事务完成之前,其他人将无法从这些表中读取数据(除非他们使用脏读取或处于快照模式) 副作用是读取数据的其他进程可能会得到不一致的结果
因此,如果nodoby else在更新时需要使用此数据,那么请确保在一个事务中执行所有更新。如果有其他进程需要使用该表,则是,分块执行。如果事务在
快照
隔离级别下运行,则受查询影响的所有记录都将被锁定或复制到tempdb
如果记录的数量足够多,锁可能会升级
如果事务隔离级别不是快照,则并发查询将无法读取锁定的记录,这可能是应用程序的并发问题
如果事务隔离级别为SNAPSHOT
,则tempdb
应包含足够的空间来容纳旧版本的记录,否则查询将失败
如果这两个问题中的任何一个对您来说都是问题,那么您应该将更新分为几个块。如果事务在
快照
隔离级别下运行,则受查询影响的所有记录都将被锁定或复制到tempdb
如果记录的数量足够多,锁可能会升级
如果事务隔离级别不是快照,则并发查询将无法读取锁定的记录,这可能是应用程序的并发问题
如果事务隔离级别为SNAPSHOT
,则tempdb
应包含足够的空间来容纳旧版本的记录,否则查询将失败
如果这两个问题中的任何一个对您来说都是问题,那么您应该将更新分为几个部分。+1:用于识别过早优化。错了,没有票数了,但我会回来的+1:用于识别过早优化。错了,没有票数了,但我会回来的!这将在无人使用系统时运行,但感谢您的解释。对于未来的知识,当你说成批地做时,你是说有多个事务?比如:开始交易//写50