|
Разный порядок записей в "почти" одинаковых запросах.
|
|||
---|---|---|---|
#18+
Есть сбойный тест EF Core. Раскопки показывают , что два "почти одинаковых" (под)запроса возвращают записи в разном порядке. У обоих интересует только первая запись результата. Можно было бы забить, но может ещё "кому-нибудь" будет интересно покопаться. База (FB3.0.8.33506) приатачена. Скрипт таблицы Orders Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Скрипт таблицы Order Details Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Первый подзапрос , который возвращает правильную (ожидаемую) первую запись: Код: plsql 1. 2. 3. 4.
OrderID OrderID0 ProductID row10248 10285 1 110248 10294 1 2 План запроса PLAN SORT (JOIN (o1 INDEX (PK_Orders), o2 NATURAL)) Второй подзапрос , возвращающий "неправильную" первую запись: Код: plsql 1. 2. 3. 4.
OrderID CustomerID EmployeeID OrderDate OrderID0 ProductID row10248 VINET 5 04.07.1996 00:00:00.7070 11005 1 110248 VINET 5 04.07.1996 00:00:00.7070 11006 1 2 План запроса PLAN SORT (JOIN (o1 INDEX (PK_Orders), o2 NATURAL)) Проблема с OrderID0. Ожидается, что здесь будет 10285 (как в первом запросе). Эксперименты показывают, что во втором запросе порядок меняется, когда в списке возвращаемых колонок появляется "o1"."CustomerID". То есть, к примеру, запрос: Код: plsql 1. 2. 3. 4.
Возвращает ожидаемый OrderID0==10285 OrderID EmployeeID OrderDate OrderID0 ProductID row10248 5 04.07.1996 00:00:00.7070 10285 1 1 План запроса PLAN SORT (JOIN (o1 INDEX (PK_Orders), o2 NATURAL)) ----------- Понятное дело, что это тест кривой. Не первый и, думаю, не последний. Но тем не менее. Не понятно, почему "o1"."CustomerID" меняет порядок возвращаемых записей? Сам тест Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Он генерирует два мутных запроса, с выше обозначенными подзапросами: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Для MSSQL генерируются точно такие же запросы и с ним тест отрабатывает без проблем. --- Несколько раз просмотрел, вроде все правильно описал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 01:24 |
|
Разный порядок записей в "почти" одинаковых запросах.
|
|||
---|---|---|---|
#18+
Коваленко Дмитрий Проблема с OrderID0. Ожидается, что здесь будет 10285 (как в первом запросе). Коваленко Дмитрий Не понятно, почему "o1"."CustomerID" меняет порядок возвращаемых записей? Никто никогда не обещал одинаковый порядок для частично отсортированных данных. Коваленко Дмитрий Для MSSQL генерируются точно такие же запросы и с ним тест отрабатывает без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 02:29 |
|
Разный порядок записей в "почти" одинаковых запросах.
|
|||
---|---|---|---|
#18+
Коваленко Дмитрий, странно, а почему вы ожидаете такой порядок? Вы его явно не указали! Сделайте это явно и всё ROW_NUMBER() OVER(PARTITION BY "o1"."OrderID" ORDER BY "o1"."OrderID", "o2"."OrderID") AS "row" ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 11:30 |
|
|
start [/forum/topic.php?fid=40&msg=40119785&tid=1559864]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 244ms |
total: | 378ms |
0 / 0 |