1

我只想知道如何索引此表以获得最佳性能?这可能会保存大约 20M 行。

  CREATE TABLE [dbo].[Table1]( 
  [ID] [bigint] NOT NULL,
  [Col1] [varchar](100) NULL,
  [Col2] [varchar](100) NULL,
  [Description] [varchar](100) NULL
  ) ON [PRIMARY]

基本上,只能以这种方式查询该表。

    SELECT ID FROM Table1
    WHERE Col1 = 'exactVal1' AND Col2 = 'exactVal2' AND [Description] = 'exactDesc'

这就是我所做的:

    CREATE NONCLUSTERED INDEX IX_ID
    ON Table1(ID)
    GO 

    CREATE NONCLUSTERED INDEX IX_Col1
    ON Table1(Col1)
    GO 

    CREATE NONCLUSTERED INDEX IX_Col2
    ON Table1(Col2)
    GO 

    CREATE NONCLUSTERED INDEX IX_ValueDescription
    ON Table1(ValueDescription)
    GO 

我对所有这些列进行索引是否正确?还没有那么自信。刚接触 SQL 的东西,如果我在正确的轨道上,请告诉我。

同样,很多数据将放在这张表上。不幸的是,由于没有可用数据,我还无法测试性能。但我很快就会生成一些虚拟数据来测试性能。但是,如果已经有另一个选项(建议)可以用来比较结果,那就太好了。

谢谢,杰克

4

2 回答 2

2

我会将这些索引组合成一个索引,而不是三个单独的索引。例如:

CREATE INDEX ix_cols ON dbo.Table1 (Col1, Col2, Description)

如果此列组合在表中是唯一的,则应添加 UNIQUE 关键字以使索引唯一。这是出于性能原因,但更重要的是,为了强制执行唯一性。如果合适的话,它也可以创建为主键。

将所有列放入一个索引将提供更好的性能,因为 SQL Server 不需要使用多次传递来查找您正在寻找的行。

于 2013-06-12T20:14:36.870 回答
1

尝试这个 -

CREATE TABLE dbo.Table1 
(
      ID BIGINT NOT NULL
    , Col1 VARCHAR(100) NULL
    , Col2 VARCHAR(100) NULL
    , [Description] VARCHAR(100) NULL
)
GO

CREATE CLUSTERED INDEX IX_Table1 ON dbo.Table1 
(
      Col1
    , Col2
    , [Description]
)

或这个 -

CREATE TABLE dbo.Table1 
(
      ID BIGINT PRIMARY KEY NOT NULL
    , Col1 VARCHAR(100) NULL
    , Col2 VARCHAR(100) NULL
    , [Description] VARCHAR(100) NULL
)
GO

CREATE UNIQUE NONCLUSTERED INDEX IX_Table1 ON dbo.Table1 
(
      Col1
    , Col2
    , [Description]
)
于 2013-06-13T06:35:18.177 回答