我们可以提高COUNT,DISTINCT和LIKE查询的性能吗?

时间:2013-04-04 16:32:17

标签: performance postgresql count distinct sql-like

据我所知,当我们使用COUNTDISTINCTLIKE %query%(两侧的通配符)关键字运行SQL查询时,索引无法使用,数据库必须执行全表扫描。

是否有某种方法可以提升这些查询的效果?

他们真的不能使用索引,或者我们可以以某种方式解决这个问题吗?

如果我们只需要返回一列,我们可以进行仅索引扫描吗?例如:select count(id) from MY_TABLE:在这种情况下,如果我们在“id”上有索引,我们可以进行仅索引扫描并避免命中整个表吗?

我的问题有一般意义:如果我们必须使用上面提到的运算符,你能给我一些性能指南吗?

UPDATE 至于我,我使用PostgreSQL。

1 个答案:

答案 0 :(得分:0)

使用PostgreSQL,您可以为文本字符串创建GIN pg_trgm索引,以使LIKE'%foo%'更快,但这需要插件和PostgreSQL 9.1或更高版本。

我怀疑它本身会不会使用索引。我实际上尝试过并且无法使用它。您可以通过使用递归CTE来拉出单个记录(可以称为“稀疏扫描”)来强制使用索引。当从会计记录中抽出个别年份时,我们会做这样的事情。这需要编写特殊查询,因此不是一般情况。

由于mvcc规则,

count(*)永远不能使用索引。但是,您可以通过查看相应的系统目录来获得近似结果。