0

您好我正在使用 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
    )
4

6 回答 6

2

首先,索引允许查询快速返回结果。大多数索引都提供了某种树结构,允许查询跳过很多比较。查询不是检查每个表行,而是检查目标值是否大于或小于索引根值,然后,如果较大,则查询检查较大的索引条目,如果较小,则检查较小的索引条目,依此类推上。这样做的好处是,查询不必检查许多索引条目就可以确定目标值是否存在,如果存在,则在数据表中出现的位置。

这是一种“分而治之”的策略。

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

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

在 EMPLOYEE(NAME) 上创建索引 IX_EmployeeName;

Sqlserver 2008 R2 的完整索引创建语法可在

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

于 2014-05-23T20:04:12.367 回答
2

您的索引应根据数据的使用方式来构建。我建议您先阅读此索引最佳实践

于 2013-08-21T11:45:53.387 回答
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)

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

创建索引示例

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

CREATE INDEX PIndex
ON Persons (LastName)

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

CREATE INDEX PIndex
ON Persons (LastName, FirstName)
于 2013-08-21T11:46:48.327 回答
1

您提供的示例涉及“表变量”。这意味着您正在创建一个可以像 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
 )
于 2014-05-23T20:38:17.743 回答
0

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

于 2013-08-21T11:49:04.397 回答
0

I would split this into two queries you don't want to try pulling all data or data from one id in the same stored proc.

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

The primary reason is you probably want a non-clustered index over CscID if you are looking for just say CscID = 104256 but if you are looking for all CscID you probably want an nonclusteredindexl over date column. I would also make sure you actually need a table variable it doesn't look from what you have like there is much of a good reason to toss one in randomly.

于 2016-01-08T19:29:35.140 回答