powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения
25 сообщений из 66, страница 2 из 3
Архитектура приложения
    #38573691
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov"Скажу Вам по секрету", за последние много-много лет ничего принципиально нового в подходе к работе с серверными базами данных не изменилось и не произошло
С реляционными базами данных. Потому как появились NoSQL базы, где приниципы работы несколько иные.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573695
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573696
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кsphinx_mvЭффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)
Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573700
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей Кпропущено...
"Рыба есть, ловить надо уметь". (ц)
Проходили же это уже в сраче ORM vs реляционка - по эквивалентности данных на выходе практически любой SQL всегда можно оттранслировать в C#. По оптимальности - отнюдь.LINQ сегодня уже неплохо транслируется в SQL. Планы выполнения сгенерированного SQL ничем не хуже рукописного. Так что с оптимальностью тут всё в порядке.

Нахреначить хранимых процедур - много ума не надо, это все умеют. А построить обработку данных на основе типизированных запросов, являющихся частью самого языка C# (и других), возможно, несколько сложнее. Но результат лучше.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573733
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПланы выполнения сгенерированного SQL ничем не хуже рукописного.
Только если сгенерированный SQL прост. Или смаплен на существующие view/inline function. Как-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer apply, windowed/ranking funсtions, etc.
И как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573749
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Именно "сложные запросы" - конечно же остались в ХП и вью.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573767
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныКак-то я сильно сомневаюсь, что ORM сможет C#-конструкцию оттранслировать в запрос с cross/outer applyВ это - запросто. См. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Сон Веры Павловныwindowed/ranking funсtions, etc.Этим не пользовался. Если что-то не получается - всегда можно написать вьюху. Но их будет мало.
Сон Веры ПавловныИ как бы не стоит забывать о том, что оптимизатор может ошибаться, и статистика не всегда идеальна - из-за чего используется хинты.Лучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573770
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573773
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТолько если сгенерированный SQL прост.Ну и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573811
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих.
Алексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто.
Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход.
Алексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно. Например, такой (она на самом деле больше, чем на скриншоте - в полный размер просто в ограничение по размеру аттача не влез):
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573833
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КСм. трансляцию FirstOrDefault() во вложенном запросе в Entity Framework.
Не получится - нет под рукой EF, у нас nHibernate используют. Так что просим самих.Уж поверьте на слово. :-)
Сон Веры ПавловныАлексей КЛучше видоизменить запрос или иметь актуальную статистику, чем использовать хинты.
Видоизменять запрос при неверном выборе плана из-за неактуальной статистики в большинстве случаев смысла нет - например, для доступа к данным таблицы А используется предикат по полю В, оптимизатор считает, что тут нужен index scan по индексу С, и в упор не видит, что по индексу D будет index seek+RID lookup, которые дешевле, чем index scan. И тут хоть обвидоизменяйся - оптимизатор не переубедить, не пустив в дело хинт. Сталкиваюсь с таким достаточно часто.
Что же до актуализации статистики - она не всегда возможна. Например стороняя закрытая система, в которую можно лезть только своими запросами и dml. DDL - хорошо если на свой страх и риск. Однажды на моей памяти включение обновления статистики в базе такой системы эту систему просто положило. Почему - не знаю, но факт. Поэтому запрос в базе сбоку, подкрепленный хинтами - единственный выход.Ну значит статистика такая. Например, записей в таблице мало.
Сон Веры ПавловныАлексей КНу и опять же, сколько чего должно быть в SQL, чтобы он считался сложным? Нужна количественная оценка.
Оценивать сами конструкции языка здесь вряд ли разумно. А вот план исполнения - вполне можно.Нет, нет, нет... не будем уходить в сторону. :-)

