SQL-запрос Informix: два похожих запроса, возвращающие разные результаты - PullRequest
1 голос
/ 20 ноября 2008

У меня есть запрос Informix SQL, который возвращает набор строк. Он был немного изменен для новой версии сайта, над которым мы работали, и наш QA заметил, что новая версия возвращает разные результаты. После исследования мы обнаружили, что единственное различие между двумя запросами заключалось в количестве возвращаемых полей.

Предложения FROM, WHERE и ORDER BY идентичны, а имена столбцов в части SELECT не влияют на результаты. Только количество полей вызвало проблему.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 20 ноября 2008

Добавление --+ ORDERED директивы порядка соединения решает проблему, позволяя вам каждый раз получать результаты в предсказуемом порядке.

Ссылки ведут на описание того, как работает директива 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;
1 голос
/ 20 ноября 2008

Движок Informix SQL использует индексы в таблицах на основе столбцов, которые мы хотим получить. При получении разных столбцов мы использовали разные индексы и, следовательно, получали результаты в другом порядке.

0 голосов
/ 25 ноября 2008

Я могу придумать только два объяснения этому:

  1. Используется агрегатная функция, такая как COUNT (столбец DISTINCT) или
  2. Дополнительные столбцы, выбранные из таблицы, к которой добавлено ВНЕШНЕЕ

Я понимаю, что вы не хотите публиковать определения SQL и таблицы, но это затрудняет диагностику.

0 голосов
/ 22 ноября 2008

Я так понимаю, что под «полями» вы подразумеваете количество строк выходных данных? По моему опыту, люди используют «поля» и «столбцы» в качестве синонимов. Учитывая, что имена в списке выбора не изменились, вы, вероятно, получали только различия в количестве возвращаемых строк.

При одинаковых таблицах, входных данных и запросе размер и содержание набора результатов должны быть одинаковыми, независимо от плана запроса или версии сервера. Последовательность набора результатов может отличаться, если только вы не наложите порядок на результаты, но это допустимо в любой СУБД.

Если вы получаете наборы результатов разных размеров, вам, вероятно, следует обратиться в службу технической поддержки IBM. По крайней мере один из наборов результатов неверен, а неправильные результаты всегда серьезны.

Хотя подсказки могут помочь производительности, и обычно помогает стандартная рекомендация «запустить UPDATE STATISTICS (с соответствующими наборами параметров)», ни наличие, ни отсутствие индексов не должны изменять результирующий набор, когда базовые данные стабильны. (Если данные меняются, возникает множество вопросов и сложностей, о которых следует беспокоиться.)

...