|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Здравствуйте. Не могу понять, почему и Ora 11.2 и SS 2005 XE (другого нет под рукой) не делают join elimitation в следующем случае. DDL: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Query: Код: sql 1.
Этот запрос всегда выдаёт полное кол-во строк из таблицы tm, т.к. тут внешнее соединение. Далее, в select-списке нет ни одного поля из таблицы td ==> соединение здесь вообще можно не проводить. Тем не менее, получаю вот следующие результаты. 1. Oracle 11.2.0.3.0: hash join таблиц Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Кстати, "обратный" запрос, в котором надо получить только поля из detail-таблицы: Код: sql 1.
- выдаёт разумный план только в Оракле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Какие будут мнения по этому вопросу ? PS. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options --------------------------------------------------------------------------------------------------------------------- Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.0 (Build 2195: Service Pack 4) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 18:25 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
авторMicrosoft SQL Server 2005 2012 год на дворе. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 18:44 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
ScareCrowавторMicrosoft SQL Server 2005 2012 год на дворе.ну, и что там в SS 2012 для вышеприведенного ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 18:45 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоид, вы оставьте по одной записи в каждой таблице - сравните план, потом по 100000/50000 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:06 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоид, ну, во первых, я бы сказал что сравнивать экспресс и энтерпрайз - как минимум грешно. во вторых я бы сказал, что при тех данных, что использованы в тестовом примере - сервер может вообще планами не заморачиваться, а делать как попало - хоть декарт+фильтрация ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:18 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Ага, сорри, не досмотрел немного (что, вообще говоря, не отменяет того что я сказал выше) вот это вот "Этот запрос всегда выдаёт полное кол-во строк из таблицы tm, т.к. тут внешнее соединение. Далее, в select-списке нет ни одного поля из таблицы td ==> соединение здесь вообще можно не проводить." - бред Потому и результат такой. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:22 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
lockyпри тех данных, что использованы в тестовом примере - сервер может вообще планами не заморачиватьсяOK, вот побольше данных: Код: 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.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:30 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоидlockyвот это вот <...> - бредБолее подробное объяснение будет ? Вы DDL точно внимательно посмотрели ? Да. Я мало того что его посмотрел, я всё скопировал и выполнил и что я могу сказать - в исходной таблице tm - 5 строк, а результатом выполнения вашего запроса являются 7 строк, что не в полной мере отвечает заявленном "Этот запрос всегда выдаёт полное кол-во строк из таблицы tm" и уж точно противоречит "соединение здесь вообще можно не проводить." ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:32 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
И, кстати, глубоко по шарабану - внешнее там или унутренее объединение Исходная посылка - неправильная, следовательно - не следует удивляться тому что реальный результат не соответствует якобы ожидаемому ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:34 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
вот если сделать вот так Код: sql 1.
тогда да, ненужный джойн убирается ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:40 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
lockyв исходной таблице tm - 5 строк, а результатом выполнения вашего запроса являются 7 строк,да, пардон: с запросом tm left join td я глупость сморозил, бывает :-) Но с "обратным" запросом - почему так ? я про то, что Код: sql 1.
и Код: sql 1.
должны выдавать одинаковое число строк: каждой строке из 'd' может соотв-вать только одна строка из tm. И лезть в tm тут точно нет нужды, ибо не нужно от неё ничего. А он таки лезет, когда там inner join. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:42 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
lockyтогда да, ненужный джойн убираетсяя чуть опоздал со своим ответом. Так почему этот самый ненужный джойн стал ему нужен при INNER join'e ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:42 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоидlockyтогда да, ненужный джойн убираетсяя чуть опоздал со своим ответом. Так почему этот самый ненужный джойн стал ему нужен при INNER join'e ? Потому что результаты запроса - могут быть разными, знаете-ли, при внешнем и внутреннем объединении Хотя, по хорошему, надо смотреть на trusted констрейнта - и пропускать соединение ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:45 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоидlockyв исходной таблице tm - 5 строк, а результатом выполнения вашего запроса являются 7 строк,да, пардон: с запросом tm left join td я глупость сморозил, бывает :-) Но с "обратным" запросом - почему так ? я про то, что Код: sql 1.
и Код: sql 1.
должны выдавать одинаковое число строк: каждой строке из 'd' может соотв-вать только одна строка из tm. И лезть в tm тут точно нет нужды, ибо не нужно от неё ничего. А он таки лезет, когда там inner join. Да, "должны". Но могут и "не" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:45 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
lockyо хорошему, надо смотреть на trusted констрейнта - и пропускать соединениеDBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS; - не выдал ничего "красным цветом". Да и таблицы-то были наполнены только что и одноразово. Откудова там нарушениям констрейнтов взяться. Или вы про другое говорите ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:53 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Таблоидlockyо хорошему, надо смотреть на trusted констрейнта - и пропускать соединениеDBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS; - не выдал ничего "красным цветом". Да и таблицы-то были наполнены только что и одноразово. Откудова там нарушениям констрейнтов взяться. Или вы про другое говорите ? trsuted у констренйта - не немного не то что "нарушение целостности" :) в целом я думаю - просто перестраховка с lj в любом случае результат не поменяется, независимо от состояния FK, в то врмя как ij таки зависит от. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:55 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
ТаблоидНо с "обратным" запросом - почему так ? я про то, что Код: sql 1.
и Код: sql 1.
должны выдавать одинаковое число строк: каждой строке из 'd' может соотв-вать только одна строка из tm. И лезть в tm тут точно нет нужды, ибо не нужно от неё ничего. А он таки лезет, когда там inner join. второй так и выдает: Код: sql 1. 2.
Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 16:59 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
Andrey Sribnyak, да, я это вижу. Но вопрос про td inner join tm: почему он при этому начинает лезть в 'tm'. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 19:35 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
ТаблоидAndrey Sribnyak, да, я это вижу. Но вопрос про td inner join tm: почему он при этому начинает лезть в 'tm'.а вдруг там две записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 23:31 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
SergSuperТаблоидAndrey Sribnyak, да, я это вижу. Но вопрос про td inner join tm: почему он при этому начинает лезть в 'tm'.а вдруг там две записи? ну, вообще-то, чисто формально такое невозможно то что в реальной жизни "случается всякое" - это да.... но формально - невозможно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 23:41 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
On 08/31/2012 07:25 PM, Таблоид wrote: > select m.* from tm mleft join td don m.id=d.pid; > > Этот запрос всегда выдаёт полное кол-во строк из таблицы tm, т.к. тут внешнее > соединение. Далее, в select-списке нет ни одного поля из таблицы td ==> > соединение здесь вообще можно не проводить. 0) а нахрена-ж ты тогда вообще JOIN пишешь, если он тебе не нужен ? 1) Кол-во записей в результате может увеличится за счёт JOIN-а. соответственно, запрос с JOIN-ом и без -- разные запросы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 11:30 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
MasterZiv0) а нахрена-ж ты тогда вообще JOIN пишешь, если он тебе не нужен ? 1) Кол-во записей в результате может увеличится за счёт JOIN-а. соответственно, запрос с JOIN-ом и без -- разные запросы.0) не я пишу такие запросы, но некоторые мои коллеги (бывшие), чьи авгиевы конюшни приходится разгребать. 1) я уже признал выше свой косяк для этого варианта. Повторяться не буду. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 14:50 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
lockyну, вообще-то, чисто формально такое невозможно то что в реальной жизни "случается всякое" - это да.... но формально - невозможно Разное бывает, к сожалению. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 19:24 |
|
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
|
|||
---|---|---|---|
#18+
softwarerlockyну, вообще-то, чисто формально такое невозможно то что в реальной жизни "случается всякое" - это да.... но формально - невозможно Разное бывает, к сожалению. Вот-вот Однако, хочу отметить - ведь в данном случае PK находится в состоянии not trusted (спасибо novalidate) , так шта.... А вот в том случае, когда PK проверен и всё такое - можно было бы джойн и не делать ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 20:09 |
|
|
start [/forum/topic.php?fid=35&msg=37939563&tid=1552524]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 132ms |
0 / 0 |