在SQLServer中建立索引

时间:2013-08-21 11:40:55

标签: sql-server sql-server-2008

您好我正在使用SQLServer2008。我想知道SQLServer中的索引是什么以及如何使用它?

这是我的查询的一部分。我可以给索引吗?非常感谢..

DECLARE @TableMember TABLE
(
  BrokerId INT ,
  RankId INT ,
  MemberId INT ,
  InstallmentId INT ,
  PlanId INT ,
  IntroducerId INT ,
  Date DATETIME ,
  SelfAmount DECIMAL(18, 2) ,
  UnitAmount DECIMAL(18, 2) ,
  SpotAmount DECIMAL(18, 2) ,
  ORBPercentageSelf DECIMAL(18, 2) ,
  ORBPercentageUnit DECIMAL(18, 2) ,
  ORBAmountSelf DECIMAL(18, 2) ,
  ORBAmountUnit DECIMAL(18, 2) ,
  IsSelfBusiness BIT ,
  Mode VARCHAR(50) ,
  InstallmentNo INT ,
  PlanType VARCHAR(50) ,
  PlanName VARCHAR(50) ,
  CompanyId INT ,
  CscId INT ,
  Year VARCHAR(50) ,
  CreateDate DATETIME ,
  ModifideDate DATETIME
)

INSERT  INTO @TableMember
    ( BrokerId ,
      RankId ,
      MemberId ,
      InstallmentId ,
      PlanId ,
      IntroducerId ,
      Date ,
      SelfAmount ,
      UnitAmount ,
      SpotAmount ,
      ORBPercentageSelf ,
      ORBPercentageUnit ,
      ORBAmountSelf ,
      ORBAmountUnit ,
      IsSelfBusiness ,
      Mode ,
      InstallmentNo ,
      PlanType ,
      PlanName ,
      CompanyId ,
      CscId ,
      Year ,
      CreateDate ,
      ModifideDate  


    )
    ( SELECT    BrokerId ,
                RankId ,
                MemberId ,
                InstallmentId ,
                PlanId ,
                IntroducerId ,
                Date ,
                SelfAmount ,
                UnitAmount ,
                SpotAmount ,
                ORBPercentageSelf ,
                ORBPercentageUnit ,
                ORBAmountSelf ,
                ORBAmountUnit ,
                IsSelfBusiness ,
                Mode ,
                InstallmentNo ,
                PlanType ,
                PlanName ,
                CompanyId ,
                CscId ,
                Year ,
                CreateDate ,
                ModifideDate
      FROM      dbo.MemberBusiness AS mb
      WHERE     ( @CscId = 0
                  OR mb.CscId = @CscId
                )
                AND mb.Date >= @StartDate
                AND mb.Date <= @EndDate
                AND mb.RankId >= @FromRankId
                AND mb.RankId <= @ToRankId
    )

6 个答案:

答案 0 :(得分:2)

应根据数据的使用方式构建索引。我建议先阅读Indexing Best Practices作为开头。

答案 1 :(得分:2)

可以在表格中创建索引,以便更快更有效地查找数据。

用户无法看到索引,它们只是用于加速搜索/查询。

注意:使用索引更新表比没有更新表需要更多时间(因为索引也需要更新)。因此,您应该只在经常搜索的列(和表)上创建索引。

SQL CREATE INDEX语法

在表上创建索引。允许重复的值:

CREATE INDEX index_name
ON table_name (column_name)

SQL CREATE UNIQUE INDEX语法

在表上创建唯一索引。不允许重复值:

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

注意:创建索引的语法因不同的数据库而异。因此:检查在数据库中创建索引的语法。

CREATE INDEX示例

下面的SQL语句在“Persons”表的“LastName”列中创建一个名为“PIndex”的索引:

CREATE INDEX PIndex
ON Persons (LastName)

如果要在列组合上创建索引,可以在括号中列出列名,用逗号分隔:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

答案 2 :(得分:2)

首先,索引允许查询快速返回结果。大多数索引都提供某种树结构,允许查询跳过大量的比较。查询不是检查每个表行,而是检查目标值是大于还是小于索引根值,然后,如果更大,查询检查更大的索引条目,如果更小,则检查更小的索引条目,等等上。这样做的好处是查询在找出目标值是否存在之前不必检查许多索引条目,如果存在,则查询数据表中的出现位置。

这是一种分而治之的&#34;策略。

开发人员或DBA尝试预测将在大量搜索中使用哪些表列,并在这些列上创建索引。 DB SW维护索引。随着基础表的更改,DB会添加和删除索引条目。用户应该注意的唯一事情是更快的响应。

一个简单的索引创建示例是

CREATE INDEX IX_EmployeeName     雇员(姓名);

提供了Sqlserver 2008 R2的完整索引创建语法

http://msdn.microsoft.com/en-us/library/ms188783(v=sql.105).aspx

答案 3 :(得分:1)

您提供的示例涉及&#34;表变量&#34;。这意味着您正在创建一个可以像SQL语句中的表一样使用的Transact-SQL变量。你经常不需要在这种表上使用索引,因为它们通常很小。但是,如果您确实需要索引,则可以隐式创建它们,如下面的示例所示。您无法显式创建它们。但是,您可以创建一个临时表,并像任何其他表一样索引。

DECLARE @Employee TABLE
 (
     ID  INT PRIMARY KEY,
     NAME VARCHAR(50),
     UNIQUE (NAME,ID) -- ID is included to make the indexed value unique even if NAME is not
 )

答案 4 :(得分:0)

我喜欢这篇文章http://www.mssqltips.com/sqlservertip/1206/understanding-sql-server-indexing/ 我从这里了解了集群和非集群之间的区别

答案 5 :(得分:0)

我会将此分为两个您不想尝试从同一个存储过程中的一个ID中提取所有数据或数据的查询。

( @CscId = 0 OR mb.CscId = @CscId)

主要原因是,如果您只想找CscID,那么您可能想要一个非聚集索引CscID = 104256,但如果您要查找所有CscID,您可能需要非聚簇索引过期日期栏。我还要确保你确实需要一个表格变量,它不能从你所拥有的东西看起来有很多理由随机抛出一个。