使用 NHibernate 的 sql 查询中的空格是否重要?

Does whitespace matter in sql queries using NHibernate?

在使用 NHibernate 的 C# 项目中进行一个相当典型的 SQL 插入查询和参数;可能是这样写的:

Session
    .CreateSQLQuery(
        @"INSERT INTO my_table(COL_A, COL_B, ..., 
                               ..., COL_M, COL_N)
                      VALUES (:VAL_A, :VAL_B, ....,
                             ..., :VAL_M, :VAL_N)")
    .SetParameter("VAL_A", "input for A")
    .SetParameter("VAL_B", "input for B")
    (...)
    .SetParameter("VAL_N", "input for N")
    .ExecuteUpdate();

这对我来说感觉组织得很好并且易于阅读,我喜欢这一点,但我对查询本身包含的空白感到好奇。我们可以通过编写以下内容的一些变体来删除它,我在几个案例中看到过这种情况。这需要更多的努力来编写,并且可能会影响可读性:

Session
    .CreateSQLQuery(
        @"INSERT INTO my_table(COL_A, COL_B, ..., " + 
        @" COL_M, COL_N)" + 
        @" VALUES (:VAL_A, :VAL_B, ....," + 
        @" :VAL_M, :VAL_N)")
    .SetParameter(...)

那么我的问题是,做这样的事情是否有任何意义?

我依稀记得几年前听说过这件事;我们应该限制空白数量的想法,因为它可能会影响查询的性能。我的直觉是这个(如果有的话)的影响可以忽略不计,而且不值得付出代价,但是获得更多的洞察力会很有趣。

没有。 SQL 语句在 运行 之前被有效地“编译”,并且空格对结果没有明显影响,除非缺少空格会导致语法错误

改白space不直接影响OracleSQL性能,但可以通过避开SQL性能特点间接影响性能。但是,即使这个查询由于添加 space 而受到影响的原因很奇怪,一般来说你也不应该停止格式化你的 SQL.

某些 SQL 优化功能,如 SQL 配置文件和大纲,基于 SQL 语句文本的 MD5 散列。对语句的任何更改,甚至添加或删除 space,都会生成不同的散列。如果 DBA 或调优顾问任务创建了一个 SQL 配置文件来提高语句的性能,那么在对查询进行任何微不足道的更改后,该配置文件将不再起作用。

SQL 重新优化会出现相关问题。优化器从错误中吸取教训,可以在语句 运行s 第二次或第三次更改执行计划。极少数情况下,优化器会吸取错误的教训,SQL 语句在第二次或第三次执行时会变慢。在这种情况下,添加或删除 space 将使查询 运行 更快 - 至少在最初是这样。

这些幕后优化是无需更改查询即可提高查询性能的强大工具。不幸的是,他们也倾向于创造货物崇拜编程神话;有人做了一个微不足道的改变,性能提高了,他们认为他们偶然发现了一个神秘的性能秘密。这可能就是整个“使用 count(1) 而不是 count(*)”的废话开始的原因。

继续使用您需要的所有空白space 来正确设置您的查询格式。如果您 运行 遇到了一个真实的、可衡量的问题,请比较执行计划以查看更改的内容和原因。如果同事坚持将 whitespace 作为一般规则删除,请要求他们提供可重现的测试用例来证明他们的主张。