У меня возникла проблема с результатом запроса. Результат был не таким же, как в живой среде, так и в тестовой среде.Top 1 без заказа
Таблица A
id, name
1,ValueA1
Таблица B
Id, name
1,ValueB1
2,ValueB2
3,ValueB3
4,ValueB4
На тестовой среде результат был ValueB1, на живом окружении был ValueB2
После быстрого исследования я обнаружил, что проблема заключается в том, что процедура использовала top 1
без согласования. Хорошо, всем ясно, что если у нас есть соединение, мы должны добавить пункт заказа, если мы используем top 1.
Но я попытался объяснить проблему не техническому человеку.
Итак, я написал простой цикл с 1 000 000 итераций. Внутри I четкие планы выполнения:
DBCC FREEPROCCACHE
и
sp_recompile 'ProcedureName'
и следующая я порядок выполнения.
К сожалению, результат всегда был таким же. В обеих средах. (по тесту: ValueB1, on live: ValueB2)
Я попытался изменить процедуру вызова, чтобы просто скопировать содержимое процедуры. Результаты все еще точно такие же, как в предыдущем случае.
Я попытался написать очень простой запрос на соединение с вершиной 1 без заказа. результат был таким же на обоих серверах: ValueB1 во всех итерациях 1M.
Процедура db довольно сложна, она использует CTE, и она несколько раз присоединяется к таблице B.
Я очень расстроен тем, что мне не удалось показать проблему нетехническому человеку.
Может ли кто-нибудь объяснить, что я сделал не так, или как это должно было быть сделано?
Что вы можете задать здесь? Почему вы не получаете одинаковый ответ во всех средах? –
Проблема может заключаться в том, что вы используете разные базы данных в тестовой среде и рабочей среде. Если я прав, порядок данных (без какой-либо сортировки, то есть в физических файлах) должен быть разным в тестовой и производственной среде. –
Заказ данных никогда не гарантируется без 'ORDER BY'. Период –