|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Alex Kuznetsov"Скажу Вам по секрету", за последние много-много лет ничего принципиально нового в подходе к работе с серверными базами данных не изменилось и не произошло С реляционными базами данных. Потому как появились NoSQL базы, где приниципы работы несколько иные. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 05:56 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
sphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 06:18 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей Кsphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц) Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 06:21 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей Кпропущено... "Рыба есть, ловить надо уметь". (ц) Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь.LINQ сегодня уже неплохо транслируется в SQL. Планы выполнения сгенерированного SQL ничем не хуже рукописного. Так что с оптимальностью тут всё в порядке. Нахреначить хранимых процедур - много ума не надо, это все умеют. А построить обработку данных на основе типизированных запросов, являющихся частью самого языка C# (и других), возможно, несколько сложнее. Но результат лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 06:32 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей КПланы выполнения сгенерированного SQL ничем не хуже рукописного. Только если сгенерированный SQL прост. Или смаплен на существующие view/inline function. Как-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer apply, windowed/ranking funсtions, etc. И как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 08:17 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
sphinx_mvИ что из этого следует? Сначала выполняем запрос к базе данных, чтобы заполнить датасет, а потом по получившемуся набору эмулируем другой запрос, но уже на LINQ?! Я ничего не упустил? Это к тому что мне не именно "линк" нравится, а ORM "полегче" чем TypedDataSet, не которая заливает к себе таблицы и сама следит за изменениями и контролирует констрейнты, а которая просто транслирует запросы в SQL. sphinx_mvБанальные сортировки, фильтрация и поиска в данных - и это практически все, что умеет LINQ. Самой прикольное, что все это можно делать совсем без использования LINQ - и со времен царя гороха. Можно, но писать в духе var cars1 = db.Cars.Where(c=>c.CarMake == "Ford").Select(c=>c.CarID); на выходе я получу запрос "select CarID from dbo.Cars where CarMake = @p". (За сложными запросами наблюдал через профайлер, вполне адекватный SQL получается) и это ИМХО удобнее чем .NET DB апи (времена царя гороха) использовать, следить чтоб с названиями опечаток не было, параметры в запросах и т.д. с Linq - когда нужны "простые" запросы, ИМХО компактнее и читабильнее. sphinx_mvФэншуй заключается в том, чтобы знать и уметь пользоваться инструментом - Вы про такой подход в курсе? Окай, 2топик стартер. знать и использовать стандартные инструменты прежде чем изобретать велосипед или использовать в проекте сторонние поделки. sphinx_mvИ Вы что-то намекали про отсутствие необходимости пересоздания модели для не-датасета... Подзабывать уже стал... в дизайнере размещение элементов изменишь - пару раз нормально смержится в SVN, потом начинаются проблемы, и нужно пересоздавть модель с нуля, и по второму кругу расставлять на схеме, бегать по полям свойства менять. Таблички норовит целиком в себя затянуть, несколько вариантов Update, с констрейтами проблемы были, в итоге их просто удаляли. Возможно это то того что я не знаю этот стандартный инструмент так хорошо как Вы, но вещи подобные перечисленным выше вызывали дискомфорт. Да и появился апп сервер, и клиенты напрямую с БД перестали работать. На тот момент информации как натянуть на это wcf не было. С T4 все проще, проблем с мержингом не попадалось + куча всего "за огородом". Схемы мне достаточно в PD и его функций модификации БД. sphinx_mvАга... И после переноса на LINQ все это стало работать лучше... Возможно, мне бы и захотелось в это ПОВЕРИТЬ, но, к сожалению, вот именно в этом вопросе я непробиваемо убежденный атеист. :) Нет, работать быстрее не стало, очевидно что какое-то время добавилось на трансляцию (порядок цифр - до 700мс, после 940мс). Для пользователя это незаметно, таже транзакция, а с кодом стало проще работать и отлаживать. Банальная возможность пройтись дебаггером и использовать в коде #region сильно все упростили. Код выполняется в апп сервере, появилась возможность использовать не только данные базы. Раньше для каждого объекта пилилась своя ХП (своего рода кастомизация), и плыли по составу экземпляры БД, теперь свой XML с настройками логики, схема БД - на 99% унифицирована. Нет у меня доменной авторизации к SQL чтоб использовать его отладчик, да и запускать хп из SMS и её отлаживать - менее удобно чем во время работы приложения. С линк - время на борьбу с глюками уменьшилось в разы. Для меня это аргумент. В Linq все перевелось практически 1 к 1. Именно "сложные запросы" - конечно же остались в ХП и вью. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 08:49 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныКак-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer applyВ это - запросто. См. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework. Сон Веры Павловныwindowed/ranking funсtions, etc.Этим не пользовался. Если что-то не получается - всегда можно написать вьюху. Но их будет мало. Сон Веры ПавловныИ как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты.Лучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 09:21 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
КифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 09:23 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныТолько если сгенерированный SQL прост.Ну и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 09:24 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework. Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих. Алексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты. Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто. Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход. Алексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка. Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно. Например, такой (она на самом деле больше, чем на скриншоте - в полный размер просто в ограничение по размеру аттача не влез): ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 10:05 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework. Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих.Уж поверьте на слово. :-) Сон Веры ПавловныАлексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты. Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто. Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход.Ну значит статистика такая. Например, записей в таблице мало. Сон Веры ПавловныАлексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка. Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно.Нет, нет, нет... не будем уходить в сторону. :-) Все вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 10:33 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов ) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 10:42 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
КифирчикАлексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов )Я знаю. Поэтому меня всегда удивляет, когда кто-либо обосновывает невозможность чего-либо абстрактной сложностью чего-то там, в данном случае SQL. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 10:49 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Кифирчикисходя из опытаКакая правильная мысль :) Предлагаю взять в руки интерфейс IQueryProvider и реализовать. Думаю "сложный SQL" быстро всплывёт после применения вашей реализации на реальных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 11:37 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-) Ну, тогда вот так попробуйте: http://stackoverflow.com/questions/3353634/measuring-the-complexity-of-sql-statements ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 12:23 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-) Ну, тогда вот так попробуйте: http://stackoverflow.com/questions/3353634/measuring-the-complexity-of-sql-statements ОттудаSomething like: •number of tables times (1 •+1 per join expression (+1 per outer join?) •+1 per predicate after WHERE or HAVING •+1 per GROUP BY expression •+1 per UNION or INTERSECT •+1 per function call •+1 per CASE expression И при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 12:26 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-) А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 12:34 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-) А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности.Ну пусть не "невозможность", а "проигрыш в оптимальности". При достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 12:50 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Мне вот, например, приятно в "сложных запросах" пользоваться ассоциациями и code-complete вместо ручного написания join-ов. Я экономлю на этом массу времени и нервов. Таки сложные SQL-запросы лучше генерировать, а не писать вручную? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 12:54 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, с Алексеем нет смысла спорить. Конкретно в его проекте, с его структурой БД, и его запросами нет никаких проблем. Значит и у остальных их не может быть. Проходили уже :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:01 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-) Не жуть, но факт - не раз было проверено профайлером. В ряде случаев на это можно забить, в ряде такие сложности приходится выносить во вьюху/функцию, и маппить на них - потому как либо пользователи раздражаются на излишнее ожидание, либо админы на излишнее отжирание ресурсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:02 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныАлексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-) Не жуть, но факт - не раз было проверено профайлером.Вы же не работаете с EF, откуда Вам знать? :-) EF и NH не совсем не одно и то же. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:12 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей Кsphinx_mv Эффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)"Тут рыбы нет!" (ц) директор стадиона. Обратите ЕЩЕ раз внимание на выделенное... То, что LINQ не в полной мере даже просто покрывает функционал "стандартного" SQL - это плохо опровергаемый факт. И не забудьте, что когда Вы таки используете LINQ-то-"какая-то СУБД/ORM/etc." Вы все-таки транслируете не SQL в LINQ, а LINQ в SQL - что есть "немножко разное"... При этом я пока еще не предлагаю принять во внимание эффективность получения результатов для LINQ-запросов ии "конечных" SQL-запросов к базе данных. Ну, хотя бы потому, что иначе как минимум для SQL-запросов придется вспомнить, что на разных серверах БД "эффективный" синтаксис SQL-запросов тоже разный... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:32 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Алексей ККифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-)Ну-ну... Как это "по-нашему" - сначала создаем себе проблемы, потом героически их преодолеваем... Тянем на клиента практически "сырые" данные, а потом их "сливаем" между собой - это, ну, ОЧЕНЬ практично... Даже для выборок из таблиц на пару сотен тысяч записей... А потом начинаем жаловаться, что сервер БД захлебывается от запросов, что сеть слабая, что памяти не хватает и т.д. и т.п... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:34 |
|
Архитектура приложения
|
|||
---|---|---|---|
#18+
Кифирчикsphinx_mvБанальные сортировки, фильтрация и поиска в данных - и это практически все, что умеет LINQ. Самой прикольное, что все это можно делать совсем без использования LINQ - и со времен царя гороха. Можно, но писать в духе var cars1 = db.Cars.Where(c=>c.CarMake == "Ford").Select(c=>c.CarID); на выходе я получу запрос "select CarID from dbo.Cars where CarMake = @p". (За сложными запросами наблюдал через профайлер, вполне адекватный SQL получается)Соединять таблицы (join)? Выбирать связанные по "мастер-деталь"? "Не верю!" (с) :) Кифирчики это ИМХО удобнее чем .NET DB апи (времена царя гороха) использовать, следить чтоб с названиями опечаток не было, параметры в запросах и т.д.Пфффф... :) Не надо за названиями следить и за опечатками: интелисенс для баз данных существует тоже со времен царя гороха - включая переменные и параметры запросов и хранимых процедур с функциями. Кифирчикс Linq - когда нужны "простые" запросы, ИМХО компактнее и читабильнее.Ну, скажем так... Очень зависит от степени кривизны рук архитекторов и разработчиков как приложения, так и ORM-фреймворка. Как-то помогал разбираться с "непонятками" на сервере БД - десяток пользователей, доступ через WEB-интерфейс, жалкая сотня тысяч документов в базе (и постороннее коммерческое приложение). Наблюдалось, что при выполнении некоторых выборок по условиям, введенными пользователями в приложении, сервер баз данных попадал в ступор - почти 100% загрузка по всем основным используемым ресурсам - процессор, диск, сеть... Начали разбираться с этим WTF'ом через профайлер - посто нужно было ткнуть сомневающихся носом во вполне ожидаемую ситуацию... Чтобы выбрать данные по критерию, сначала формировался список данных из всех связанных таблиц: по общему списку документов список из множества атрибутов сначала дополнялся данными отдельными маленькими простыми запросами из базы. Потом по итоговому результату на WEB-сервере фильтрация по критериям. Иногда подобные "ну, очень легкие" обработки запускались несколькими пользователями параллельно. В итоге все это "счастье" начинало работать крайне медленно, и пользователи, не дождавшись результата, прерывали выполнение своих запросов... Но приложение на веб-сервере продолжало насиловать сервер баз данных. "Экстаз" сервера БД продолжался минут по 10-15 даже после отключения всех пользователей... К чему это я? А к тому, что попасть в такую ситуацию при использовании даже "правильного" ORM-фреймворка проще пареной репы - даже для самых продвинутых разработчиков. Кифирчикsphinx_mvФэншуй заключается в том, чтобы знать и уметь пользоваться инструментом - Вы про такой подход в курсе? Окай, 2топик стартер. знать и использовать стандартные инструменты прежде чем изобретать велосипед или использовать в проекте сторонние поделки. :) Кифирчикsphinx_mvАга... И после переноса на LINQ все это стало работать лучше... Возможно, мне бы и захотелось в это ПОВЕРИТЬ, но, к сожалению, вот именно в этом вопросе я непробиваемо убежденный атеист. :) Нет, работать быстрее не стало, очевидно что какое-то время добавилось на трансляцию (порядок цифр - до 700мс, после 940мс).+30% времени на выполнение отдельнго запроса?! 8-0 С моими объемами транзакций в секунду меня просто уволят без выходного пособия после такой "оптимизации"... КифирчикДля пользователя это незаметно, таже транзакция, а с кодом стало проще работать и отлаживать. Банальная возможность пройтись дебаггером и использовать в коде #region сильно все упростили.Скрывать блоки кода в хранимых процедурах, как ни странно, мне (как-то) удается без использования #region... :) Про дебагер вроде бы уже было... Про тестирование я упоминал? Если нет, то и оно доступно - как ручное, так и полностью автоматизированное. КифирчикКод выполняется в апп сервере, появилась возможность использовать не только данные базы. Раньше для каждого объекта пилилась своя ХП (своего рода кастомизация), и плыли по составу экземпляры БД, теперь свой XML с настройками логики, схема БД - на 99% унифицирована. Нет у меня доменной авторизации к SQL чтоб использовать его отладчикЭто какие-то ужасы из параллельной реальности... Права правильно раздать разработчиков на отладочном сервере баз данных не вариант? Кифирчикда и запускать хп из SMS и её отлаживать - менее удобно чем во время работы приложения.Относитесь к БД как к отдельному модулю, который может разрабатываться и отлаживаться отдельно от всех остальных. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2014, 13:35 |
|
|
start [/forum/topic.php?fid=20&msg=38573691&tid=1403189]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 328ms |
total: | 489ms |
0 / 0 |