一个索引查找的ASP.NET示例探讨

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:


最近做了一个简单的关于索引的
Demo ,遂与大家分享。之所以在文章的标题加上了“探讨”二字:

一是希望能作为园子里入门TX的学习示例(如何创建索引 + 如何创建存储过程 + ASP.NET简单的三层示例,还可以参考我的另一篇文章:ASP.NET应用程序的三层设计模型(学习)

二是希望能够抛砖引玉,听听大家对于索引如何使用的见解,以及关于数据库内(或者说是网站内部)的大量数据(或者说是百万级数据),大家是如何实现和处理搜索功能的?(当然也少不了“全文索引”的探讨) 希望不吝赐教,共同探讨 ^_^

我先简单介绍一下SQL Server中,索引的基本概念和需要注意的地方。然后把我的ASP.NET关于索引的Demo按步骤分解说明。

什么是索引?

  数据库中的索引与书籍中的索引类似,它为数据库提供一种方法来编排查询数据的路由。我们通过搜索索引找到需要的值,然后根据该值跟随指针到达包含该值的行。

一、索引存放在系统表 sysindexes中;

二、虽然可以指定数据库按照某个索引进行数据查询,但一般不需要人工指定。

SQL Server将会根据所创建的索引,自动优化查询。

索引页 数据库中存储索引的数据页。类似于汉语字典中按拼音或笔画排序的目录页。

索引的作用:提高数据库的检索速度,改善数据库的性能。

 :索引自身也需要维护,并占用一定的资源,所以应该合理的使用,切忌滥用。

建立索引的列的情形

一、该列用于频繁搜索;

二、该列用于对数据进行排序;

忌讳建立索引的列的情形

一、该列仅包含几个不同的值;

二、包含该列的表中只有少量的几行数据;

索引的类型:

唯一索引(UNIQUE:不允许有重复值,当新的数据将使该列重复时,数据库将拒绝此数据。(创建了唯一约束,将自动创建唯一索引。建议不使用唯一索引,而使用主键约束。)

主键索引:为表定义一个主键将自动创建一个主键索引。(主键索引唯一索引特殊类型

聚集索引(CLUSTERTED:表中各行的物理顺序与键值的索引顺序相同。(一个表只能包含一个聚集索引

非聚集索引(NONCLUSTERTED:表中各行的物理顺序与键值的索引顺序不同。(一个表可以包含多个非聚集索引

FILLFACTOR填充因子):0~100范围内的值,指示索引页填满的空间所占的百分比。(一般很少指定

关于全文索引

普通的 SQL 索引全文索引不同差异:(引用自 Microsoft 的帮助文档 

普通 SQL 索引

全文索引

存储时受定义它们所在的数据库的控制。

存储在文件系统中,但通过数据库管理。

每个表允许有若干个普通索引。

每个表只允许有一个全文索引。

当对作为其基础的数据进行插入、更新或删除时,它们自动更新。

将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生。

不分组。

在同一个数据库内分组为一个或多个全文目录。

使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。

使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。



普通
SQL
索引查找的ASP.NET示例

   

创建一个TestDB数据库,并为TestDB数据库创建TestTable数据表,包含IDname字段

use TestDB
if  exists ( select  *  from dbo.sysobjects  where id  =  object_id(N ' [dbo].[TestTable] 'and  OBJECTPROPERTY(id, N ' IsUserTable '=  1)
drop  table  [ dbo ]. [ TestTable ]
GO

CREATE  TABLE  [ dbo ]. [ TestTable ] (
     [ ID ]  [ decimal ]( 180IDENTITY ( 11NOT  NULL ,
     [ name ]  [ varchar ] ( 50) COLLATE Chinese_PRC_CI_AS  NULL 
ON  [ PRIMARY ]
GO


 
   

TestDB数据库的TestTable表的name字段,创建名称为IX_NAME 的非聚集索引

use TestDB
go
/* -- 检测 系统表 sysindexes 中是否存在该索引 -- */
if  existsselect name  from sysindexes
            where name  =  ' IX_NAME ')
drop  index TestTable.IX_NAME   -- 删除索引

/* -- 创建非聚集索引,填充因子为30% -- */
create  nonclustered  index IX_NAME
     on TestTable(name)
     with  fillfactor  =  30
go


 
   

创建一个存储过程mytest ,指定按索引IX_NAME进行查询

use TestDB
if  exists ( select  *  from dbo.sysobjects  where id  =  object_id(N ' [dbo].[TestProcedure] 'and  OBJECTPROPERTY(id, N ' IsProcedure '=  1)
drop  procedure  [ dbo ]. [ TestProcedure ]
GO

SET QUOTED_IDENTIFIER  ON 
GO
SET ANSI_NULLS  OFF 
GO

CREATE   procedure  dbo.TestProcedure  
          @_name   varchar( 50)
as
begin
          select  *  from TestTable( index =IX_NAME)    where name = @_name
end
GO
SET QUOTED_IDENTIFIER  OFF 
GO
SET ANSI_NULLS  ON 
GO

  尽管我在这里,指定了数据库按照某个索引进行数据查询,但一般是不需要人工指定。 SQL Server 将会根据所创建的索引,自动优化查询。


 
  

创建ASP.NET数据访问层DataLink.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;

namespace mytest
{
     public  class DataLink
    {
       public  string linkSql;

         public DataLink()
        {
             //
            
//  TODO: 在此处添加构造函数逻辑
            
//
           linkSql= null;
        }
         public DataLink( string link)
        {
            linkSql=link;
        }

         public SqlConnection myConn;
         public SqlCommand myComm;
         public SqlDataAdapter myAdapter;

         public DataSet _DataSet( string procedureName, string paraValue)
        {
             if (myConn== null)
                myConn= new SqlConnection(linkSql);
            myComm =  new SqlCommand(procedureName,myConn);
            myComm.CommandType = CommandType.StoredProcedure;
             // SqlParameter para = new SqlParameter("@_name",SqlDbType.VarChar,50);
            
// para.Value = paraValue;
            
// myComm.Parameters.Add(para);
            myComm.Parameters.Add( " @_name ",paraValue); 
            myAdapter =  new SqlDataAdapter(myComm);
            DataSet myDataSet =  new DataSet();
            myAdapter.Fill(myDataSet);
             return myDataSet;        
        }
    }
}

 
     

创建ASP.NET业务逻辑层myWebForm.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace mytest
{
     public  class myWebForm : System.Web.UI.Page
    {
         protected System.Web.UI.WebControls.TextBox myTextBox;
         protected System.Web.UI.WebControls.Button myButton;
         protected System.Web.UI.WebControls.DataGrid myDataGrid;
    
         private  void Page_Load( object sender, System.EventArgs e)
        {
             //  在此处放置用户代码以初始化页面
        }

         #region Web 窗体设计器生成的代码
         override  protected  void OnInit(EventArgs e)
        {
             //
            
//  CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
            
//
            InitializeComponent();
             base.OnInit(e);
        }
        
         ///   <summary>
        
///  设计器支持所需的方法 - 不要使用代码编辑器修改
        
///  此方法的内容。
        
///   </summary>
         private  void InitializeComponent()
        {    
             this.myButton.Click +=  new System.EventHandler( this.myButton_Click);
             this.Load +=  new System.EventHandler( this.Page_Load);

        }
         #endregion

         private  void myButton_Click( object sender, System.EventArgs e)
        {
             string strSearch = myTextBox.Text.Trim();
             ifnull==strSearch || ""==strSearch )  return;
             string sqlLike =  " workstation id=XUGANG;user id=sa;data source=.;persist security info=False;initial catalog=TestDB "
            DataLink myDataLink =  new DataLink(sqlLike);
            DataSet myData = myDataLink._DataSet( " TestProcedure ",strSearch);   //  TestProcedure 存储过程名称
            myDataGrid.DataSource = myData;
            myDataGrid.DataBind();
        }
    }
}

  
     

关于ASP.NET用户界面层myWebForm.aspx

<% @ Page language = " c# "  Codebehind = " myWebForm.aspx.cs "  AutoEventWireup = " false "  Inherits = " mytest.myWebForm "   %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"  >
< HTML >
     < HEAD >
         < title >WebForm </ title >
         < meta  name ="GENERATOR"  Content ="Microsoft Visual Studio .NET 7.1" >
         < meta  name ="CODE_LANGUAGE"  Content ="C#" >
         < meta  name ="vs_defaultClientScript"  content ="JavaScript" >
         < meta  name ="vs_targetSchema"  content ="http://schemas.microsoft.com/intellisense/ie5" >
     </ HEAD >
     < body  MS_POSITIONING ="GridLayout" >
         < form  id ="Form1"  method ="post"  runat ="server" >
             < asp:TextBox  id ="myTextBox"  runat ="server" ></ asp:TextBox >
             < asp:Button  id ="myButton"  runat ="server"  Text ="搜 索" ></ asp:Button >
             < asp:DataGrid  id ="myDataGrid"  runat ="server" ></ asp:DataGrid >
         </ form >
     </ body >
</ HTML >

  
我没有提供 Demo 下载,只要按照步骤 Copy 代码便能实现。
( Visual Studio .NET 2003 + SQL Server 2000 环境下,测试通过。 )


相关文章推荐:

蝈蝈俊.net 索引基础知识(系列)
SQL Server 索引基础知识(1)--- 记录数据的基本格式 
SQL Server 索引基础知识(2)----聚集索引,非聚集索引 
SQL Server 索引基础知识(3)----测试中一些常看的指标和清除缓存的方法 
SQL Server 索引基础知识(4)----主键与聚集索引
SQL Server 索引基础知识(5)----理解newid()和newsequentialid() 
SQL Server 索引基础知识(6)----索引的代价,使用场景
SQL Server 索引基础知识(7)----Indexing for AND 
SQL Server 索引基础知识(8)--- 数据基本格式补充 

以及
SELECT * 的真相: 索引覆盖(index coverage)
在表连接查询的时候,如果select中包含了没有建立索引的列,可能对效率产生严重影响 




本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2008/01/18/1044352.html,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6月前
|
存储 开发框架 前端开发
asp.net与asp.net优缺点及示例
asp.net与asp.net优缺点及示例
|
2月前
|
前端开发 数据库连接 数据库
ASP.NETMVC数据库完整CRUD操作示例
ASP.NETMVC数据库完整CRUD操作示例
29 0
|
2月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
32 0
|
开发工具 索引
NET SDK连接阿里云ElasticSearch示例
本文主要演示如何使用elasticsearch-net sdk连接阿里云ElasticSearch实例,通过index的创建进行验证测试。
423 0
NET SDK连接阿里云ElasticSearch示例
|
自然语言处理 API 开发工具
阿里云自然语言处理 .NET 使用示例
本文主要针对目前官方文档中参考Demo使用SDK较老且本身中文打印输出异常的问题,提供包括SDK安装步骤+正常可用示例.NET Demo。
阿里云自然语言处理 .NET 使用示例
【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
.Net Micro Framework官方图形库是WPF,由于目前ST Cortex-M3开发板RAM太小,最大才512K(常见是128K或256k),并且Cortex-M3的CPU主频也不太高,运行WPF图形框架显得过于重了,所以我这边推出了轻量级图形库TinyGUI
575 0
【.Net MF网络开发板研究-03】获取雅虎天气(HttpClient示例)
在网络开发板上实现Http Client,获取雅虎网站的天气信息,并把这些信息在LCD上显示出来。
641 0
|
JSON PHP 数据格式
支付宝预授权.net版接口请求示例
download:支付宝预授权PHP版.zip说明: 本帖是.net开发语言测试支付宝预授权的请求示例,仅供参考!!    一、下载demo: Java版:download:支付宝预授权Java版.zip PHP版:download:支付宝预授权PHP版.
806 0
|
缓存 测试技术 C#
.NET高性能编程之C#玩转CPU高速缓存(附示例)
高并发、低延迟之C#玩转CPU高速缓存(附示例)
2566 0