Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该分解大型SQL查询(MS)吗_Sql_Sql Server 2005_Tsql - Fatal编程技术网

我应该分解大型SQL查询(MS)吗

我应该分解大型SQL查询(MS)吗,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,这与MS SQL Server 2005有关 我有一个SSIS包,用于验证两个不同数据源之间的数据。如果发现差异,则构建并执行SQL更新脚本来修复问题。找到所有差异后,SQL更新脚本将在包的末尾运行 我想知道如何将sql更新脚本分解为多个事务,以及最好的方法是什么,这是必要的还是一个好主意 更新脚本与此类似,但较长(示例): 对于发现的每个错误/差异,都会向更新脚本添加一个额外的更新查询。 我只希望每天有大约300次更新,但有时可能有50000次。我是否应该将脚本分解为事务,比如说500个更新查

这与MS SQL Server 2005有关

我有一个SSIS包,用于验证两个不同数据源之间的数据。如果发现差异,则构建并执行SQL更新脚本来修复问题。找到所有差异后,SQL更新脚本将在包的末尾运行

我想知道如何将sql更新脚本分解为多个事务,以及最好的方法是什么,这是必要的还是一个好主意

更新脚本与此类似,但较长(示例):

对于发现的每个错误/差异,都会向更新脚本添加一个额外的更新查询。
我只希望每天有大约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