|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Добрый день Вопрос почемучка :) Хотелось бы, если возможно, получить комментарии более опытных товарищей на возникшее поведение при связке 3- х таблиц. Исходные данные Версия сервера Microsoft SQL Server 2014 - 12.0.4213.0 (X64) Jun 9 2015 12:06:16 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Но тестовая база приведена в тоже состояние что и боевая SQL Server 2008(100) (таблицы выдуманные на основе реальных) Код: 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.
План выполнения запроса В приложенном изображении Вопросы: При связи t_Main и t_Sub2 появляется предупреждение Warning no join Predicate На форумах пишут что движок SQL Server может самостоятельно убирать предикат на этапе упрощения запроса. И если посмотреть на оператор поиска по индексу IX_DelayID то видно что output list пусть - оператор ничего не возвращает, и наверное да, предиката не будет, но: 1) почему он появляется? (формальную причину я понял -сканирование индекса t_Sub2 не возвращает никаких значений) 2)Вытекает из 1 -ого почему если запрос написать: Код: sql 1. 2. 3. 4. 5.
То получаем warning А если написать Код: sql 1. 2. 3. 4.
ТО warning-a нет. И в первом и во втором случае оператор поиска по индексу не возвращает полей, но только в первом я получаю warning а во втором нет.почему? 3) почему он исчезает при связи только 2- х таблиц t_Main и t_Sub2 3а)почему он исчезает при указании 2-х значений (доподлинно известно что и второе значение в таблице отсутствует. Более того Output List также пуст). 4)Показывает ли что то данная ситуация? Имеется ввиду это звоночек будущих проблем? Или не заморачиваться? Заранее спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 10:28 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Дополнительно прикладываю Property sheet оператора Index Seek ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 10:31 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей, NL с No Join Predicate означает декартово произведение. Ваш запрос по сути эквивалентен Код: sql 1. 2. 3. 4.
Т.е. два декартовых произведения. В первом на внешнем входе NL всегда будет одна или ноль строк. Поэтому предупреждения нет. Во втором на внешнем входе NL может быть больше одной строки. Поэтому предупреждение есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 12:38 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm, Я правильно понимаю, сервер предполагает, что после первого Nested loops может прийти дубль на вход второго? А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 12:54 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm, А как быть с переменной в Where и просто числом. Почему он так разнится поведение? Еще вопрос, какую книжку почитать чтобы так эквиваленты запросов расписывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 12:58 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей, на 2017 не получил "плохой" план. Хотя и данными не заполнял. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:08 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Владислав Колосов, Да, я тоже перевел базу в режим совместимости выше 100 (2014) и warning также пропал. Видимо это поведение 2008 -ого сервера. Но все остальное (output list) пустой и на 2014 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:30 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей Я правильно понимаю, сервер предполагает, что после первого Nested loops может прийти дубль на вход второго? Алексей А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает. Алексей А как быть с переменной в Where и просто числом. Почему он так разнится поведение? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:44 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm, Сначала план Код: xml 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:46 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm, invm Алексей А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает. Я имел ввиду следующее первый оператор Clustered Index Seek Возвращает 1 строку (поиск по полю кластерного индекса), и соответственно поля [Indx].[dbo].[t_Main].MainID; [Indx].[dbo].[t_Main].OrderNum для внешнего цикла NL Второй оператор Index Seek (по некластерному индексу) не возвращает ничего( и не должен по идее: я с него полей не прошу и соединении или условии фильтра он не используется) Т.е. движок не учитывает, того что в данном случае это будет одна строка. Или я все очень упрощенно понимаю...... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:53 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Откуда удвоение строк, есть джойн по первичному ключу в левых таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:13 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей, Разные оценки количества строк на входе второго NL для константы и переменной. Да и порядок соединения таблиц разный. Алексей Т.е. движок не учитывает, того что в данном случае это будет одна строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:15 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Владислав Колосов Откуда удвоение строк, есть джойн по первичному ключу в левых таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:18 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm t_Sub1.MainID и t_Sub2.DelayID уникальны? Нет, не уникальны. invm О каком случае речь? Первый NL ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:31 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей Нет, не уникальны. Алексей Первый NL В общем, наличие предупреждения зависит от оценочного числа строк на внешнем входе NL, формирующего декартово произведение. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:38 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm Да и порядок соединения таблиц разный. Вроде как нет ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:41 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей, ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:41 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm, Это я понял. Спасибо. Как я понимаю в данном конкретном случае это (warning) не критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:44 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
Алексей Вроде как нет Но оценки разные. Алексей Как я понимаю в данном конкретном случае это (warning) не критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 15:01 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm Ваш запрос по сути эквивалентен Код: sql 1. 2. 3. 4.
Т.е. два декартовых произведения. В первом на внешнем входе NL всегда будет одна или ноль строк. Поэтому предупреждения нет. Во втором на внешнем входе NL может быть больше одной строки. Поэтому предупреждение есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 16:48 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
alexeyvg А почему в первом "всегда будет одна или ноль строк"? Там же тоже может быть больше одной строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 16:49 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
invm alexeyvg А почему в первом "всегда будет одна или ноль строк"? Там же тоже может быть больше одной строки. Код: sql 1.
t_Sub1.MainID не первичный ключ. То есть произведение t_MAin и t_Sub1, для конкретного t_MAin.MainID = @ID и t_Sub1.MainID = @ID будет давать от 0 до много записей. И произведение t_MAin и t_Sub2, для конкретного t_MAin.MainID = @ID и t_Sub2.DelayID = @ID будет давать от 0 до много записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 17:21 |
|
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
|
|||
---|---|---|---|
#18+
alexeyvg, Речь идет о внешнем входе первого NL, а не о его результате. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 17:43 |
|
|
start [/forum/topic.php?fid=46&msg=39928419&tid=1686462]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 310ms |
total: | 434ms |
0 / 0 |