Наше большое приложение (VB.Net, Framework 3.5) было разработано более или менее с самого начала использования SQL Server и SQL Server. Конечно, однажды кто-то продал его клиенту с обещанием, что мы можем заставить его работать над Oracle (10 г и выше), и теперь это происходит, но у нас есть значительные проблемы с производительностью.Выполнение параметризованных запросов Работа с SQL Server и Oracle
Это связанно с тем, что почти все SQL (содержащимся в коде приложения) в параметризованных запросах вида
SELECT Col1, Col2, Col3 FROM TableName WHERE IdCol = @EntityId
Это затем передается в нашем слой доступа к данным, а также массив параметров имена, массив типов и массив значений и затем выполняется с использованием Enterprise Library 5 для обработки фактических подключений и т. д.
Когда этот проект начал, кто-то понял, что Oracle требует параметров в виде
:EntityId
и решил, что вместо того, чтобы найти и переписать каждый бит SQL (в одиночку это приложение имеет около миллиона LOC и в пакете есть другие), они добавили бы функцию, которая вызывается непосредственно перед выполнением запроса, который заменяет @: как в массиве запросов, так и в имени параметра. Он также удаляет «WITH NOLOCK», квадратные скобки и заменяет символы конкатенации и другие подобные артефакты, которые использует SQL Server, но какой Oracle нет. Проблема с этим, конечно, в том, что поиск и замена строк является дорогостоящим и в какой-то момент простым действием в приложении выполняется более 2000 простых запросов. Против SQL Server это занимает совсем немного времени, но против платформы Oracle он занимает 20-30 секунд.
В идеале я хотел бы переписать огромные коды кода, чтобы отсеять плохой/неэффективный код и дизайн и исправить изворотливую архитектуру и заменить партию nHibernate или Entity Framework. Но это не произойдет в ближайшее время благодаря коммерческому давлению и размеру задачи.
Учитывая, что я вряд ли будет позволено сделать такие огромные фундаментальные изменения, как переход к ОРМУ или повторно проектированию большого количества кода, мой вопрос довольно прост:
Есть ли способ сделать либо SQL Server или Oracle понимают идентификатор параметра для другого или какой-то разумный, простой способ писать параметризованные запросы в общем виде без огромных замен строк или IF ... Другие заявления зависят от целевой платформы? Я понимаю, что мне все равно придется редактировать почти каждый оператор SQL в приложении, но если это так, то и так, мне просто нужно продать идею моим начальникам.
Приветствия
Это имеет смысл. Мы уже используем EL5, поэтому я рассмотрю блок приложения кэширования и отчитаюсь, если это поможет. Приветствия. –
Я бы также рекомендовал сначала профилировать ваше приложение, чтобы убедиться, что преобразование запросов является узким местом производительности. Всегда лучше начинать с профилирования при работе с проблемами производительности. – Nikolay
Мы уже это сделали - так мы знаем, что это проблема! В некотором смысле это хорошо, поскольку это помогло выявить (и выделить для управления) некоторые из серьезных недостатков дизайна в этом приложении, поэтому они воспринимают это всерьез, а не просто принимают все, что касается разработчиков, желающих «сделать что-нибудь с помощью тек. –