2012-03-28 2 views
4

Наше большое приложение (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 в приложении, но если это так, то и так, мне просто нужно продать идею моим начальникам.

Приветствия

ответ

1

Я думаю, что самый простой способ это просто для оптимизации запросов преобразования. Например, вы можете просто кэшировать преобразованные запросы и как только запрос будет преобразован, а затем в следующий раз, когда вам нужно его преобразовать, вы jast возьмите его из кеша. И вы можете просто использовать хэш-код строки запроса в качестве ключа для кеширования. Подобно кэшированию планов запросов. А также вы можете профилировать и оптимизировать преобразование запросов.

Этот простой подход к кешированию используется в реальном приложении. Например, поставщик NHibernate Linq (в NH3.0) преобразует выражения Linq в AST, это внутренний язык HQL, а затем преобразует его в sql. И на каждом шаге он кэширует «планы запросов», поэтому, если один и тот же запрос (такая же структура, разные параметры) необходимо снова преобразовать, nh может просто взять его из кеша

+0

Это имеет смысл. Мы уже используем EL5, поэтому я рассмотрю блок приложения кэширования и отчитаюсь, если это поможет. Приветствия. –

+0

Я бы также рекомендовал сначала профилировать ваше приложение, чтобы убедиться, что преобразование запросов является узким местом производительности. Всегда лучше начинать с профилирования при работе с проблемами производительности. – Nikolay

+0

Мы уже это сделали - так мы знаем, что это проблема! В некотором смысле это хорошо, поскольку это помогло выявить (и выделить для управления) некоторые из серьезных недостатков дизайна в этом приложении, поэтому они воспринимают это всерьез, а не просто принимают все, что касается разработчиков, желающих «сделать что-нибудь с помощью тек. –