|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
ОзверинniteshadeОзверин, Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы. Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете? не, он неправильный. Можно по шагам разобрать: Код: sql 1.
выбрать записи с максимальным id, если эти записи имеют более 1го дупликата по полю name Код: sql 1. 2.
удалить все остальные записи. То есть те записи, которые НЕ дублируются, будут удалены, останутся только дубликаты с максимальным айди - все наоборот же. да, был невнимателен правильный: Код: sql 1. 2.
определение оригинала, как записи с минимальным id - это ваше домысливание тем не менее, в такой постановке заменяем max на min ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 06:00 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Андрей ПанфиловniteshadeОн правильный.Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр): Код: sql 1. 2. 3. 4. 5. 6. 7.
PS. кто есть типовой запрос: Код: sql 1. 2.
он просто и эффективен зачем переписывать его в более сложной и менее эффективной форме? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 06:05 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
niteshadeесть типовой запрос: Код: sql 1. 2.
он просто и эффективен зачем переписывать его в более сложной и менее эффективной форме? Ну для начала, попробуйте найти ошибку в "типовом" запросе - она там есть и довольно существенная. Во вторых с "эффективностью" там так себе: Код: 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. 38. 39. 40.
Код: 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. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 07:00 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
niteshade, он правильный только для данного набора данных, вроде уже обсудили. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 08:24 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Андрей Панфилов, а почему во втором случае 0 physical reads? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 09:33 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
в моем случае разница не велика в пользу агрегирования(быстрее, чем джоины) на таблице в 15000 записей и при условии, что ни одна из них не будет удалена. В случае, если перейти на выборку по одному текстовому полю, а не по двум - результаты остаются очень похожими. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 09:58 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, Код: 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. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 09:59 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, и вариант со сравнением по 2м полям: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 10:00 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, и наконец, корректный вариант дает очень схожу картину мира: EXPLAIN ANALYZE DELETE FROM temp.names t1 WHERE t1.id NOT IN(SELECT min(t2.id) FROM temp.names t2 GROUP BY t2.f, t2.s HAVING count(t2.id)>1 OR count(t2.id)=1); "Delete on names t1 (cost=742.56..1127.83 rows=8331 width=6) (actual time=35.358..35.358 rows=0 loops=1)" " -> Seq Scan on names t1 (cost=742.56..1127.83 rows=8331 width=6) (actual time=35.357..35.357 rows=0 loops=1)" " Filter: (NOT (hashed SubPlan 1))" " Rows Removed by Filter: 15729" " SubPlan 1" " -> HashAggregate (cost=551.89..715.32 rows=10895 width=40) (actual time=23.995..28.049 rows=15729 loops=1)" " Filter: ((count(t2.id) > 1) OR (count(t2.id) = 1))" " -> Seq Scan on names t2 (cost=0.00..343.62 rows=16662 width=40) (actual time=0.007..6.850 rows=15729 loops=1)" "Total runtime: 35.475 ms" Все это связано с тем, что после 1-2х запросов большинство баз создает свой какой-нить хэш-агрегат и уже работает с ним. Потому, чтобы показать РЕАЛЬНУЮ разницу между по сути очень похожими запросами, надо поработать с базой, поудалять оттуда данные, повставлять новые, повыполнять запросы на удаление, а потом уже анализировать итоги. Как и в java - надо бе разогреться. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 10:09 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверина почему во втором случае 0 physical reads?Потому что табличка с индексом в память легла - оракл может себе позволить, а вопрос скорее всего в том, почему в первом случае (group by) не 0, ответ тут простой: оно сортировку решило не в памяти делать, а на диске (1 sorts (disk)). В случае ваших 15 тыс. смотреть даже нечего, сделайте несколько миллионов и индекс нормальный, типа (дубликат, id). Ну и еще доводы в пользу exists: в случае group by возникают краевые эффекты на пустых полях: в данном случае "получится" что null=null, т.е. группируем налы, а удаляем уже по id из-за NOT IN возникают краевые эффекты на пустых id, т.е. если в таблице есть пустой id, то запрос вообще ничего не удалит в случае exists я могу базу бомбить несколькими запросами одновременно, просто добавив во внешнее условие name like 'A%', name like 'B%' и пр. В случае group by условие нужно добавлять уже в два места чтобы они коррелировали ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 10:16 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Андрей Панфилов, так если сделать 15 млн, то и не ляжет вся она в память, а только - частично. О том и разговор, что первый запрос при всей неэффективности отработал всего на 1 секунду медленее, но НА ДИСКЕ. Короче, на неразогретом оракле. В моем случае он отработал быстрее в обоих случаях. 1. это специфичное для оракла? В пг группировка по null - всегда отдельная группа и никакого сравнения просто нет. 2. пустой primary key? это уже эффект какой-то подозрительный. 3.при like уже под большим вопросом вообще использование индексов, так что делать то вы можете что угодно, но как это повлияет на план запроса - вы не знаете. Правда я вообще не понял, про что этот пункт. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:10 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, единственное, что, для PG - not in менее эффективен в плане работы, чем exists. Потому можно на него перейти, проверить. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:13 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Андрей Панфиловniteshadeесть типовой запрос: Код: sql 1. 2.
он просто и эффективен зачем переписывать его в более сложной и менее эффективной форме? Ну для начала, попробуйте найти ошибку в "типовом" запросе - она там есть и довольно существенная. Во вторых с "эффективностью" там так себе: Код: 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. 38. 39. 40.
Код: 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. 38. 39. 40.
индексы откуда появились? опять домысливания? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:53 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Для Oracle всё ещё проще: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:59 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озвериндля PG для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком) Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:59 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
niteshadeиндексы откуда появились? опять домысливания? не откуда, а какие - полнотекстовые какие-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 11:59 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверин, это уже какая-то яростная дичь) в первом сообщении топика есть условия исходя из них необходимо решить задачу может, хватит уже натягивать сову на глобус?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 12:12 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
chpashaОзвериндля PG для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком) Код: sql 1. 2. 3. 4.
я как-то с сомнением, если развернуть запрос похоже на : Код: sql 1. 2.
то есть похоже, что он сделает ровно обратное. Я не прав? p.s. в данном случае USING -специфичен для базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 12:17 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
niteshadeОзверин, это уже какая-то яростная дичь) в первом сообщении топика есть условия исходя из них необходимо решить задачу может, хватит уже натягивать сову на глобус?)) вопрос пошел немного дальше. Правильные запросы уже были. Что вам не нравится? Не хотите - не обсуждайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 12:18 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверинchpashaпропущено... для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком) Код: sql 1. 2. 3. 4.
я как-то с сомнением, если развернуть запрос похоже на : Код: sql 1. 2.
то есть похоже, что он сделает ровно обратное. Я не прав? p.s. в данном случае USING -специфичен для базы. а не, вроде все ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 12:22 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Execution plan будем смотреть? Потому-что для некоторых dbms существует т.н. аналитические функции которые тоже позволяют решать данную задачу. Вообще - удаление дубликатов - это страшный боян и в профильных топиках уже на это не отвечают а просто кидают тебя в Stackoverflow или в какой-то ФАК. И зачем мы это мурыжым? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 14:57 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Я ждал выступления начальника транспортного цеха и вади... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 15:14 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Озверинтак если сделать 15 млн, то и не ляжет вся она в память, а только - частично.Ну а какая разница-то? С group by появляется дополнительная операция, как ни крути, она чего-то да и стоит, а изначальный пойнт был в том, что exists - ну это вообще супер сложно и неэффективно, пока автору сего утверждения правоту доказать не удалось. Озверин1. это специфичное для оракла? В пг группировка по null - всегда отдельная группа и никакого сравнения просто нетну вот есть таблица idname1null2null в результате group by с max(id) она превратится в: idname2null в итоге delete удалит первую запись, вопрос: это ожидаемое поведение с т.з. постановки задачи или нет? Т.е. когда мы говорим про дубликаты, null = null или нет (когда мы в контексте СУБД, то там все null разные)? Озверин2. пустой primary key? это уже эффект какой-то подозрительный.ну это вы по названию колонки домыслили уже, а без DDL таблицы что там в действительности - неизвестно. Озверин3.при like уже под большим вопросом вообще использование индексов, так что делать то вы можете что угодно, но как это повлияет на план запроса - вы не знаете. Правда я вообще не понял, про что этот пункт.ну вот у вас есть PostgreSQL, который не умеет parallel а в базе триллион записей, вопрос: как ускорить удаление? В целом же, любая логика, основанная на отрицании - она априори неправильная, потому что заставляет думать в четыре раза больше, так что если можно писать прямо, то нужно так и делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 16:09 |
|
Вопросы на собеседовании
|
|||
---|---|---|---|
#18+
Андрей Панфилов, 0. Изначальный поинт был про сложно воспринимаемый (человеком для быстрого осмысления) запрос, где много джоинов по текстовым полям. Не знаю, причем тут exist. 1. это странно считать, что за счет доп операции алгоритм будет менее эффективным. Если бы запросы были абсолютно идентичными и в один из них мы вставили доп операцию - это высказывание хотя бы логику имело. 2. Я не знаю, являются ли для постановщика задачи null равными между собой или нет. Спросите у постановщика. 3. Если домысливать нельзя, то изначально дискуссия не имеет смысла и подходит любой запрос для 5 строк. Если бы нельзя было "домысливать", то зачем вы сделали индексы для таблицы, а потом по ним план запроса построили? 4. Если у меня будет триллион записей и этот запрос не будет справляться, я буду смотреть какой запрос лучше справиться с триллионом записей, как я буду смотреть, какой запрос лучше справиться с миллионом записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2019, 17:33 |
|
|
start [/forum/topic.php?fid=59&msg=39760646&tid=2121531]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 350ms |
total: | 605ms |
0 / 0 |