添加像“%%”这样的 where 子句会导致性能问题吗?
Adding a where clause like '%%' cause any performance issues?
我正在编写一个查询,它将通过我的程序在数据库上执行。在该查询中,我添加了一个 where
子句,其中包含我从客户端发送的值。在某些值不存在的情况下,我将其留空(即它看起来像 select * from tablename where columname like '%%' and columname1 like '%%'
)。这会导致任何性能问题吗?
回答此类问题的最佳方法是通过测试。您应该在有条件和没有条件的情况下尝试查询。
向 where
子句添加条件至少可以通过三种方式影响性能:
- 条件会使优化器更难为查询使用索引(或选择适当的分区)。
- 条件可以更改 "selectivity" 的 table。如果优化器不知道被选择的行数,那么它可能会选择一个效率较低的连接和聚合算法。
- 评估条件本身可能很昂贵。
如果您的查询很简单:
select t.*
from t
where col like '%%';
那么前两点不相关。第三个有点相关。问题是数据库是否 "optimizes" 远离了 like
(因为模式是通用的)。我不这么认为;它必须用 col is not null
.
替换它
使用 like
会产生一些开销。我推测 like
的开销比首先读取 table 的开销小得多。所以,虽然它可能会影响性能,但在简单的情况下,影响会比较小。
我正在编写一个查询,它将通过我的程序在数据库上执行。在该查询中,我添加了一个 where
子句,其中包含我从客户端发送的值。在某些值不存在的情况下,我将其留空(即它看起来像 select * from tablename where columname like '%%' and columname1 like '%%'
)。这会导致任何性能问题吗?
回答此类问题的最佳方法是通过测试。您应该在有条件和没有条件的情况下尝试查询。
向 where
子句添加条件至少可以通过三种方式影响性能:
- 条件会使优化器更难为查询使用索引(或选择适当的分区)。
- 条件可以更改 "selectivity" 的 table。如果优化器不知道被选择的行数,那么它可能会选择一个效率较低的连接和聚合算法。
- 评估条件本身可能很昂贵。
如果您的查询很简单:
select t.*
from t
where col like '%%';
那么前两点不相关。第三个有点相关。问题是数据库是否 "optimizes" 远离了 like
(因为模式是通用的)。我不这么认为;它必须用 col is not null
.
使用 like
会产生一些开销。我推测 like
的开销比首先读取 table 的开销小得多。所以,虽然它可能会影响性能,但在简单的情况下,影响会比较小。