提高DB2 Web应用程序性能的五条规则

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

优秀的代码行行相似,糟糕的代码各个不同。
规则其实并不重要,重要的是养成良好习惯。
                                                 ——译者题记

提高DB2 Web应用程序性能的5条规则

作者:Glenn Stephens
2003年8月

内容

简介
规则1:按需检索
规则2:优化数据库
规则3:使用DB2 UDB的OLAP函数改善分页
规则4:使用存储过程
规则5:尽可能使用缓存
总结

简介

速度和可升级性是网络开发重要的性能要求,而且它们也不难达到。应用一些简单的规则会提高网络应用的性能。在本文中,您将了解到使用Borland® C#Builder和IBM® DB2®通用数据库(UDB)8.1开发快速Microsoft® ASP.NET Web应用程序的5条规则。

分析Web应用程序的性能需要利用一些手段来检测每个操作的性能。为此,我创建了一个TimeDiff类(见程序清单1),它可以计算数据库操作的用时。你可以利用TimeDiff类的检测结果作为衡量数据库操作性能的基准,来观察哪些操作最为有效。我还创建了一个配合TimeDiff 类使用的LOTSOFRECORDS表(见程序清单2),它包含10,000条记录,你可以通过对它的操作来观察不同技术之间的性能差异。DB2具有内部缓冲池,一旦运行一个查询,内部缓冲池启用,因此二次查询的速度较快。在检测查询速度时,请忽略缓冲池启用前的结果而采用启用后的结果。

程序清单1. TimeDiff类

using System;

namespace Effeciency
{
 /// 
 /// 这个类用于时间计算。在例子中,
 /// 我们将利用它检测数据库操作的速度,
 /// 以便作性能上的比较。 
 /// 
 public class TimeDiff
 {
  DateTime StartTime;
  DateTime EndTime;

  public TimeDiff() {}

  public void Start()
  {
   StartTime = DateTime.Now;
  }

  public void Stop()
  {
   EndTime = DateTime.Now;
  }

  public string TimeDifferenceText
  {
   get
   {
    TimeSpan TimeDifference = EndTime - StartTime;
    return TimeDifference.ToString();
   }
  }
 }
}
程序清单2. LOTSOFRECORDS的表定义
CREATE TABLE "GLENN   "."LOTSOFRECORDS"  (
    "KEYCOL" INTEGER NOT NULL , 
    "COL1" CHAR(50) , 
    "COL2" CHAR(50) , 
    "COL3" CHAR(50) , 
    "COL4" CHAR(50) , 
    "COL5" CHAR(50) , 
    "COL6" CHAR(50) , 
    "COL7" CHAR(50) , 
    "COL8" CHAR(50) , 
           "COL9" CHAR(50) , 
    "COL10" CHAR(50) )   
   IN "USERSPACE1" ; 
COMMENT ON TABLE "GLENN   "."LOTSOFRECORDS" IS 'Table designed to Contain Lots of Records';

-- DDL Statements for primary key on Table "GLENN   "."LOTSOFRECORDS"

ALTER TABLE "GLENN   "."LOTSOFRECORDS" 
 ADD CONSTRAINT "CC1058255334652" PRIMARY KEY
  ("KEYCOL");

下面,我们就开始介绍这些提高DB2 UDB Web 应用程序性能的规则。我会先介绍提高数据库性能的基本规则,然后列出一些适合以Borland Data Provider开发ASP.NET应用时的性能规则。

规则1:按需检索

如果你只能记得住一条规则,那一定要记住这一条:按需检索。如果你是“幸存者”电视节目的忠实观众,您会记得其中的参赛者通过限额分配来保证每个人都有充足的食物。这种做法对于数据库开发同样适用。如果你的应用程序能够按需运行,那么就会合理地将数据库和网络资源留给其他应用。这听起来很简单,但我们还是来看一个例子。

假设有一个包含10,000 行记录和10 个字段的表,以及一个需要显示所有记录但只显示3个字段的Web页。很多开发者经常图省事而使用"select *"语句选择所有的字段:

