我有一个返回一组行的 Informix SQL 查询。它针对我们一直在开发的新版本网站进行了轻微修改,我们的 QA 注意到新版本返回不同的结果。经过调查,我们发现两个查询之间的唯一区别在于返回的字段数量。
FROM、WHERE 和 ORDER BY 子句是相同的,SELECT 部分中的列名不影响结果。只是导致问题的字段数量。
有任何想法吗?
添加--+ ORDERED
join-order 指令通过允许您每次都以可预测的顺序获得结果来解决问题。
链接指向指令如何工作的描述 http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls1144.htm
使用 ORDERED 连接顺序指令强制优化器按照它们在查询的 FROM 子句中出现的顺序连接表或视图。
SELECT --+ ORDERED
name, title, salary, dname
FROM dept, job, emp WHERE title = 'clerk' AND loc = 'Palo Alto'
AND emp.dno = dept.dno
AND emp.job= job.job;
Informix SQL 引擎根据我们要检索的列使用表上的索引。在检索不同的列时,我们使用不同的索引,因此以不同的顺序获得结果。
我认为“字段”是指输出数据的行数?根据我的经验,人们使用“字段”和“列”作为同义词。鉴于选择列表中的名称没有更改,您可能只是在返回的行数上有所不同。
给定相同的表、输入数据和查询,无论查询计划或服务器版本如何,结果集的大小和内容都应该相同。结果集的顺序可能不同,除非您对结果施加顺序,但这在任何 DBMS 中都是合法的。
如果您获得不同大小的结果集,您可能应该联系 IBM 技术支持。至少有一个结果集是错误的,错误的结果总是很严重的。
尽管提示可能有助于提高性能,并且“运行 UPDATE STATISTICS(使用适当的选项集)”的标准建议通常会有所帮助,但是当基础数据稳定时,无论是否存在索引都不应改变结果集。(如果数据正在发生变化,则需要担心各种问题和并发症。)
我只能想到两种解释:
我了解您不希望发布 SQL 和表定义,但这确实使诊断变得困难。