Informix SQL查询:两个类似的查询返回不同的结果

bea 发布于 2018-05-24 database 最后更新 2018-05-24 09:01 91 浏览

我有一个返回一组行的Informix SQL查询。对于我们一直在努力的网站的新版本,它进行了一些修改,我们的QA发现新版本返回不同的结果。经过调查,我们发现两个查询之间的唯一区别在于返回的字段数量。 FROM,WHERE和ORDER BY子句是相同的,SELECT部分​​中的列名不影响结果。这只是导致问题的领域数量。 有任何想法吗?

已邀请:

bea

赞同来自:

添加--+ ORDERED连接顺序指令可以让您每次都能以可预测的顺序获得结果,从而解决了问题。 链接指向指令如何工作的描述 http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls1144.htm

Use the ORDERED join-order directive to force the optimizer to join tables or views in the order in which they appear in the FROM clause of the query.
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;

bea

赞同来自:

Informix SQL引擎根据我们想要检索的列使用表上的索引。当检索不同的列时,我们使用不同的索引,因此以不同的顺序获得结果。

gnihil

赞同来自:

我认为'字段'是指输出数据的行数?根据我的经验,人们使用“字段”和“列”作为同义词。鉴于选择列表中的名称没有改变,你可能只会得到返回行数的差异。 给定相同的表,输入数据和查询,无论查询计划或服务器版本如何,结果集的大小和内容都应该相同。除非您对结果强加一个顺序,否则结果集的顺序可能会不同,但在任何DBMS中都是合法的。 如果您获得不同大小的结果集,则应该联系IBM技术支持。至少有一个结果集是错误的,错误的结果总是严重的。 尽管提示可能有助于提高性能,并且'运行更新统计信息(具有适当的选项集)'的标准建议通常有帮助,但是当底层数据稳定时,索引的存在与否都不应改变结果集。 (如果数据发生变化,需要考虑各种问题和复杂情况。)

ket

赞同来自:

我能想到的只有两个解释:

  1. 正在使用聚合函数,如COUNT(DISTINCT列)或
  2. 所选的附加列来自OUTER加入的表
我知道你不希望发布SQL和表定义,但这确实很难诊断。