select * from GLENN.LOTSOFRECORDS

这种做法应当避免,而应力求只检索需要的字段。可以在SQL 语句中定义要检索的字段,例如:

select 
  KEYCOL, COL1, COL2, COL7 
from 
  GLENN.LOTSOFRECORDS

在本文附带的源程序中,有两个ASP.NET页面:一个是RetrievingAllFields.aspx,它执行第一个查询;另一个是RetrievingLimitedFields.aspx ,它执行第二个查询,即只检索需要的字段。

用TimeDiff类进行检测,执行第一个查询用了1.622 秒,执行第二个查询用了1.311秒。后者用时只是前者的80%,不仅用时少,而且还减少了Web应用程序和数据库服务器之间的网络数据堵塞。

这个例子只限制了检索的字段,你还可以使用WHERE语句限制检索的记录数。WHERE 语句可以限制服务器返回的记录数(见程序清单3)。要记住,通过网络发送的记录数据越少,对应用程序、数据库、用户和网络越有好处。

规则2:优化数据库

有时候你的Web应用程序可能运行得不错,但你想让它更好。一个简单的减少搜索时间的方法是为特定字段创建索引。如果有一个查询是要搜索某个价格范围内的产品(见程序清单3),但你没有为价格字段定义索引,那么返回数据就会多花一些时间。而一旦建立了索引,DB2会很快返回你想要的结果。

程序清单3. 利用索引进行数据库搜索
SELECT 
  PRODUCTCODE, PRODUCTNAME, DESCRIPTION, UNITPRICE
FROM 
  GLENN.PRODUCTLIST 
WHERE 
  UNITPRICE > 20.00

优化数据库不只是为搜索字段创建索引这么一条,你应当尽可能多地搜集相关的DB2信息以使应用程序运行得更好。经常访问IBM发者园地(IBM DB2 Developer Domain)和comp.databases.ibm-db2(comp.databases.ibm-db2)等一些相关的Web站点或新闻组,对于保持DB2开发技巧不断更新是一个很好的办法。

你还应当努力熟悉DB2附带的工具,例如DB2索引建议器(Index Advisor)。DB2索引建议器可以根据你递交的查询和所连接的数据库返回最佳索引列表。

规则3:使用DB2 UDB的OLAP功能改善分页

在ASP.NET中,一个最常见的操作是表格分页显示。ASP.NET中DataGrid组件的默认设置是将表格需要的所有记录都返回客户端,然后再根据选择的页显示相应记录(见图1 和程序清单4)。

图1 DataGrid的分页设置
程序清单4  使用DataGrid 内建分页机制
TimeDiff diff = new TimeDiff();
private DataSet GetProductsDataSet() {
 diff.Start();
 string connString = ConfigurationSettings.AppSettings["database"];
 BdpConnection conn = new BdpConnection(connString);
 BdpDataAdapter da = new BdpDataAdapter("select KEYCOL, " +
  "COL1, COL2, COL7 FROM GLENN.LOTSOFRECORDS "+
  "ORDER BY KEYCOL ASC", conn);
 DataSet ds = new DataSet();
 da.Fill(ds, "Table1");
 diff.Stop();
 return ds;
}

private void BindToTheData()
{
  dataGrid1.DataSource = GetProductsDataSet();
  dataGrid1.DataMember = "Table1";
  dataGrid1.DataBind();
  label1.Text = diff.TimeDifferenceText;
}

private void Page_Load(object sender, System.EventArgs e)
{
 if (!IsPostBack) {
  BindToTheData();
 }
}

