Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 我们能提高计数、区分和相似查询的性能吗?_Performance_Postgresql_Count_Distinct_Sql Like - Fatal编程技术网

Performance 我们能提高计数、区分和相似查询的性能吗?

Performance 我们能提高计数、区分和相似查询的性能吗?,performance,postgresql,count,distinct,sql-like,Performance,Postgresql,Count,Distinct,Sql Like,据我所知,当我们使用COUNT、DISTINCT或LIKE%query%(两侧的通配符)关键字运行SQL查询时,索引无法使用,数据库必须进行完整的表扫描 有什么方法可以提高这些查询的性能吗 他们真的不能使用索引吗?或者我们可以通过某种方式解决这个问题 如果只需要返回一列,是否可以进行仅索引扫描?例如:从MY_表中选择count(id):在这种情况下,如果我们在“id”上有索引,我们可能可以只进行索引扫描,避免命中整个表 我的问题具有一般意义:如果我们必须使用上述操作符,您能给我一些性能指南吗 更

据我所知,当我们使用
COUNT
DISTINCT
LIKE%query%
(两侧的通配符)关键字运行SQL查询时,索引无法使用,数据库必须进行完整的表扫描

有什么方法可以提高这些查询的性能吗

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

如果只需要返回一列,是否可以进行仅索引扫描?例如:
从MY_表中选择count(id)
:在这种情况下,如果我们在“id”上有索引,我们可能可以只进行索引扫描,避免命中整个表

我的问题具有一般意义:如果我们必须使用上述操作符,您能给我一些性能指南吗

更新
至于我,我使用PostgreSQL。

使用PostgreSQL,您可以为文本字符串创建GIN pg_trgm索引,以加快“%foo%”之类的速度,尽管这需要加载项和PostgreSQL 9.1或更高版本

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


由于mvcc规则,count(*)永远无法使用索引。但是,您可以通过查看适当的系统目录获得近似结果。

什么是RDBMS?SQL Server将在
id
(如果可用)上使用更窄的索引,以便
从MY_表中选择计数(id)
,即使没有任何条件,a
也会从t中选择不同的a、b
会在
(a,b)
(b,a)
上使用索引,这只是一个例子。如果索引与select中的索引匹配,则应使用该索引。当然,除非(这里加上一百个例外,比如):这个表太小了吗?什么数据类型是
列名称
?哪个Postgres版本?Postgres可以为
使用索引,如“%foo%”
@MikeChristensen:使用特殊索引: