|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Классы можно вообще не генерить Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Dapper автоматом создает объект dynamic. Работать будет помедленнее, но это редко когда критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 14:46 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TАлексей Кпропущено... Ну пиши LINQ запрос так, чтобы на выходе получался нужный план выполнения SQL запроса. Так говоришь, как будто при генерации SQL запросов используется генератор случайных чисел. :-) Ну не всегда возможно. С LEFT JOIN все плохо, UNION не получилось заставить сделать.Вместо join обычно используются ассоциации. С union проблем никаких. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 15:34 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima T Классы можно вообще не генерить Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Dapper автоматом создает объект dynamic. Работать будет помедленнее, но это редко когда критично.Критично отсутствие типизации при работе с данными, если использовать dynamic. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 15:36 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КDima Tпропущено... Ну не всегда возможно. С LEFT JOIN все плохо, UNION не получилось заставить сделать.Вместо join обычно используются ассоциации. С union проблем никаких. Пример, из недавнего. таблицы: Код: c# 1. 2. 3.
Есть адреса и группы адресов. Юзер может быть привязан и к конкретному адресу, и к группе адресов. Надо выбрать все документы по адресам юзера. В фильтре имеем только конкретный @UserId В SQL просто пишется Код: c# 1. 2. 3. 4.
Заставить Linq выдать такой запрос я не смог. Вообще ничего не смог сделать чтобы обойтись одним обращением к серверу. Может конечно у меня опыта мало. Покажи как одним Linq запросом сделать тоже самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:11 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей ККритично отсутствие типизации при работе с данными, если использовать dynamic. ИМХУ если запрос и обработка результата в пределах одного метода, то некритично. Если куда-то передавать, хранить, то согласен, надо сделать класс. В моем случае первое чаще: запросил из БД, сгенерил ответ, отправил. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:15 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Напутал немного Код: c# 1. 2. 3.
Есть адреса и группы адресов. Юзер может быть привязан и к конкретному адресу, и к группе адресов. Надо выбрать все документы по адресам юзера. В фильтре имеем только конкретный @UserId Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:23 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TАлексей Кпропущено... Вместо join обычно используются ассоциации. С union проблем никаких. Пример, из недавнего. таблицы: Код: c# 1. 2. 3.
Есть адреса и группы адресов. Юзер может быть привязан и к конкретному адресу, и к группе адресов. Надо выбрать все документы по адресам юзера. В фильтре имеем только конкретный @UserId В SQL просто пишется Код: c# 1. 2. 3. 4.
Заставить Linq выдать такой запрос я не смог. Вообще ничего не смог сделать чтобы обойтись одним обращением к серверу. Может конечно у меня опыта мало. Покажи как одним Linq запросом сделать тоже самое.Вообще без проблем. Завтра постараюсь ответить. Сейчас нет возможности, пишу с мобилы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:25 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TАлексей ККритично отсутствие типизации при работе с данными, если использовать dynamic. ИМХУ если запрос и обработка результата в пределах одного метода, то некритично. Если куда-то передавать, хранить, то согласен, надо сделать класс. В моем случае первое чаще: запросил из БД, сгенерил ответ, отправил.Даже если в пределах одного метода, то удобнее использовать linq и анонимный класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:27 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TskyANAА вообще меньше буков кода - это когда меньше всяких DTO, POCO, Business Objects, Services, Repositories, Mappers. Если не злоупотреблять, то много не будет. skyANAИ ещё ORM-ы бывают работают не так как вам надо, или не оптимально, или в них тупо баги и приходится писать код, чтобы это обойти. Невозможно оптимально обернуть РСУБД с помощью ООП, но это не мешает в 99% случаев, в оставшемся 1% можно позаморачиваться с оптимизацией. Для простых запросов Linq генерит вполне нормальные select`ы, более сложные вещи можно вынести на сторону sql-сервера (писать ХП или view делать). Багов хотелось бы поменьше, поэтому и хочу ширпотребное решение, чтобы баги по-максимуму уже были убраны. С 99% - это Вы погорячились :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 23:04 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima T, Портировал твой запрос на LINQ, не вдаваясь в подробности. Могут быть ошибки, но принцип, думаю, понятен. Повторюсь, в реальной жизни join заменяется ассоциациями. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 04:22 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КDima T, Портировал твой запрос на LINQ, не вдаваясь в подробности. Могут быть ошибки, но принцип, думаю, понятен. Повторюсь, в реальной жизни join заменяется ассоциациями. Затестил, select не такой Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Тут where ... in заменен на join поэтому пришлось обернуть union в select distinct, т.е. лишний вложенный запрос. На плане видно что лишний select вызвал лишние операции. В цифрах Estimated Subtree Cost (суммарная стоимость всех операций) такая Запрос Значениемой0.0065717 linq0.0278751 Пропорции тут нет смысла считать, т.к. таблицы пустые. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 07:57 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TТут where ... in заменен на joinДа заменён, но это принципиально ничего не меняет. Можно заменить на вложенный запрос в разделе where, но мне в данном случае join нравится больше. Но если там план выполнения плохой, то точно не из-за этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 08:59 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TВ цифрах Estimated Subtree Cost (суммарная стоимость всех операций) такая Запрос Значениемой0.0065717 linq0.0278751 Пропорции тут нет смысла считать, т.к. таблицы пустые.Ну и какой смысл сравнивать статистику выполнения запросов на пустых таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 09:01 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima TНа плане видно что лишний select вызвал лишние операции.Твой запрос не возвращает поле Doc.Text. Вероятно, причина в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 09:08 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КDima TНа плане видно что лишний select вызвал лишние операции.Твой запрос не возвращает поле Doc.Text. Вероятно, причина в этом. Возвращает, я добавил, на картинке с планом видно текст запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 09:33 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima T, Ну напиши так, для чистоты эксперимента: Код: c# 1. 2. 3. 4.
Но я в этом смысла не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 09:42 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КНу и какой смысл сравнивать статистику выполнения запросов на пустых таблицах? Замерил на рабочей базе, там правда записей пока не много (GroupAddr 473, UserAddr 3, Doc 4018) ЗапросЗначениемой0.0763995linq0.0896945 быстрее на 17% ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 09:57 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КDima T, Ну напиши так, для чистоты эксперимента: Код: c# 1. 2. 3. 4.
Но я в этом смысла не вижу. текст запроса Код: 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.
Так быстрее, план почти такой же как у меня, и время соответственно такое же 0.0065719 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 10:08 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Dima T, Напоследок, тут distinct не нужен. Можно заменить Union на Concat. План должен стать лучше. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 14:12 |
|
Как работать с БД ?
|
|||
---|---|---|---|
#18+
Алексей КDima T, Напоследок, тут distinct не нужен. Можно заменить Union на Concat. План должен стать лучше. Код: c# 1. 2. 3. 4.
запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
План стал один-в-один как у меня, время тоже сравнялось 0.0065717. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 14:33 |
|
|
start [/forum/topic.php?fid=17&msg=39309207&tid=1349362]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
197ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 315ms |
0 / 0 |