我们的制作中有一个大的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视图有问题。
答案 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