【问题标题】:Trying to improve this query试图改进这个查询
【发布时间】:2012-03-27 15:27:54
【问题描述】:

我正在尝试提高此查询的性能。我可以做些什么来优化它?

SELECT * FROM bldng 
WHERE bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500

【问题讨论】:

  • 如果您不需要每一列,您可以将 * 替换为您确实需要的列列表。
  • 您可以做的事情很少不依赖于数据。您的查询取决于检查bldng.bldng_type 中每个值的全部内容;如果bldng 很大,那会很慢。相反,您应该考虑改进您的表设计,以便不需要这种查询。
  • bldng_type 列中的完整字符串列表有多长?

标签: sql database select query-optimization


【解决方案1】:

由于您使用的是 '%search string%' 两端的两个百分号会破坏这些列上的索引。最好使用全文索引。如果您想要真正的性能和准确性,您可以使用 Lucene 或 Sphinx 全文搜索引擎。

【讨论】:

  • 正是我要说的。我还要指出,很多人在不需要时使用这种结构,如果你真的不需要第一个字符是通配符,那就去掉它。如果 OP 正在使用 SQL Server 也有它自己的全文搜索。
  • 好的,那么 CASE 语句也有帮助吗?我在考虑这个......但不确定它是否会更有效
  • 我认为您不能从数据库中调用 lucene 或 sphinx 函数。但这是一个有趣的概念。
【解决方案2】:

您似乎正在尝试选择不同类别的建筑物。我建议在 bldng 表上放置一个“bldng_category”列。这样你就可以使用这样的简单查询:

从建筑中选择 * WHERE bldng_category in ('PTR', 'FACILITY_B', 'FACILITY-B') AND area_sqf > 500

【讨论】:

    【解决方案3】:

    由于通配符前缀,您将对bldng 进行全面扫描。如果您可以删除通配符前缀,并在bldng_type 上添加索引,您的性能应该会大大提高。拥有%text% 很慢

    【讨论】:

      【解决方案4】:

      如果您使用的是 SQL Server,则可以使用 Table Hints (MSDN link)。 NOLOCK 很常见。

      【讨论】:

        【解决方案5】:

        索引area_sqf 并仅指定您需要的列而不是使用* 可能会有所帮助。

        【讨论】:

          猜你喜欢
          • 2013-07-21
          • 2019-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          • 2022-07-01
          相关资源
          最近更新 更多