ORACLE & VS 2005 производительность проблема - PullRequest
0 голосов
/ 31 января 2020

Я оцениваю проблемы с производительностью в приложении для ввода данных, используя c# (VS 2005), framework 2.0 с ORACLE 11. Приложение используют более 120 человек в сети. В основном, задача проста, только проверить данные о зарплате в документах, а затем записать их в базу данных. Для достоверности данных пользователь чаще всего проверяет идентификационный номер сотрудника или его имя или фамилию в большой базе данных (5 миллионов). Иногда во время выполнения задачи приложение на мгновение блокируется (от нескольких секунд до нескольких минут), что делает невозможным продолжение работы. Эта проблема не обеспечивает продуктивности и приводит к значительным задержкам при планировании работы.

Приложение (3 уровня: внешний интерфейс, средний уровень и серверная часть) использует основные таблицы для проверки данных и просмотра сетки для добавления, изменения или удаления данных. На данный момент обновление ИТ невозможно.

Первый вопрос: Мне интересно, является ли хорошей практикой использование представлений вместо основных таблиц для сокращения накладных расходов и блоков приложений?

Запросы для поиска данных:

Для поиска по EmployeeID:

SELECT name FROM employees WHERE id = EmployeeID OR af = EmployeeID;

(только поле идентификатора - PK, поле af соответствует другому идентификационному номеру, но не у всех есть it)

Для поиска по имени:

SELECT id, DECODE(complete_name, null, name_null) name, first_name, last_name, sex FROM employees WHERE name_null LIKE CONVERT(REPLACE'" + first_name.ToUpper() + "%" + last_name.ToUpper() + "%" + "','Ñ','N'),'US7ASCII')" OR name_null LIKE CONVERT(REPLACE'" + last_name.ToUpper() + "%" + first_name.ToUpper() + "%" + "','Ñ','N'),'US7ASCII')";

Эти два запроса создаются в функциях, поэтому данные возвращаются по запросу. Затем данные отображаются в DataGrids для пользователя.

Второй вопрос: Если есть другие способы оптимизации запросов, учитывая представленные факты?

Спасибо за любой совет.

1 Ответ

0 голосов
/ 31 января 2020

Я не думаю, что вы можете исправить это со стороны приложения, и вам нужно искать решение в БД. Я рекомендую создавать и тестировать индексы для employee.name_null и employee.af. Если вы видите задержки, о которых упоминаете, это, вероятно, связано с полным просмотром таблиц на таблицах сотрудников (не «блокировкой» [блокировки блокировок можно проверить согласно SQL ниже]); Вы можете проверить это, изучив план выполнения для подозреваемого медленного SQL.

select * from
(
SELECT distinct inst_id "Inst Id"
       , LPAD('>', (level-1)*2, '>') || NVL(s.username, '(oracle)') AS "Username" 
       , TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS "Logon Time"
       , s.osuser
       , s.sid "Session Id"
       , s.serial# "Sess Ser#"
       , s.blocking_session "Session Id (Blocker)"
       , s.blocking_instance "Inst Id (Blocker)"
       , s.status "Sess Status"
       , s.event "Event Name"
       , s.sql_id
       , (select max(sql_text) from gv$sqlarea sa where sa.sql_id = s.sql_id) sql_text
       , s.module
       , s.machine
       , s.program
       , s.lockwait
       , level
FROM   gv$session s
where (sid, inst_id) in (select blocking_session, blocking_instance from gv$session) or blocking_session is not null
CONNECT BY PRIOR s.sid = s.blocking_session
START WITH s.blocking_session IS NULL
--order by  LPAD('>', (level-1)*2, '>') || NVL(s.username, '(oracle)') desc, blocking_Session
order by  (level-1)*2 , blocking_Session
)
where "Session Id" = nvl(:sid_blk, "Session Id") or "Session Id (Blocker)" = nvl(:sid_blk,"Session Id (Blocker)")
;
...