Все вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573849
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов )
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573855
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КифирчикАлексей К, вряд ли есть единый критерий, для каждого он будет свой, исходя из опыта и "политических" взглядов )Я знаю. Поэтому меня всегда удивляет, когда кто-либо обосновывает невозможность чего-либо абстрактной сложностью чего-то там, в данном случае SQL. :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573904
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикисходя из опытаКакая правильная мысль :)

Предлагаю взять в руки интерфейс IQueryProvider и реализовать. Думаю "сложный SQL" быстро всплывёт после применения вашей реализации на реальных данных.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573969
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном SQL". Хочу понять что это такое. Может в этот раз мне повезёт. :-)
Ну, тогда вот так попробуйте: http://stackoverflow.com/questions/3353634/measuring-the-complexity-of-sql-statements
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573971
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КВсе вокруг постоянно твердят о каком-то мифическом "сложном 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 становится невозможным? :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38573991
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-)
А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574008
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КИ при каком количестве набранных очков применение LINQ-to-SQL становится невозможным? :-)
А тут кто-то говорил о невозможности? Речь выше шла (отменя, по крайней мере) о проигрыше в оптимальности.Ну пусть не "невозможность", а "проигрыш в оптимальности". При достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574012
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вот, например, приятно в "сложных запросах" пользоваться ассоциациями и code-complete вместо ручного написания join-ов. Я экономлю на этом массу времени и нервов. Таки сложные SQL-запросы лучше генерировать, а не писать вручную?
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574027
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны, с Алексеем нет смысла спорить.

Конкретно в его проекте, с его структурой БД, и его запросами нет никаких проблем.
Значит и у остальных их не может быть. Проходили уже :)
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574028
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
Не жуть, но факт - не раз было проверено профайлером. В ряде случаев на это можно забить, в ряде такие сложности приходится выносить во вьюху/функцию, и маппить на них - потому как либо пользователи раздражаются на излишнее ожидание, либо админы на излишнее отжирание ресурсов.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574057
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КПри достижении определённой сложности в сгенерированных SQL-запросах лавинообразно увеличится количество чтений? Жуть... :-)
Не жуть, но факт - не раз было проверено профайлером.Вы же не работаете с EF, откуда Вам знать? :-)

EF и NH не совсем не одно и то же.
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574095
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кsphinx_mv Эффективного способа перевода SQL-запросов в C# нет."Рыба есть, ловить надо уметь". (ц)"Тут рыбы нет!" (ц) директор стадиона.
Обратите ЕЩЕ раз внимание на выделенное... То, что LINQ не в полной мере даже просто покрывает функционал "стандартного" SQL - это плохо опровергаемый факт.

И не забудьте, что когда Вы таки используете LINQ-то-"какая-то СУБД/ORM/etc." Вы все-таки транслируете не SQL в LINQ, а LINQ в SQL - что есть "немножко разное"...

При этом я пока еще не предлагаю принять во внимание эффективность получения результатов для LINQ-запросов ии "конечных" SQL-запросов к базе данных. Ну, хотя бы потому, что иначе как минимум для SQL-запросов придется вспомнить, что на разных серверах БД "эффективный" синтаксис SQL-запросов тоже разный...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574098
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККифирчикИменно "сложные запросы" - конечно же остались в ХП и вью.Любой сложный запрос делится на множество простых. Просто мысль... :-)Ну-ну... Как это "по-нашему" - сначала создаем себе проблемы, потом героически их преодолеваем...
Тянем на клиента практически "сырые" данные, а потом их "сливаем" между собой - это, ну, ОЧЕНЬ практично... Даже для выборок из таблиц на пару сотен тысяч записей... А потом начинаем жаловаться, что сервер БД захлебывается от запросов, что сеть слабая, что памяти не хватает и т.д. и т.п...
...
Рейтинг: 0 / 0
Архитектура приложения
    #38574099
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик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 и её отлаживать - менее удобно чем во время работы приложения.Относитесь к БД как к отдельному модулю, который может разрабатываться и отлаживаться отдельно от всех остальных.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Архитектура приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]