【发布时间】: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 提到的,不使用绑定变量是性能杀手。修复它。
标签: c# oracle performance query-optimization