【问题标题】:Query optimization - VARCHAR equality vs Numeric equality查询优化 - VARCHAR 相等与数值相等
【发布时间】:2011-03-27 03:27:59
【问题描述】:

我有一个包含大约 40 列和数亿行的大型 SQL Server 数据库。

这个表在模式中应该是松散的,所以我有很多列作为 VARCHAR(MAX),即使它可能是 BIGINT、DATETIME、INT 等。这对查询时间/效率有影响吗?例如会

SELECT TOP 100 * FROM CustomerId = 34343

快于

SELECT TOP 100 * FROM CustomerId = '34343'

?如果是,快多少?

如果我使用 VARCHAR(MAX) 而不是固定长度的 VARCHAR.. 那么在这方面其他数据库如 mySQL 等呢?

【问题讨论】:

  • 一想到表在架构中应该是松散的,我就不寒而栗。这是一个巨大比例的错误。灵活性 - 性能 - 选择一个。我保证您的用户需要的性能不仅仅是灵活的架构。为不属于系统设计主要部分的罕见情况保留灵活性。对数字使用 varchar 已经够糟糕了,这意味着您必须将它们转换回数字才能进行任何报告计算(并且几乎可以保证数据完整性不好),但使用 varchar 作为日期更糟糕。除非您喜欢尝试解释如何处理 02/30/2010。
  • 您并没有说您使用的是 EAV 表,但这篇文章可能会向您指出为什么松散模式是一个糟糕的设计 - 您将不得不在某个时候取回数据并查询这个混乱:@ 987654321@
  • 实际上我们有时会收到垃圾数据,我们甚至需要记录这些数据。因此,如果我将 customerId 作为数字,我们可能会得到 customerID = 568d4 不会被记录。我们正在尝试找出一些东西

标签: sql database-design optimization performance


【解决方案1】:

是的,比较字符串通常比比较纯数字要慢。是否可测量取决于查询执行引擎如何进行比较。如果查询引擎没有与字符串的结尾进行比较——它通常不会,那么你的惩罚不会很大。试试看。但从理论上讲,数字量的数值比较会更好。

【讨论】:

  • 好的...如果有人有一些来源,我希望能得到一些关于效果的定量报告。谢谢!~
【解决方案2】:

是的,使用 INT 与 VARCHAR(MAX) 进行比较肯定会带来性能优势。如果不实际测量,真的很难说多少。

另外 - 没有理由不使用 VARCHAR(MAX) - 但只有在需要且有意义时才使用!

见:

出于某些充分的理由,您不应该只制作所有内容 VARCHAR(MAX) - 只是因为您可以....

【讨论】:

    【解决方案3】:

    如果我改用 VARCHAR(MAX) 会怎样 固定长度的VARCHAR ..还有什么 关于其他数据库,如 mySQL 等 这方面?

    • PostgreSQL 将VARCHAR(n) 视为TEXT CHECK(LENGTH(Column) <= n)。指定最大长度并没有性能优势。
    • SQLite 完全忽略了VARCHAR 列的长度限制。
    • 但是,MS SQL Server 不允许在 VARCHAR(MAX) 列上创建索引,这会降低性能。

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 2020-02-02
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多