- 浏览: 1197870 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
如何通过跟踪一个客户端程序发出的sql的方法来优化SQL
简要说来,跟踪一个客户程序发出的SQL主要分成下面几步:
1) 识别要跟踪的客户端程序到数据库的连接(后面都用session代替),主要找出能唯一识别一个session的sid与serial#.
2) 设定相应的参数,如打开时间开关(可以知道一个sql执行了多长时间),存放跟踪数据的文件的位置、最大值。
3) 启动跟踪功能
4) 让系统运行一段时间,以便可以收集到跟踪数据
5) 关闭跟踪功能
6) 格式化跟踪数据,得到我们易于理解的跟踪结果。
现在就每一步,给出详细的说明:
1) 识别要跟踪的客户端程序到数据库的数据库连接
查询session信息(在sql*plus中运行):
set linesize 190
col machine format a30 wrap
col program for a40
col username format a15 wrap
set pagesize 500
select s.sid sid, s.SERIAL# "serial#", s.username, s.machine, s.program,
p.spid ServPID, s.server,s.login_time
from v$session s, v$process p
where p.addr = s.paddr ;
如得到的一个查询结果如下:
SID serial# USERNAME MACHINE PROGRAM SERVPID SERVER
---- ------- -------- ------------------ ------------- --------- ---------
8 3 SCOTT WORKGROUP\SUNNYXU SQLPLUS.EXE 388 DEDICATED
LOGON_TIME
------------------
2005.06.28 18:50:11
上面的结果中比较有用的列为:
sid, serial# : 这两个值联合起来唯一标识一个session
username : 程序连接数据库的用户名
machine : 连接数据库的程序所在的机器的机器名,可以hostname得到
program : 连接数据库的程序名,所有用java jdbc thin的程序的名字都一样,
servpid : 与程序对应的服务器端的服务器进程的进程号,在unix下比较有用
server : 程序连接数据库的模式:专用模式(dedicaed)、共享模式(shared)。 55
只有在专用模式下的数据库连接,对其进程跟踪才有效
logon_time : 程序连接数据库的登陆时间
根据machine, logon_time 可以方便的识别出一个数据库连接对应的session,从而得到该sesion的唯一标识sid, serial#, 为对该session进行跟踪做好准备
2) 设定相应的参数
参数说明:
timed_statistics : 收集跟踪信息时,是否将收集时间信息,如果收集,
则可以知道一个sql的各个执行阶段耗费的时间情况
user_dump_dest : 存放跟踪数据的文件的位置
max_dump_file_size : 放跟踪数据的文件的最大值,防止由于无意的疏忽,
使跟踪数据的文件占用整个硬盘,影响系统的正常运行
设置的方法:
SQL> exec sys.dbms_system.set_bool_param_in_session( -
sid => 8, -
serial# => 3, -
parnam => 'timed_statistics', -
bval => true);
SQL> alter system set user_dump_dest='c:\temp';
-- 注意这个语句会改变整个系统的跟踪文件存放的位置,所以我一般不改这个参数,而用系统的缺省值,要查看当前系统的该参数的值,可以用system用户登陆后:
SQL> show parameter user_dump_dest
SQL> exec sys.dbms_system.set_int_param_in_session( -
sid => 8, -
serial# => 3, -
parnam => 'max_dump_file_size', -
intval => 2147483647)
注意有时会报 错:提示信息如下
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'SYS.DBMS_SYSTEM'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
原因是没有全权,解决办法 SQL> conn / as sysdba;
3) 启动跟踪功能
SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 3, true);
注意,只有跟踪的session再次发出sql语句后,才会产生trc文件
4) 让系统运行一段时间,以便可以收集到跟踪数据
5) 关闭跟踪功能
SQL> exec sys.dbms_system.set_sql_trace_in_session(8,3,false);
6) 格式化跟踪数据,得到我们易于理解的跟踪结果。
对产生的trace文件进行格式化:
在命令提示符下,运行下面的命令 56
tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER
其它使用tkprof的例子:
(a) tkprof tracefile.trc sort_1.prf explain=apps/your_apps_password print=10 sort='(prsqry,exeqry,fchqry,prscu,execu,fchcu)' (b) tkprof tracefile.trc sort_2.prf explain=apps/your_apps_password print=10 sort='(prsela,exeela,fchela)' (c) tkprof tracefile.trc sort_3.prf explain=apps/your_apps_password print=10 sort='(prscnt,execnt,fchcnt)' (d) tkprof tracefile.trc normal.prf explain=apps/your_apps_password
现对tkprof程序做进一步的说明:
在打开跟踪功能后,oracle将被跟踪session中正在执行的SQL的性能状态数据都收集到一个跟踪文件中。这个跟踪文件提供了许多有用的信息,例如一个sql的解析次数、执行次数、fetch次数、物理读次数、逻辑读次数、CPU使用时间等,利用这些信息可以诊断你的sql的问题,从而用来优化你的系统。不幸的是,生成的跟踪文件中的数据是我们难以理解的,所以要用TKPROF工具对其进行转换,转换成我们易于理解格式。tkprof是oracle提供的实用工具,类似于sql*plus,在安装完oracle客户端后就自动安装到系统中,直接在命令符下用就可以了。
当在打开跟踪功能时发生了recursive calls,则tkprof也会产生这些recursive calls的统计信息,并清楚的在格式化输出文件中标名它们为recursive calls。
注意:recursive calls的统计数据是包含在recursive calls上的,并不包含在引起该recursive calls语句的sql语句上面。所以计算一个sql语句耗费的资源时,也要考虑该sql语句引起recursive calls语句花费的资源。通过将sys参数设为no时,我们变可以在格式化的输出文件中屏蔽掉这些recursive calls信息。
如何得到tkprof的帮助信息:
运行tkprof时,不带任何参数,就可以得到该工具的帮助信息。
执行计划:
---------------
一个语句的执行计划是oracle执行这个sql语句的一系列指令。通过检验执行计划,你可以更好的知道oracle如何执行你的sql语句,这个信息可以帮助你决定是否你写的sql语句已经使用了索引。
如果在tkprof中指定了EXPLAIN参数,tkprof使用EXPLAIN PLAN命令来为每个被跟踪的sql语句产生执行计划。
使用说明:
TKPROF工具接受一个trace文件作为输入文件,利用提供给命令的多个参数对trace文件进行分析,然后将格式化好的结果放到一个输出文件中。
TKPROF的使用语法: 57
----------------
TKPROF command ::=
>>-- TKPROF traced_file formatted_file ---------------------------------------------->
| |
+- SORT = ---------------------------------+
| |
+-- OPTION --+
| |
| +---- , ----+ |
| V | |
|__( OPTION )__|
>----------------------------------------------------------------------------->
| | | | | |
+-- PRINT = integer --+ +-- INSERT = filname3 --+ +-- SYS = ---------+
| |
+- YES -+
| |
+- NO --+
>----------------------------------------------------------------------------->
| |
+---------------------------------------- EXPLAIN = user/password ------+
| |
+---- TABLE = schema.table ----+
>----------------------------------------------------------------------------><
| |
+---- RECORD = filname ----+
各个参数的含义:
' traced_file '
指定输入文件,即oracle产生的trace文件,该文件中可以只包含一个
session的跟踪信息,也可以包含系统中所有session的信息(此时需要在
系统级进行跟踪)
'formatted_file'
指定输出文件,即我们想得到的易于理解的格式化文件,我们利用该文件
对会话运行的sql进行分析。
'EXPLAIN'
利用哪个用户对trace文件中的sql进行分析,从而得到该sql语句的
执行计划,这也说明在trace file中并没有各个sql语句的执行计划,只是在运
行tkprof程序时才将trace file文件中的sql语句用explian参数指定的
用户连接到数据库,然后运用EXPLAIN PLAN命令生成sql的执行计划。 58
这个用户一般是你的程序中连接数据库的用户
'TABLE'
在对sql语句进行分析时,将产生的执行计划暂时存放到该表中。
一般不需要该参数,这样当表不存在时,tkprof会自动创建相应的表,
并在分析完之后,将创建的表自动删除。如果要指定自定义的表,该表的结构
必须与utlxplan.sql文件中指定的表的结构一样。
我一般不设置这个参数,让其采用默认的表名,并自动创建、删除
'SYS'
是否对sys用户运行的sql语句或被跟踪session产生的recursive SQL
也进行分析,并将分析结果放到输出文件中。缺省值为YES。
我一般设为NO,这样输出文件中只包含我发出的sql语句,
而不包含系统产生的sql。
SORT
按照指定的排序选项(条件)对格式化好的sql语句进行降序排列,然后存放
到输出文件中。可以将多个排序选项组合起来,如果没有指定排序选项,
则按照使用sql的先后顺序。
排序选项有:
prscnt number of times parse was called
prscpu cpu time parsing
prsela elapsed time parsing
prsdsk number of disk reads during parse
prsqry number of buffers for consistent read during parse
prscu number of buffers for current read during parse
prsmis number of misses in library cache during parse
execnt number of execute was called
execpu cpu time spent executing
exeela elapsed time executing
exedsk number of disk reads during execute
exeqry number of buffers for consistent read during execute
execu number of buffers for current read during execute
exerow number of rows processed during execute
exemis number of library cache misses during execute
fchcnt number of times fetch was called
fchcpu cpu time spent fetching
fchela elapsed time fetching
fchdsk number of disk reads during fetch
fchqry number of buffers for consistent read during fetch
fchcu number of buffers for current read during fetch
fchrow number of rows fetched
userid userid of user that parsed the cursor
PRINT
只列出指定数量的已排序的sql语句,排序的条件参见SORT参数。
如果忽略此参数,tkprof将跟踪文件中的所有的sql语句及其相关的 59
分析数据存放到输出文件中。
Print与sort参数组合在一起,可以实现:
找出某一阶段耗费cpu最多的前n个sql
找出某一阶段读硬盘最多的前n个sql等等。
INSERT
创建一个sql脚本文件,里面包含create table 与insert语句。
利用这个脚本文件创建一个表及插入数据后,可以得到跟踪文件中
所有sql语句(包含recursive SQL)的统计信息。如
,depth,user_id,
parse_cnt,parse_cpu,parse_elap,parse_disk,
parse_query,parse_current,parse_miss
,exe_count,exe_cpu,exe_elap,exe_disk,exe_query,
exe_current,exe_miss,exe_rows
,fetch_count,fetch_cpu,fetch_elap,fetch_disk,
fetch_query,fetch_current,fetch_rows,ticks
,sql_statement。
利用这些信息,也可以发现有问题的sql。即是格式化好的输出文件中
有关sql性能信息数据的数据库表的形式。
我一般不用该参数
RECORD
创建一个包含客户端程序发出的所有的sql语句的脚本文件。
注意,并不包含recursive SQL 。想知道它的用处吗?
对了可以窥探别人程序是如何访问数据库的,从而对了解程序的访问流程。
此时,最好不用sort参数,这样就可以按先后发出的顺序的到sql.
例子1:
将跟踪文件"dsdb2_ora_18468.trc"进行分析,并将其格式的结果放到"dsdb2_trace.out"文件中:
TKPROF dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER
上面的例子中:
EXPLAIN参数让TKPROF程序连接到SCOTT用户,然后用EXPLAIN PLAN命令给跟踪文件中的sql语句产生执行计划。SYS参数的值为NO,这样TKPROF就会忽略该跟踪文件中的recursive SQL。
例子2:
TKPROF DLSUN12_JANE_FG_SVRMGR_007.TRC OUTPUTA.PRF
EXPLAIN=SCOTT/TIGER TABLE=SCOTT.TEMP_PLAN_TABLE_A
INSERT=STOREA.SQL SYS=NO SORT=(EXECPU,FCHCPU)
注意上面的所有命名应该都在一行中,否则需要有换行符。
上面的例子中: 60
TABLE参数使TKPROF使用scott用户下的TEMP_PLAN_TABLE_A表作为临时存放sql执行计划的表。
INSERT参数使TKPROF产生一个名为STOREA.SQL的脚本文件,存放所有被跟踪的sql语句的统计数据。
SORT参数使TKPROF先按照sql语句使用的cpu执行时间与该语句fetch操作使用的cpu时间进行排序,然后将其写到输出文件中。
解释tkprof程序产生的格式化文件:
tkprof的格式化输出文件主要包含两大部分:
header
body
summary
header:
主要包括一些描述信息,如TKPROF的版本、运行时间,各个统计项的描述。如:
TKPROF: Release 8.1.7.0.0 - Production on 星期四 6月 30 13:10:59 2005
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Trace file: D:\oracle\admin\xyj\udump\ORA01720.TRC
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
body:
是我们主要关心的地方,有我们感兴趣的信息。如sql语句、sql语句的统计信息、sql语句的执行计划等。如
select *
from
emp
call count cpu elapsed disk query current rows
------- ----- ----- ------- ----- ------ -------- -----
Parse 3 0.00 0.00 1 0 1 0
Execute 3 0.00 0.00 0 0 0 0
Fetch 6 0.00 0.00 1 6 12 36 61
------- ----- ----- ------- ----- ------ -------- -----
total 12 0.00 0.00 2 6 13 36
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 19 (SCOTT)
Rows Row Source Operation
------- ---------------------------------------------------
12 TABLE ACCESS FULL EMP
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
12 TABLE ACCESS (FULL) OF 'EMP'
DELETE FROM RM$HASH_ELMS
call count cpu elapsed disk query current rows
------- ------ ------ -------- ----- ------ -------- ----
Parse 2 0.00 0.00 0 0 0 0
Execute 29 12.04 12.61 6786 6853 108 19
Fetch 0 0.00 0.00 0 0 0 0
------- ------ ------ -------- ----- ------ -------- ----
total 31 12.04 12.61 6786 6853 108 19
Misses in library cache during parse: 0
Optimizer hint: CHOOSE
Parsing user id: 9 (DES12A) (recursive depth: 3)
Rows Execution Plan
------- ---------------------------------------------------
0 DELETE STATEMENT HINT: CHOOSE
16 TABLE ACCESS (FULL) OF 'RM$HASH_ELMS'
summary:
对所有的sql语句各个执行阶段的统计数据的汇总:
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS - - 标明是用户发出的sql语句的统计数据的汇总
call count cpu elapsed disk query current rows
------- ------ -------- -------- ----- ------ -------- -----
Parse 7 0.00 0.00 2 201 2 0
62
Execute 7 0.00 0.00 1 2 7 1
Fetch 10 0.00 0.00 2 67 16 52
------- ------ -------- -------- ----- ------ -------- -----
total 24 0.00 0.00 5 270 25 53
Misses in library cache during parse: 5
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS - - 标明是系统发出的sql语句的统计数据的汇总
call count cpu elapsed disk query current rows
------- ------ ------ -------- ----- ------ -------- ----
Parse 75 0.00 0.00 2 3 2 0
Execute 81 0.00 0.00 1 1 5 1
Fetch 153 0.00 0.00 21 355 0 110
------- ------ ------ -------- ----- ------ -------- ----
total 309 0.00 0.00 24 359 7 111
Misses in library cache during parse: 29
8 user SQL statements in session.
74 internal SQL statements in session.
82 SQL statements in session.
5 statements EXPLAINed in this session.
*********************************************************************
Trace file: D:\oracle\admin\xyj\udump\ORA01720.TRC
Trace file compatibility: 8.00.04
Sort options: default
1 session in tracefile.
8 user SQL statements in trace file.
74 internal SQL statements in trace file.
82 SQL statements in trace file.
34 unique SQL statements in trace file.
5 SQL statements EXPLAINed using schema:
SCOTT.prof$plan_table
Default table was used.
Table was created.
Table was dropped.
825 lines in trace file.
现只对body中的每部分作出详细说明: 63
1) sql语句的统计信息
我们把select语句的执行过程分成3个阶段(分析
- 通过分析SQL语句的执行计划优化SQL_总结_.rar (552.7 KB)
- 下载次数: 44
发表评论
-
并发行级锁超2秒报警监控sql
2010-07-20 16:18 1939并发行级锁超2秒报警监控sql -
数据设计规范v
2010-06-22 19:47 0数据设计规范v -
Oracle 有趣排序包括那些
2010-06-20 16:51 1452按拼音排序 select * from table ... -
Oracle sql 性能优化调整
2010-06-20 16:15 1395Oracle sql ... -
Delete、Drop、Truncate的比较(转)
2010-05-31 13:39 1475Delete、Drop、Truncate的比较 关键字: d ... -
Oracle误操作解决方案(转)
2010-05-31 13:35 1392Oracle误操作解决方案 文章分类:数据库 一.误删除数 ... -
一个递归调用的存储过程
2010-04-19 01:51 1848一个递归调用的存储过程 -
oracle index学习总结
2009-12-08 10:44 19629oracle index 1.index需要储存空间 ... -
Jdbc 和hibernate
2009-11-16 23:38 1875Jdbc 和hibernate 一、Jdbc是java ... -
去掉 powerDesigner 中表设计时的 name和code联动的功能
2009-11-16 17:04 3485去掉 powerDesigner 中表设计时的 name和co ... -
oracle数据库索引未被使用的问题及其解决2007
2009-11-15 01:42 2132一次,在进行WEB页面上进行历史数据文件检查时,发现数据库访问 ... -
RMAN配置及备份与恢复练习
2009-09-27 18:06 16261.创建表空间SQL>create tablespace ... -
误删除数据后怎么立即恢复(不考虑全库备份和利用归档日志)
2009-09-27 18:01 3385要达到删除数据,有以下几种方式都可以:1、delete2、dr ... -
IMP数据到指定的表空间
2009-09-27 12:47 9103IMP数据到指定的表空间 一直以来,我都认为只要指定用户的默 ... -
ORACLE UPDATE 语句语法与性能分析
2009-09-27 09:49 1880为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在 ... -
oracle job 例子
2009-09-22 12:38 3064一、设置初始化参 ... -
oracle 时间加减综合
2009-09-17 11:43 1981加法 select sysdate,add_mon ... -
详细介绍ORACLE sqlplus命令
2009-09-09 16:42 2061一、ORACLE的启动和关闭1、在单机环境下要想启动或关闭OR ... -
AWR介绍与SYSAUX空间关系 SYASAUX表空间满了 系统慢
2009-09-08 09:45 7957AWR介绍与SYSAUX空间关系 2007-11-05 14 ... -
to_char 'NLS_DATE_LANGUAG参数
2009-09-02 18:41 1481select to_char(sysdate, 'Day'), ...
相关推荐
Sql Monitor 是一款强大的数据库监控工具,专为开发者和DBA设计,用于跟踪和分析客户端应用程序发出的SQL语句。在程序开发和系统调试过程中,它能提供宝贵的性能优化信息,帮助用户快速定位并解决问题。 首先,Sql ...
4. **数据库性能监控**:定期检查SQL Server的性能,如内存使用、磁盘I/O、查询效率等,及时调整配置或优化SQL语句,确保系统运行顺畅。 三、系统功能模块详解 1. **商品管理**:包括商品信息录入、修改、删除,...
一个完整的超市进销存管理系统可能包含客户端应用程序(使用C#开发)、服务器端应用程序(如WCF服务)和数据库服务器(运行SQL Server)。客户端通过网络与服务器交互,完成数据的录入、查询和同步。服务器端处理...
【标题】"机房管理系统 vb+sql2000"是一个基于Visual Basic(VB)编程语言和Microsoft SQL Server 2000数据库开发的管理软件,主要用于管理和监控机房的各种设备和运行状况。该系统可能涵盖了机房资产的登记、维护、...
总的来说,"jsp 图书管理系统"是一个综合运用了Web开发技术、数据库管理和软件工程实践的实例,它不仅展示了如何利用JSP和SQL2005构建一个实用的信息系统,还涉及到了用户体验设计、系统安全性和性能优化等多个方面...
在这个项目中,我们采用的是一个基于VC++的客户端应用程序,它与SQL Server 2000数据库进行交互,利用ADO(ActiveX Data Objects)控件来实现数据的连接和操作。这样的设计不仅提高了系统的可移植性,也确保了其实用...
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...
- **基于 ActionForm**:通过在 `ActionForm` 类中重写 `validate()` 方法来验证数据。 - **基于拦截器**:使用 Struts2 的拦截器进行数据验证。 #### 30. JavaScript起到什么样的作用,在项目中如何使用? ...
物流管理系统是一种基于JAVAWeb技术构建的应用程序,主要...总的来说,物流管理系统是一个综合性的JAVAWeb项目,涵盖了众多编程和系统设计的实践内容,对于提升学生的技能和理解企业级应用的开发流程具有重要的价值。
- **多态**:多态是指程序中定义的引用变量所指向的具体对象和通过该对象发出的方法调用在运行时才能确定。多态允许一个接口绑定到不同的类实现上,从而使该引用调用的具体方法随之改变。这是一种强大的特性,可以在...
1. **调用链监控**:通过跟踪每个请求在整个系统中的流转过程,形成完整的调用链,使开发者能清晰地了解请求的处理流程,找出性能瓶颈。 2. **服务监控**:监控服务的QPS(每秒查询率)、成功率、平均响应时间等...
在本项目中,"ASP基于网络环境的库存管理系统的设计与实现"是一个使用ASP技术构建的库存管理解决方案,它旨在通过网络环境提高库存管理效率和准确性。下面将详细介绍这个系统的关键组成部分和技术要点。 1. **系统...
总的来说,ASP基于BS结构的仓储物流管理系统是一个综合运用Web技术、数据库管理和物流知识的实践项目,对于学习者来说,通过研究源代码和相关论文,可以深入理解ASP开发、Web应用架构以及仓储管理流程。
ASP服装销售系统设计是一个基于Web的应用程序,旨在管理和优化服装销售流程。该系统的主要目标是为小型至中型企业提供一个高效、便捷的平台,用于跟踪库存、管理订单、处理客户信息以及进行销售分析。以下是对这个...
本系统结合SQL Server数据库技术,构建了一个B/S(Browser/Server)三层架构的管理平台,旨在提升井下作业工具的管理水平,优化资源配置,降低运营成本。 B/S架构使得用户可以通过浏览器访问系统,无需安装客户端...
【标题】"基于ASP的免费在线客服系统个人版"是一个为个人或小型网站提供实时交流功能的解决方案。ASP,全称Active Server Pages,是微软开发的一种服务器端脚本语言,常用于构建动态网页。该系统利用ASP技术实现了...