Наше большое приложение (VB.Net, Framework 3.5) было разработано более или менее с самого начала для использования SQL Server и только SQL Server.Конечно, однажды кто-то продал его клиенту с обещанием, что мы сможем заставить его работать на Oracle (10g и выше), и теперь это работает, но у нас есть значительные проблемы с производительностью.
Это связано с тем, чтопочти весь 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.Но это не произойдет в ближайшее время благодаря коммерческому давлению и размеру задачи.
Учитывая, что мне вряд ли позволят сделать такие огромные фундаментальные изменения, как переход на ORM или-архитектирование больших объемов кода, мой вопрос довольно прост:
Есть ли способ заставить SQL Server или Oracle понять идентификатор параметра для другого или какой-то разумный, простой способ написать параметризованные запросы в общемпуть без огромного количества строковых замен или IF ... Остальные операторы зависят от целевой платформы?Я понимаю, что мне, возможно, все еще придется редактировать почти все операторы SQL в приложении, но если это так, то мне просто придется продать эту идею моим боссам.
Приветствия