ORACLE & VS 2005 性能问题

Posted

技术标签:

【中文标题】ORACLE & VS 2005 性能问题【英文标题】:ORACLE & VS 2005 performance issue 【发布时间】:2020-01-31 14:43:23 【问题描述】:

我正在使用 c# (VS 2005)、框架 2.0 和 ORACLE 11 评估数据输入应用程序的性能问题。超过 120 人在线使用该应用程序。基本上任务很简单,只需验证论文中的工资数据,然后将它们写入数据库。为了使数据有效,用户最常在大型数据库(500 万)中验证员工身份 ID 或名字或姓氏。有时在任务期间,应用程序会阻塞片刻(几秒钟到几分钟),无法继续工作。此问题缺乏生产力,并导致工作计划严重延误。

应用程序(3 层:前端、中间层和后端)使用主表来验证数据,并使用网格视图来添加、修改或删除数据。目前,不可能进行 IT 改造。

第一个问题:我想知道使用视图而不是主表来减少开销和应用程序块是否是一种好习惯?

搜索数据的查询是:

按 EmployeeID 搜索:

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

(只有id字段是PK,af字段对应其他识别号但不是每个人都有)

按名称搜索:

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) 视图可以降低查询的复杂性,但绝不会降低开销和应用程序块。2) 您必须发布您的查询的执行计划和一些其他信息请参阅the discussion here。 第二个查询很可能不使用绑定变量,这可能是120个并发会话的广泛解析的严重问题。跨度> 正如@MarmiteBomber 提到的,不使用绑定变量是性能杀手。修复它。 【参考方案1】:

我认为您无法从应用程序端解决此问题,需要在数据库中查找解决方案。我建议在employees.name_null 和employees.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)")
;

【讨论】:

以上是关于ORACLE & VS 2005 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

我用vs2005连接oracle数据库,提示我说ORA-12504: TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME

如何使用VS2008中集成的SQL Server 2005 Express?

如何使用VS2005输出所有环境变量

尝试在 Visual Studio 2005 上运行使用 Oracle 库的应用程序

Oracle 11g IFS VS IFFS 性能对比

Microsoft Oracle和SAP & ERP vs. CRM