2013-10-03 21 views
0

我对某个特定查询的结果有疑问。索引或autovacuum是否改变查询结果的行为?

SELECT final_copy,NUM_CHARS FROM表1 T1,T2表2

WHERE t1.numid = t2.id

获取与此查询两行,

final_copy | NUM_CHARS

------------ + -----------------

 1 | 1272 
     | 1075 

这里final_copy 1是最新的记录插入。此查询在循环中运行,并始终以第一行中的final_copy作为1返回记录。正如你所看到的,查询不是使用任何'order by'命令。

但现在查询结果变得不一致,即行不会基于上次插入日期返回。

我的疑问是,真空或重新索引时,有没有更改查询结果的行为的机会。上周我做了这些表格的重新编排和真空处理。这会改变结果的行为吗?

我的数据库是postgresql版本7.4.3。

+1

你应该真的升级那个db ... 7.4.3已经接近十年(06/2004),并且不再维护了。最新版本是9.3。最老的仍然是8.4.17。 –

+0

感谢您的建议,现在我们正在将db升级到9.2版。 – RunningAdithya

回答

2

缺少order by子句会根据sql规格产生未定义的顺序。如果您想按顺序插入它们,您需要指定顺序(如果需要,可能使用额外的列)。

(从技术上讲,您看到的顺序是查询计划在物理上读取的行,这意味着订单受制于mvcc的内部美食以及您最终使用的特定计划,表统计和你加入的两张表)。

+0

自动清理或重建索引是否有可能影响结果的行为? – RunningAdithya

+1

是的 - 它会按照它们的物理读取和/或返回顺序生成行,具体取决于最终查询的内容,因此触及物理表或其内容的任何内容都会影响排序。但是,再次,你应该**不**设计你的查询周围。只有***才意味着确保SQL中的一致顺序是指定一个明确的'order by'子句。 –

+0

感谢info @ Denis – RunningAdithya