代码之家  ›  专栏  ›  技术社区  ›  SlackerCoder

SQL(服务器)更新性能

  •  2
  • SlackerCoder  · 技术社区  · 16 年前

    我有限的SQL知识促成了这篇文章!


    有6条update语句,它们很可能被分解成一条大型update语句,但我不知道这对性能意味着什么。

    表基础: 6张桌子被击中。其中3个永远不会有超过5000条记录,其中3条记录会无限期增长(目前约有100-200万条记录,正确索引,等等)。连接所有表并执行一个大规模更新语句与将其保留为6个单独的更新相比,是否有速度优势?

    我在寻找最有效的方法来做这件事,即使它能缩短一秒钟。

    谢谢

    编辑:

    6 回复  |  直到 16 年前
        1
  •  4
  •   Cade Roux    16 年前

    这在t-SQL中甚至是不可能的(在一个UPDATE语句中同时更新多个表)。

    BOL :

    表名称

    要更新的表的名称。 如果表不在列表中,则为name 由当前用户拥有。

    视图名称

    视图名称引用的视图必须为 可更新。由 UPDATE语句不能影响 多个基表 在的FROM子句中引用 看法

        2
  •  4
  •   BradC    16 年前

    UPDATE mytable
    SET foo = bar, fizz = buzz, whiz = bang
    WHERE zing > 2081
    

    而不是

    UPDATE mytable SET foo = bar   WHERE zing > 2081
    UPDATE mytable SET fizz = buzz WHERE zing > 2081
    UPDATE mytable SET whiz = bang WHERE zing > 2081
    

    这几乎是效率的3倍,因为它只需要在表中遍历一次。

    可能的

    即使使用复杂联接,一次也只能更新一个表。比如:

    UPDATE AccountHistory
    SET LastPurchaseDate = i.PurchaseDate
    FROM Account a
    INNER JOIN AccountHistory h ON a.AccountID = h.AccountID
    INNER JOIN Invoices i ON i.AccountID = a.AccountID
    WHERE i.PurchaseDate > '2009-11-30'
    

    此处仅更改AccountHistory,即使源数据是通过联接访问的。

        3
  •  1
  •   Dani    16 年前

    我认为6个更新(如果需要,在一个事务中)比1个大的更新更容易理解-因此这是一个更好的解决方案,并且您可以优化每个更新以尽可能快。

    JRud评论很好-您可以尝试两种方法并比较时间。

        4
  •  1
  •   mjv    16 年前

    当查询来自[远程]客户端时 . 在您的情况下,多个查询来自一个存储过程,因此很容易成为本地请求,而将它们组合起来的好处根本不重要。

    此外,在检查SQL文档时, 在更新的情况下,不可能编写一个一次修改多个表的查询 ...

    最有效的 这样,, 你需要尝试各种可能性 (在一组具有代表性的数据输入下)查看特定变化的影响。由于缺乏关于你具体情况的更多细节,很难提供更有针对性的信息。

    一个小而通用的提示:
    在“大”表中提到“正确索引”提醒我们,当涉及到更新(以及更普遍的写操作,如删除和插入)时,索引可能比资产更像是一种负债,从性能角度来看。

        5
  •  0
  •   Charles Bretana    16 年前

    对于几乎所有的现代数据库包,还有许多其他技术可供您使用,它们可以在不改变基本表模式的情况下提高性能。您可以根据应用程序使用的查询类型添加自定义索引。在其他技术中,您可以添加索引视图(Oracle中的物化视图)。可以对表进行垂直和/或水平分区。在SQLServe中,您可以“固定”小表,以便它们始终保留在内存中。

        6
  •  0
  •   Darryl Peterson    16 年前

    如果我更担心并发性(减少锁定时间)而不是总体性能,我将把键值选择到变量或临时表中。然后,我在更新中使用变量或临时表。“焦点”可以显著提高更新性能。

    注意:使用这种方法需要很好地理解系统的工作方式。这种方法的最大风险在于增加死锁的可能性。