【问题标题】:SQL INSERT performance omitting field names?SQL INSERT 性能省略字段名称?
【发布时间】:2010-03-24 18:20:53
【问题描述】:

有谁知道从 INSERT 查询中删除字段名称是否会提高性能?

我的意思是:

INSERT INTO table1 VALUES (value1, value2, ...)

比这样做更快地完成 DB:

INSERT INTO table1 (field1, field2, ...) VALUES (value1, value2, ...)

?

我知道这可能是一个毫无意义的性能差异,但只是想知道。

我通常使用 MySQL 和 PostgreSQL 作为 DB。

【问题讨论】:

    标签: sql performance


    【解决方案1】:

    不,实际上恰恰相反!至少对于 Microsoft SQL Server - 你没有指定你在谈论什么数据库.....

    如果您没有在 SELECT 或 INSERT 中指定字段,则 SQL Server 的查询处理器必须首先检查系统目录以找出哪些字段确实可用。

    所以我总是建议明确列出您想要的字段 - 在 SELECT 上和在 INSERT 上一样多。

    【讨论】:

    • +1 我原则上同意,但想知道 - 它是否必须在后一种情况下查询模式以获取列定义/默认值?
    • +1 如果不指定列名,那么对于具有 10 列的插入查询来说,可读性也会非常糟糕。
    • +1,但不要忘记列出列会在添加新列时防止旧代码中断。
    • 当某些傻瓜决定重新排列列顺序时,它还可以防止您破坏代码。始终在所有语句中指定要在生产环境中运行的字段。
    • @Marco: 是的,完全正确-SELECT * 可以在您查看内容时在 SSMS 中进行快速的即席 SQL 查询-但您真的不应该在任何地方的生产代码;也不例外。
    【解决方案2】:

    不,它并没有更快。数据库必须检查表中的字段并与值匹配。

    您应该始终在查询中指定字段以使代码更加健壮。如果有人更改了表中字段的顺序,如果您没有指定字段,它就会停止工作(或者更糟的是,将数据写入错误的字段中)。

    【讨论】:

      【解决方案3】:

      我不知道通过省略字段名称可以提高任何性能,但我建议不要将它用于测试/仅插入一次之外的任何内容。

      可读性会受到影响(您必须检查表以查看插入的内容),并且如果表架构发生更改,您的代码将中断

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 2022-01-16
        • 2017-10-28
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2019-10-19
        相关资源
        最近更新 更多