Nenakhov, я отвечал на вторую часть сообщения, где вы собираетесь сразу же уволить людей, которые откажутся использовать PostgreSQL и выберут MS SQL или Oracle при разработке корпоративных решений. Вот это свидетельствует о вашей крутости и знании темы. Увольняйте дальше — вы же гуру и в теме.
Речь не про конкретное решение для сайта ГИБДД, а про решения корпоративного уровня, куда никто в здравом уме не будет ставить всякие PostgreSQL и MySQL просто потому, что кроме базы данных требуются значительно более серьезные программные продукты для поддержания всей инфроструктуры предприятия в рабочем состоянии. Microsoft или Oracle могут такое предложить своим клиентам. PostgreSQL — нет.
PostgreSQL на корпоративном рынке?! О госпади, да вас надо держать подальше от этого сектора, раз не знаете, в чем преимущество технологий того же Oracle, и для каких целей все это используется.
Это образ жизни. Людям просто нравится этим заниматься. Точно так же, как другим нравится воевать под огнем противника, спасать попавших в аварии людей или же вязать шерстяные носочки.
Вот мне, как разработчику, приходится частенько ждать, пока нужные инструменты и программы выполнят нужные оптимизации и будут готовы после очередного обновления.
Хорошо, раз непонятно, то вот объяснение по пальцам (подробнее просто некуда)…
У .NET есть проблемы с холодным стартом. При первом запуске какого-либо функционала, этот код необходимо откомпилировать в родной для процессора. Для пользователя это выливается в долгий запуск и задержках (лагах) при работе с программой.
Если хочется, чтобы все сразу и быстро запускалось, надо ЗАРАНЕЕ откомпилировать весь код приложения. Это занимает ВРЕМЯ, иногда довольно много времени. Предварительная компиляция делается как автоматически самой системой при ее простое, так и вызывается вручную при необходимости.
Чтобы пользователи не видели всю сущность NET и их проблемы с медленным запуском, некоторые разработчики ЗАРАНЕЕ компилируют свои приложения, например, при их установки или обновлении (Visual Studio, dbForge for MySQL и т.п.).
Обычно приложения обновляются при запуске или через соответсвующую кнопку. А это значит, что после обновления пользователь хочет продолжить работать с программой как ни в чем не бывало. Что в свою очередь приводит к необходимости повторной компиляции кода, иначе — «привет, тормоза».
Любые, которые что-либо встраивают в оболочку IDE (например, компоненты и утилиты от DevExpress). Во время установки или обновления можно запустить Process Explorer и посмотреть, как вызывается ngen-сервис для компиляции (как раз тот самый, из MSDN, который «запускается отложенно во время простоя Windows»).
Кстати, если вдруг у вас на компьютере установлено много «больших» NET-приложений (Visual Studio, MS SQL Server со своими утилитами и т.п.) и включен такой сервис оптимизации — готовтесь к тому, что размер системной папки будет расти день ото дня (и когда-нибудь отъест от нескольких сотен, до 1-2 Гб места на диске).
Под «поместить в GAC» подразумевалась сборка всех модулей и их предварительная компиляция в нативный код с помощью утилиты NGEN (где эта сборка будет лежать — не важно — в GAC или в другом месте). Как раз благодаря этому можно значительно ускорить загрузку net-приложений. Даже в той же самой Visual Studio при добавлении, изменении или удалении компонентов это делается.
Версия 3.5 написана на .NET, WPF.
Версия 4.0 написана на C++.
Цитата ( habrahabr.ru/company/evernote/blog/106994/ ):
В ходе тестирования с аппаратным обеспечением мы установили, что Evernote 4 запускается в пять раз быстрее и использует в два раза меньше памяти, чем Evernote 3.5.
NET-приложения ужасно долго запускаются (на порядок дольше родного win-кода). Чтобы стало нормально работать, их надо еще и заранее откомпилировать. Скачал обновление? Будь добр подожди 5 минут, пока приложение повторно откомпилируется и поместится в GAC.
Есть стандартная функция Replace для замены текста. Она прекрасно справляется со своими обязанностями по замене и вставке нужных данных в шаблоне. И никаких самопальных алгоритмов по распознаванию и поиску слов.
Evernote 4 кардинально отличается от Evernote 3.5 по всем параметрам. Хотя версия 3.5 и добавила множество отличных новых возможностей, в ней мы столкнулись с рядом проблем, которые невозможно было легко исправить: размытый шрифт, долгое время загрузки, большое потребление памяти и плохая поддержка видеокарт. Все это было обусловлено спецификой технологий, лежащих в основе 3.5 (Windows .NET и WPF), на которые мы никак не могли повлиять. В конечном итоге мы скатились к борьбе с ошибками платформы вместо работы над новыми возможностями, о которых нас просили пользователи.
В итоге мы решили начать с нуля, используя только C++, в котором мы были уверены. Как вы сами увидите, результат получился просто удивительный. Эта новая версия положит основу для более быстрого развития Windows-клиента.
Тему про Evernote прочитать было лень? Причем тут вообще линукс? Речь идет про популярное приложение, установленное на миллионах пользовательских компьютерах. Мне больше интересен опыт реального применения технологий, а не куча воды с «marketing-bullshit» на очередной конференции.
Подискутировать можно было бы в теме про Evernote и огромных проблемах с WPF и Net Framework'ом, из-за чего они были вынуждены отказаться от «модных технологий». Но, к сожалению, представители Майкрософт на хабре полностью обходят стороной эту тему, как будто никаких проблем и вовсе не существует.
У меня-то как раз простой запрос на объединение двух таблиц с одним BETWEEN-условием, работающий при любых периодах для вывода и без каких-либо ограничений по использованию. Если использовать совет xtender'а по замене STR_TO_DATE(DATE_FORMAT()) на LAST_DAY, то код визуально уменьшится и будет выполняться в 2-3 раза быстрее.
А вот у вас — куча левого кода, велосипед для определения, находится ли дата между двумя другими датами (самопальная реализация BETWEEN), куча ограничений на использование данной методики и КУЧА SQL-кода. Одним словом — костыль, которому просто не место в продакшене (коллеги будут без ума от счастья увидев код функции isEventInMonth).
Функции и процедуры будут работать медленнее единого блока SQL по определению — в силу того, что все они выполняются в отдельности и к ним нельзя применять оптимизации и разные планы выполнения, их нельзя свернуть или развернуть для использования специфичных индексов или уменьшения обрабатываемых данных. Исключение, пожалуй, может составить только код, результат которого зависит исключительно от входных параметров — тогда со стороны СУБД возможны оптимизации и кеширование результатов.
Выводит список месяцев и кол-во активных событий (которые начались, закончились или продолжаются в соответствующий период):
SELECT
MONTHNAME(d.month) AS R_MONTH_NAME,
(SELECT
COUNT(*)
FROM
myevents e
WHERE
d.month BETWEEN STR_TO_DATE(DATE_FORMAT(e.start_date, '01.%m.%Y'), '%d.%m.%Y') AND STR_TO_DATE(DATE_FORMAT(e.end_date, '01.%m.%Y'), '%d.%m.%Y'))
AS R_COUNT
FROM
dates d
Здесь:
dates — таблица или запрос, возвращающий список месяцев, за который надо вывести статистику
myevents — таблица со списком событий
Хорошо, раз непонятно, то вот объяснение по пальцам (подробнее просто некуда)…
У .NET есть проблемы с холодным стартом. При первом запуске какого-либо функционала, этот код необходимо откомпилировать в родной для процессора. Для пользователя это выливается в долгий запуск и задержках (лагах) при работе с программой.
Если хочется, чтобы все сразу и быстро запускалось, надо ЗАРАНЕЕ откомпилировать весь код приложения. Это занимает ВРЕМЯ, иногда довольно много времени. Предварительная компиляция делается как автоматически самой системой при ее простое, так и вызывается вручную при необходимости.
Чтобы пользователи не видели всю сущность NET и их проблемы с медленным запуском, некоторые разработчики ЗАРАНЕЕ компилируют свои приложения, например, при их установки или обновлении (Visual Studio, dbForge for MySQL и т.п.).
Обычно приложения обновляются при запуске или через соответсвующую кнопку. А это значит, что после обновления пользователь хочет продолжить работать с программой как ни в чем не бывало. Что в свою очередь приводит к необходимости повторной компиляции кода, иначе — «привет, тормоза».
Кстати, если вдруг у вас на компьютере установлено много «больших» NET-приложений (Visual Studio, MS SQL Server со своими утилитами и т.п.) и включен такой сервис оптимизации — готовтесь к тому, что размер системной папки будет расти день ото дня (и когда-нибудь отъест от нескольких сотен, до 1-2 Гб места на диске).
Версия 3.5 написана на .NET, WPF.
Версия 4.0 написана на C++.
Цитата ( habrahabr.ru/company/evernote/blog/106994/ ):
В ходе тестирования с аппаратным обеспечением мы установили, что Evernote 4 запускается в пять раз быстрее и использует в два раза меньше памяти, чем Evernote 3.5.
Selection.Find.Execute(Replace := wdReplaceAll);
habrahabr.ru/company/evernote/blog/106994/
А вот и цитата оттуда:
Evernote 4 кардинально отличается от Evernote 3.5 по всем параметрам. Хотя версия 3.5 и добавила множество отличных новых возможностей, в ней мы столкнулись с рядом проблем, которые невозможно было легко исправить: размытый шрифт, долгое время загрузки, большое потребление памяти и плохая поддержка видеокарт. Все это было обусловлено спецификой технологий, лежащих в основе 3.5 (Windows .NET и WPF), на которые мы никак не могли повлиять. В конечном итоге мы скатились к борьбе с ошибками платформы вместо работы над новыми возможностями, о которых нас просили пользователи.
В итоге мы решили начать с нуля, используя только C++, в котором мы были уверены. Как вы сами увидите, результат получился просто удивительный. Эта новая версия положит основу для более быстрого развития Windows-клиента.
А вот у вас — куча левого кода, велосипед для определения, находится ли дата между двумя другими датами (самопальная реализация BETWEEN), куча ограничений на использование данной методики и КУЧА SQL-кода. Одним словом — костыль, которому просто не место в продакшене (коллеги будут без ума от счастья увидев код функции isEventInMonth).
SELECT
MONTHNAME(d.month) AS R_MONTH_NAME,
(SELECT
COUNT(*)
FROM
myevents e
WHERE
d.month BETWEEN STR_TO_DATE(DATE_FORMAT(e.start_date, '01.%m.%Y'), '%d.%m.%Y') AND STR_TO_DATE(DATE_FORMAT(e.end_date, '01.%m.%Y'), '%d.%m.%Y'))
AS R_COUNT
FROM
dates d
Здесь:
dates — таблица или запрос, возвращающий список месяцев, за который надо вывести статистику
myevents — таблица со списком событий