Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 游标与30000记录或create 30000 update语句之间的性能考虑_Sql_Sql Server_Performance_Sql Server 2008_Cursor - Fatal编程技术网

Sql 游标与30000记录或create 30000 update语句之间的性能考虑

Sql 游标与30000记录或create 30000 update语句之间的性能考虑,sql,sql-server,performance,sql-server-2008,cursor,Sql,Sql Server,Performance,Sql Server 2008,Cursor,哪个更好 1) 循环记录并逐个执行更新的游标 2) 创建一个包含30000 update命令的脚本 谢谢有一个非常简单的方法告诉你:去做并测量时间 除此之外,当你只有10行的时候,拥有30000行没有多大意义 出于数据迁移或维护以外的原因,以这种方式进行更新听起来也不明智,在这种情况下,性能不是问题,但维护和易读性始终是问题。两者都需要大约相同的时间,主要取决于光标的声明方式 原因?你有30000个个人更新,这通常是主要因素 请注意,由于批大小和编译时间的原因,一批中30000个单独的更新可能会

哪个更好

1) 循环记录并逐个执行更新的游标

2) 创建一个包含30000 update命令的脚本


谢谢

有一个非常简单的方法告诉你:去做并测量时间

除此之外,当你只有10行的时候,拥有30000行没有多大意义


出于数据迁移或维护以外的原因,以这种方式进行更新听起来也不明智,在这种情况下,性能不是问题,但维护和易读性始终是问题。

两者都需要大约相同的时间,主要取决于光标的声明方式

原因?你有30000个个人更新,这通常是主要因素

请注意,由于批大小和编译时间的原因,一批中30000个单独的更新可能会失败

SQL是一种基于集合的语言,您很可能只需执行一次更新即可一次性更新所有行。如果你不能,那是因为两个原因

  • 您需要“每行”逻辑:这通常可以通过CASE表达式、udf等实现
  • 您不了解集合和SQL

  • 有了更多信息(SQL和逻辑),我们可以帮助您更多…

    您知道,这取决于上下文

    不过,学习是有帮助的。例如SQL。您处于较低的级别,无法看到此处可能的真正优化。SQL不仅仅是更新、插入和简单的Select语句

    1) 循环记录并逐个执行更新的游标

    线性逐步处理。无法并行化,因为SQL本身没有可供用户使用的线程机制;优化是一个接一个的,即查询优化器一次只查看一条语句中的项

    2) 创建一个包含30000 update命令的脚本

    假设脚本是外部的,它可以分割工作并在多个连接上并发运行,即运行多个并行

    但还有更多:

    • 制作一个计算新值的脚本
    • 使用buld copy API将它们大容量导入到临时表中
    • 发出一个更新语句,将更新后的值从临时表转移到最终表
    也许有一个脚本可以为多次更新发出合并语句?如果您对SQL api的了解超过了“更新、打开游标、简单选择”,那么会有很多变化

    我这样做了——尽管有更多的数据(50000个批次,有时是4-6个批次)。问题在于sql大容量复制有一些开销。但我以这种方式每秒管理75.000次插入


    很大程度上取决于业务问题和逻辑的复杂性——如果是简单的更新,那么问题是:计算的还是外部驱动的?多值乘2=计算,更新地址=数据驱动(即,您需要来自某处的新数据)。

    3)一个脚本,它在整个集合上执行所有更新,而不是30000次更新(无论是脚本还是通过光标)@gbn一些简单的数学。这是一个民主国家。50%的人智力低于平均水平。任何感到被侮辱的人——他属于他们,因为这是高斯分布中平均值的定义。但这意味着任何智能安塞尔已经有50%的人无法理解它。