2015-08-05 4 views
1

У меня возникла проблема с результатом запроса. Результат был не таким же, как в живой среде, так и в тестовой среде.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.

Я очень расстроен тем, что мне не удалось показать проблему нетехническому человеку.

Может ли кто-нибудь объяснить, что я сделал не так, или как это должно было быть сделано?

+1

Что вы можете задать здесь? Почему вы не получаете одинаковый ответ во всех средах? –

+0

Проблема может заключаться в том, что вы используете разные базы данных в тестовой среде и рабочей среде. Если я прав, порядок данных (без какой-либо сортировки, то есть в физических файлах) должен быть разным в тестовой и производственной среде. –

+4

Заказ данных никогда не гарантируется без 'ORDER BY'. Период –

ответ

0

Вы не можете.

Если вы не укажете предложение order by, то он может предоставить результат вам по своему усмотрению.

На практике это в основном означает его упорядочение по кластерному индексу, но это не обязательно!