我只是想知道如何将此表索引以获得最佳性能?这可能会容纳大约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的东西,如果我在正确的轨道上,请告诉我。
同样,很多数据都会放在这张桌子上。不幸的是,由于没有可用的数据,我无法测试性能。但我很快就会生成一些虚拟数据来测试性能。但如果已有其他选项(建议)可用,我可以将结果与之比较,那就太好了。
谢谢, 千斤顶
答案 0 :(得分:2)
我会将这些索引合并到一个索引中,而不是具有三个单独的索引。例如:
CREATE INDEX ix_cols ON dbo.Table1 (Col1, Col2, Description)
如果列的这种组合在表中是唯一的,那么您应该添加UNIQUE关键字以使索引唯一。这是出于性能原因,但更重要的是,要强制执行唯一性。如果合适,也可以将其创建为主键。
将所有列放入一个索引将提供更好的性能,因为SQL Server不需要使用多个传递来查找您正在寻找的行。
答案 1 :(得分: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]
)