private void dataGrid1_PageIndexChanged(object source,
System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { //Change the active page of the data dataGrid1.CurrentPageIndex = e.NewPageIndex; BindToTheData(); }

如果以LOTSOFRECORDS表为例,从数据库中检索1万条记录很快就会占尽网络带宽,尤其是一次只需要查看10条或20条记录时。用户会发现加载ASP.NET页面的时间太长,而且很可能会超时。试想,如果数据库有数百万条记录,那你的应用程序就会运行缓慢只至停止执行。因此,需要采取更好的方法来检索数据。

还好,DataGrid组件允许定制分页。你可以计算哪些记录需要显示,然后只从服务器检索出相应的记录。

后来版本的DB2 UDB都具有一个很大的特点,那就是OLAP函数,它允许你进行各种记录检索。例如,只检索某些记录可以执行如下的查询:

SELECT * FROM 
  (SELECT KEYCOL, COL1, COL2, COL7, rownumber() 
   over(ORDER BY KEYCOL ASC) AS rn 
   FROM GLENN.LOTSOFRECORDS 
   ORDER BY KEYCOL ASC) AS a1 
   WHERE a1.rn BETWEEN 100 AND 120

使用DataGrid定制分页时,需要获得特定页的DataSet。GetDataByPage方法可以检索结果集而不管分页数和分页大小:

private DataSet GetDataByPage(int PageNo, int PageSize, out int NumberOfPages)
{
 int startRecord = (PageNo - 1) * PageSize + 1;
 int endRecord = startRecord + PageSize - 1;

 string connString = ConfigurationSettings.AppSettings["database"];
 BdpConnection conn = new BdpConnection(connString);
 conn.Open();

 //Get the number of Pages
 string sRecordCount = "select count(*) from GLENN.LOTSOFRECORDS";
 BdpCommand cmdGetRecordCount = new BdpCommand(sRecordCount, conn);
 int intRecordCount = (int)cmdGetRecordCount.ExecuteScalar();
 NumberOfPages = intRecordCount / PageSize;
 if (intRecordCount % PageSize > 0)
   NumberOfPages++;

 //Get the data specifically for the page
 string sSQL =
  "SELECT * FROM " +
  "  (SELECT KEYCOL, COL1, COL2, COL7, rownumber() " +
  "   over(ORDER BY KEYCOL ASC) AS rn " +
  "   FROM GLENN.LOTSOFRECORDS " +
  "   ORDER BY KEYCOL ASC) AS a1 " +
  "   WHERE a1.rn BETWEEN ? AND ?";
 BdpCommand cmdSel = new BdpCommand(sSQL, conn);
 BdpParameter prmStart =
   cmdSel.Parameters.Add("StartRecord", BdpType.Int32);
 prmStart.Value = startRecord;
 BdpParameter prmEnd =
   cmdSel.Parameters.Add("EndRecord", BdpType.Int32);
 prmEnd.Value = endRecord;
 BdpDataAdapter da = new BdpDataAdapter(cmdSel, conn);
 DataSet ds = new DataSet();
 da.Fill(ds, "Table1");

 diff.Stop();
 return ds;
}

private void LoadSingleDataPage(int pageNo)
{
 //Display the Page contents
 int PageCount;
 DataSet dsData = GetDataByPage(pageNo+1,
  dataGrid1.PageSize, out PageCount);
 dataGrid1.VirtualItemCount = PageCount * dataGrid1.PageSize;
 dataGrid1.CurrentPageIndex = pageNo;
 dataGrid1.DataSource = dsData;
 dataGrid1.DataBind();
}

private void Page_Load(object sender, System.EventArgs e)
{
 if (!IsPostBack)
 {
  LoadSingleDataPage(0);
 }
}

private void dataGrid1_PageIndexChanged(object source,
System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { LoadSingleDataPage(e.NewPageIndex); }

通过定制分页,将检索记录数从1万条限制到20条,占用的网络资源约为最初的0.2%。在我的本机用TimeDiff 类检测,使用定制分页时用时0.5~0.7秒,而使用默认分页机制时用时为0.9~1.5秒。

规则4:使用存储过程

如果发送一条SQL语句到DB2服务器,其执行过程如下:

(1)DB2 UDB Server对SQL语句进行语法检查;
(2)生成存储过程执行计划;
(3)数据返回应用程序。

当使用存储过程时,前两步过程已经完成。存储过程经编译后,调用时只将存储过程名和参数传递给数据库服务器。因此,执行时间的减少赢得了性能上的优势。但这种优势只有当返回的结果集非常大时才有所体现。

下面举一个例子。先建立一个PRODUCTLIST表:

 CREATE TABLE "GLENN   "."PRODUCTLIST"  (
    "PRODUCTCODE" VARCHAR(20) NOT NULL , 
    "PRODUCTNAME" VARCHAR(50) NOT NULL , 
    "DESCRIPTION" VARCHAR(255) , 
    "UNITPRICE" DOUBLE NOT NULL , 
    "CATEGORYCODE" INTEGER , 
    "IMAGEURL" CHAR(150) )   
   IN "USERSPACE1" ; 
COMMENT ON TABLE "GLENN   "."PRODUCTLIST" IS 'A list of Products in the Shopping Cart';

-- DDL Statements for primary key on Table "GLENN   "."PRODUCTLIST"

ALTER TABLE "GLENN   "."PRODUCTLIST" 
 ADD CONSTRAINT "CC1053568050795" PRIMARY KEY
  ("PRODUCTCODE");

然后进行如下查询:

SELECT PRODUCTLIST.PRODUCTCODE, PRODUCTLIST.PRODUCTNAME, PRODUCTLIST.DESCRIPTION,
PRODUCTLIST.UNITPRICE, PRODUCTLIST.IMAGEURL FROM GLENN.PRODUCTLIST AS PRODUCTLIST WHERE PRODUCTLIST.CATEGORYCODE = 2;

以上查询很容易转为存储过程。DB2开发中心(DB2 Development Center)包含一个优秀的存储过程向导,它可以让你轻松生成存储过程(见图2)。

图2 利用DB2开发中心的存储过程向导创建一个新的存储过程

存储过程向导启动后,你只需要选择相应的表、字段和规则,存储过程的创建过程由向导来完成。

存储过程向导的一个极为有用之处是可以利用它轻松创建存储过程的输入参数。创建一个SQL 存储过程(DB2 还能创建Java存储过程),可以选择“Category Code”作为存储过程的输入参数(见图3)。

图3 创建存储过程输入参数

完成后,所创建的存储过程如下:

CREATE PROCEDURE GLENN.GETPRODUCTSINCATEGORY ( IN CATCODE INTEGER )
    DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- SQL Stored Procedure 
------------------------------------------------------------------------
P1: BEGIN
    -- Declare cursor
    DECLARE cursor1 CURSOR WITH RETURN FOR
        SELECT PRODUCTLIST.PRODUCTCODE, PRODUCTLIST.PRODUCTNAME, PRODUCTLIST.DESCRIPTION,
PRODUCTLIST.UNITPRICE, PRODUCTLIST.IMAGEURL FROM GLENN.PRODUCTLIST AS PRODUCTLIST WHERE PRODUCTLIST.CATEGORYCODE = CATCODE; -- Cursor left open for client application OPEN cursor1; END P1

使用存储过程向导时,可以让存储过程返回不止一条查询的结果。通过这种方法,可以发挥存储过程的最大优势。如果结果集很小,使用存储过程可能要慢于使用查询。你应当不断对数据访问作性能测试。

使用Borland Data Provider调用存储过程与调用查询有所不同,主要是BdpDataAdapter的BdpCommand对象必须要将CommandType设为CommandType.StoredProcedure 并将CommandText设为存储过程名。此外,还需要在BdpCommand对象的参数集合中定义存储过程参数。

一旦定义好参数,只需使用BdpDataAdapter的Fill 方法填充DataSet:

private void GetProductsViaStoredProcedure(int CategoryCode) {
 cmdGetDataViaStoredProc.Parameters[0].Value = CategoryCode;
 BdpDataAdapter da = new BdpDataAdapter(cmdGetDataViaStoredProc);
 da.Fill(dsProducts, "Products");
 dataGrid1.DataBind();
}

规则5:尽可能使用缓存

ASP.NET最大的特点之一是缓存。缓存的原理很简单,将经常访问的内容储存在内存中,访问时不需要再到数据库或通过网络去检索数据。访问内存中的信息总是要比通过其它过程或网络访问资源要快。

那么如何使用缓存呢?在ASP.NET中有几种方法。一种方法是在ASP.NET页面头部定义一个页面指示标识,让其自动管理页面缓存。如果你读过我的上一篇文章《利用IBM DB2 UDB建立ASP.NET站点》(Build ASP.NET Web Sites with IBM DB2 Universal Database),应当很熟悉这种技术。通过包含OutputCache指令,可以缓存整页:

<%@ Page language="c#" Debug="true" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" 
Inherits="MyNewWebApplication.WebForm1" %> 

<%@ OutputCache Duration="300" VaryByParam="None" VaryByCustom="browser" %>

另一种方法是使用Pages对象内建的Cache 对象。将内容放入缓存时,使用Cache 对象的Insert方法;从缓存取出内容时,使用Cache对象的默认集合。

private void Page_Load(object sender, System.EventArgs e)
{
 TimeDiff diff = new TimeDiff();

 diff.Start();
 string retrievalMethod;
 DataSet CategoriesDataSet;
 if (Cache["Categories"] == null) {
  retrievalMethod = "Database";
  connShopping.Open();
  CategoriesDataSet = new DataSet();
  daCategories.Fill(CategoriesDataSet, "Categories");
  Cache.Insert("Categories", CategoriesDataSet);
  connShopping.Close();
 } else {
  retrievalMethod = "Cache";
  CategoriesDataSet = (DataSet)Cache["Categories"];
 }
 diff.Stop();
 lblDetails.Text = "Retrieval from the " + retrievalMethod +
  " in " + diff.TimeDifferenceText + " seconds";
 dataGrid1.DataSource = CategoriesDataSet;
 dataGrid1.DataMember = "Categories";
 dataGrid1.DataBind();
}

当页面第一次被请求时,我在本机测试的数据检索用时为0.9秒,但从缓存中检索数据几乎没用什么时间,因为TimeDiff类的检测结果为00:00:00。可见,使用缓存是加速Web应用简单而有效的方法。

如果需要定时更新数据,还以使用缓存对象的过期策略。只需要使用Insert 方法的重载版本,指定过期时间即可。下面是每隔6小时自动刷新“Categories”缓存的一种方法:

Cache.Insert("Categories", CategoriesDataSet, null,
 System.Web.Caching.Cache.NoAbsoluteExpiration,
 TimeSpan.FromHours(6));
总结

在完美的世界里,应用程序总是执行快速,支持无限用户,而且不占任何网络资源。但我们并非置身其中,因此你应当很好地利用本文所概括的有效规则,努力提高Web应用程序的性能。

注:版权属原作者所有,部分内容有删节和修改。错误与遗漏难免,批评指正请联系lucentoff@sohu.com

MySQL、SqlServer、Oracle、DB2四大数据库分页查询 在 这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这 些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用。 下面就分别给大家介绍、讲解一下三种数据库实现分页查询的方法。 一、 MySQL 数据库 分页查询 MySQL数据库实现分页比较简单,提供了 LIMIT函数 阅读详情

相关推荐

提高DB2数据库Web程序性能的两条规则

速度和可升级性是网络开发重要的性能要求,而且它们也不难达到。应用一些简单的规则提高网络应用的性能。在本文中,您将了解到使用Borland C#Builder和IBM DB2通用数据库(UDB)8.1开发快速Microsoft® ASP.NET Web应用程序的2条规则。   分析Web应用程序性能需要利用一些手段来检测每个操作的性能。为此,我创建了一个TimeDiff类...

weixin_34358092的博客 153

DB2基础知识

1db2数据库特点 (1)具有很好的并行性(DB2把数据库管理扩充到了并行的,多节点的环境;数据库分区是数据库的一部分,包含自己的数据,索引,配置文件和事务日志; 数据库分区有时被称为节点)。 (2)获得最高认证级别的ISO标准认证。 (3)性能较高,适用于数据仓库和在线事物处理。 (4)跨平台,多层结构,支持ODBC,JDBC等客户。 (5)操作简单,同时提供GUI和命令行,在windowsN...

六月的风 3836

DB2数据库常用指令以及重要知识点学习

DB2数据库常用指令以及重要知识点学习DB2数据库基础知识DB2数据库常用指令cd /usr/lpp/db2_07_01/instance./db2idrop InstNamecd /usr/lpp/db2_07_01/bin./db2ilistDB2数据库事务隔离级别问题DB2数据库与Mysql数据库区别 DB2数据库基础知识 1db2数据库特点 (1)具有很好的并行性(DB2把数据库管理扩充到了并行的,多节点的环境;数据库分区是数据库的一部分,包含自己的数据,索引,配置文件和事务日志; 数据库分区有时

cug-jdc的博客 5804

db2数据库基础知识

1db2数据库特点 (1)具有很好的并行性(DB2把数据库管理扩充到了并行的,多节点的环境;数据库分区是数据库的一部分,包含自己的数据,索引,配置文件和事务日志; 数据库分区有时被称为节点)。 (2)获得最高认证级别的ISO标准认证。 (3)性能较高,适用于数据仓库和在线事物处理。 (4)跨平台,多层结构,支持ODBC,JDBC等客户。 (5)操作简单,同时提供GUI和命令行,在windowsNT和unix下的操作相同。 (6)在巨型企业得到广泛的运用,向下兼容性好,风险小。 (7)能够在所有主流平台上运

段远山 887

Web 开发人员: 为最佳性能而进行优化?

如果您在开发 Web 应用程序,那么您很可能熟悉基于Java连接到数据库的方法:JDBC 和 SQLJ。但是您知道如何能让使用这些方法的应用程序获得最佳性能吗?微调数据库访问会使应用程序和数据库保持协调一致。如果您在开发 Web 应用程序,那么您很可能熟悉基于Java连接到数据库的方法:JDBC 和 SQLJ。但是您知道如何能让使用这些方法的应用程序获得最佳性能吗?如果您认为性能不是开

alisisuli的专栏 435

为最佳性能而进行优化

微调数据库访问会使应用程序和数据库保持协调一致。 如果您在开发 Web 应用程序,那么您很可能熟悉基于Java连接到数据库的方法:JDBC 和 SQLJ。但是您知道如何能让使用这些方法的应用程序获得最佳性能吗? 如果您认为性能不是开发人员所关心的问题,那么请您再想想,有的系统执行效率一般,有的系统执行效率很棒,造成这一区别的原因是什么呢?我认为这主要在于数据库架构设计师、数据库管理员和应用程序

Jimcs 781

Web应用性能1

优化Web应用的性能绝不象有些人想象的那样简单易行,它涉及到诸多技术,从最简单的HTML代码修改,到复杂的EJB改造,无不涉及性能问题。但有一点是非常清楚的:要想找出和解决Web应用的性能瓶颈,就必须深入全面地了解信息在Web应用中的流程。   改善Web应用的性能不一定要局限于Web应用的Java代码,例如有些时候,简单地改动一下HTML页面的质量、减少其传输频度和数据量就可以有效地提高应用的性

letitbe专栏 1244

优化Web性能应用技巧集锦

优化Web应用的性能绝不象有些人想象的那样简单易行,它涉及到诸多技术,从最简单的HTML代码修改,到复杂的EJB改造,无不涉及性能问题。但有一点是非常清楚的:要想找出和解决Web应用的性能瓶颈,就必须深入全面地了解信息在Web应用中的流程。  改善Web应用的性能不一定要局限于Web应用的Java代码,例如有些时候,简单地改动一下HTML页面的质量、减少其传输频度和数据量就可以有效地提高应用的性能

517

zabbix 监控 db2_13个网络监控工具

对于网络管理员而言,监控网络性能问题非常重要,网络监控工具可帮助企业跟踪并解决这些问题。但是,实施和维护网络监控解决方案可能成本昂贵。幸运的是市场上有许多免费和开源的解决方案,网络管理员需要一些时间和耐心,来仔细挑选。这些开源工具是在开源许可下发布的,如果企业希望降低成本,则可以考虑这些工具。应该注意的是,有的可能不适合你的需求,因为许多开源工具需要的专业知识。因此,以下列出了每个开源工具的一些主...

weixin_39595008的博客 305

项目性能调优

性能调优web容器调优HTTP 连接数调优数据库调优功能优化代码调优静态资源优化网络优化带宽问题服务器性能防抓取过滤器js压缩小工具 web容器调优 JVM 参数调优 1:使用64位JDK 1.6+ & Tomcat 6+。 2:jvm内存优化 编辑tomcat/bin/目录下catalina.bat(linux为catalina.sh,配置类似,请自行百度),在文件开头加上以下代码(注意先搜索一下,不要重复设置) set JAVA_OPTS=-Xms512m -Xmx4096m -XX:PermS

qq_41853523的博客 647

db2 date java_Db2有关索引的学习笔记 - DB2 - JAVA诺曼底 java|诺曼底|web开发|s...

.介绍1.1 概述建表时,为提高检索速度和保证列无重复行,对表的任何一列或多列都可建索引,而该列称为索引(key column)。建索引有3种目的:1.为建索引列提供快速检索。改善某些特殊列或值的查询性能。2.为建索引提供升序或降序功能。该功能对有ORDER BY和GROUP BY子句的查询特别有用。加快这些子句的实施。当然,这些子句也可以不用索引实施,系统只作简单的分类处理。3.为表中某些列保...

weixin_33452735的博客 450

zabbix 监控 db2_13个网络管理员必须试试的开源网络监控工具

对于网络管理员而言,监控网络性能问题非常重要,网络监控工具可帮助企业跟踪并解决这些问题。但是,实施和维护网络监控解决方案可能成本昂贵。幸运的是市场上有许多免费和开源的解决方案,网络管理员需要一些时间和耐心,来仔细挑选。这些开源工具是在开源许可下发布的,如果企业希望降低成本,则可以考虑这些工具。应该注意的是,有的可能不适合你的需求,因为许多开源工具需要的专业知识。因此,以下列出了每个开源工具的一些主...

weixin_39655689的博客 352

如何使用ssm实现基于web的微博网站的设计和实现

【代码】ssm基于web的微博网站的设计和实现+jsp

shangyizaoxing的博客 1095

性能测试技能树

职业技术要求测试工具jmeterLoadrunner测试基础性能测试理论自动化测试理论测试开发服务器性能诊断CPU磁盘内存网络优化技能代码架构中间件操作系统数据库SQL配置设计协议Http/HttpsWebSocket/SocketWebService其他RPC实现自动化接口自动化Web自动化移动app自动化持续集成jenkinsMaven/AntGit/SVN 链接长方形圆圆角长方形菱形 ...

weixin_37689012的博客 428

性能测试第一天

  基础认识,从用户角度来说,web系统响应的直观认识: 1、系统架构实现技术   (1)主要从CDN、负载均衡服务器、网络服务器、应用服务器、缓存服务器、数据库服务器描述;   (2)CDN: 1 CDN,Content-Distribution-Network 2 内容分发网络 3 是IDC运营商提供的一种婚存服务   (3)负载均衡服务器: 1 功能:根据设定...

weixin_30566149的博客 77

.htaccess数据库连接池优化:终极性能提升指南

在网站开发中,数据库连接管理是影响性能的关键因素之一。不合理的连接配置可能导致服务器资源浪费、响应延迟甚至系统崩溃。本文将介绍如何通过.htaccess文件实现数据库连接池的优化,帮助你轻松提升网站性能,即使是新手也能快速掌握这些实用技巧。 ## 为什么需要优化数据库连接池? 数据库连接的建立和关闭是一个资源密集型操作。如果每次请求都创建新的数据库连接,会显著增加服务器负担并降低响应速度。连接

gitblog_00325的博客 899
上一篇: 2003年Delphi Informant杂志读者选择奖
下一篇: 【Borland】Octane和Delphi Q&A(2003-10-7)-- Simon Thornhill
lucentoff
博客等级 码龄24年 13粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值