PostgreSQL认为没有索引,当有

时间:2017-10-25 13:33:37

标签: sql database postgresql

我们的制作中有一个大的PostgreSQL。最近,我们发现我们的查询变得极其缓慢。所以我们检查了它,所有这些都归结为检查样本表的索引。所以我们运行以下查询来检查是否有任何索引:

select * from pg_indexes where tablename = 'DriverHourlyOnlineHoursNew'

我们没有得到此查询的结果,这意味着我们的示例表上没有索引。这有点奇怪,因为我们几乎可以肯定我们在这个表中的两列上有一个btree索引。

所以我们尝试将该索引添加到表中。我们运行了以下查询:

create index "DriverHourlyOnlineHoursNew_driverId_date" on "DriverHourlyOnlineHoursNew" using btree("driverId",date);

令人惊讶的是我们收到以下错误:

ERROR:  relation "DriverHourlyOnlineHoursNew_driverId_date" already exists

事实证明索引确实存在,但PostgreSQL认为它没有!

我想知道是否有人知道这个问题是什么以及如何解决它?

由于

- 更新:在pg_indexes视图上运行的第一个查询会随机响应!这意味着有时它会返回一个空结果集,有时它会返回正确的结果。 我应该补充一点,证明这不是一个命名问题,运行第一个查询不会返回任何结果,而PostgreSQL在主键列上创建一个默认索引,因此返回没有结果意味着pg_indexes视图有问题。

2 个答案:

答案 0 :(得分:1)

你刚刚尝试做过这样的事情:

DROP INDEX DriverHourlyOnlineHoursNew_driverId_date;

然后再次创建它:

CREATE INDEX on DriverHourlyOnlineHoursNew (driverId, date);

你应该有一个pg_ *表损坏。 您是否经常对您的数据库进行VACUUM?

否则你可以做的只是:

SELECT * INTO TEMP tmp_DriverHourlyOnlineHoursNew FROM DriverHourlyOnlineHoursNew;

DROP TABLE DriverHourlyOnlineHoursNew;

SELECT * INTO DriverHourlyOnlineHoursNew FROM tmp_DriverHourlyOnlineHoursNew;

CREATE INDEX on DriverHourlyOnlineHoursNew (driverId, date);

你应该恢复一个正常的表格"。

不要犹豫定期:

VACUUM ANALYZE;

这不会阻止和清理您的数据库。

答案 1 :(得分:0)

检查pg_class,或第一次

select * from pg_indexes where indexname = 'DriverHourlyOnlineHoursNew_driverId_date' 

“关系存在” - 并不是表“riverHourlyOnlineHoursNew”上的索引,例如:

t=# create table a();
CREATE TABLE
t=# create table a1(i int);
CREATE TABLE
t=# create index a on a1(i);
ERROR:  relation "a" already exists