【问题标题】:MSSQL/Oracle Query Tuning 500,000+ records Coldfusion - does lower() reduce performanceMSSQL/Oracle 查询调优 500,000+ 条记录 Coldfusion - 降低()降低性能
【发布时间】:2011-07-30 01:04:45
【问题描述】:

我并不是要就总体而言哪个更好进行辩论,我是专门针对这个问题提出的。 :)

我需要编写一个查询来从包含 500k+ 条记录的数据库中提取用户 ID (uid) 列表。我只返回一个字段,uid。我可以查询我们的 Oracle 机器或我们的 MSSQL 2000 机器。查询看起来像这样(这还没有被简化)

select uid
from employeeRec
where uid = 'abc123'

是的,这确实是一个简单的查询。我需要调整帮助的地方是 uid 已编入索引,并且某些 uid 可能是(不是很多,而是一些)“ABC123”或“abc123”。 MSSQL 不关心大小写敏感,而 Oracle 关心。所以对于 Oracle,我的查询应该是这样的:

select uid
from employeeRec
where lower(uid) = 'abc123'

我了解到,如果您在 MSSQL 中的索引字段上使用 lower,则会使索引无用(有一些方法可以解决它,但这超出了我在这里的问题范围 - 因为如果我选择 MSSQL,我不会'根本不需要使用lower)。我想知道如果我选择 Oracle 并使用 lower() 函数,那也会损害查询的性能吗?

除了正在运行的其他一些查询之外,我循环这个查询大约 200 次,并且处理整个循环每次迭代需要 1 秒,我已经缩小了这个特定查询的速度。对于一个网页来说,200 秒似乎是永恒的。对于您的 CF 读者,超时值已增加,因此页面不会出错,也没有页面错误,我只是想加快查询速度。

需要注意的另一点:此数据库与正在运行的其他查询位于不同的城市,因此我确实预计会有一些滞后时间。

【问题讨论】:

  • 谢谢。到目前为止,所有答案都与我阅读的内容一致。我只是想用简单的英语确认一下,因为我读过的一些博客有点过头了。我也将每个人的答案都提高了一分。

标签: sql-server oracle coldfusion performance


【解决方案1】:

正如 TomTom 所说,Oracle 根本不会使用您的索引。但是,您可以创建一个基于函数的索引,,这个新索引将在您发出查询时使用。

create index my_new_ix on employeeRec(lower(uid));

【讨论】:

    【解决方案2】:

    在函数调用中包装索引列可能会导致 Oracle 出现性能问题。 Oracle 无法在UID 上使用普通索引来处理您的查询。另一方面,您可以在 lower(uid) 上创建一个基于函数的索引,供查询使用,即

    CREATE INDEX case_insensitive_idx
        ON employeeRec( lower( uid ) );
    

    请注意,如果您想进行一般的不区分大小写的查询,最好使用setting NLS parameters 强制不区分大小写。您仍然需要在要搜索的列上使用基于函数的索引,但它可以稍微简化您的查询。

    【讨论】:

      【解决方案3】:

      我想知道我是否选择 Oracle, 并使用 lower() 函数,将 这也损害了性能 查询?

      是的。性能下降是因为索引在原始值上并且排序规则区分大小写,因此必须通过函数运行所有可能的值以过滤掉匹配的值。

      【讨论】:

      • 从这个特定查询的性能角度来看,您认为编写查询where uid = 'abc123' or where uid = 'ABC123' 会更好吗?
      • 可能是的。请注意,这规则我们的组合 (AbC123)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多