如何在 SQL Server 2008 数据库上创建非聚集索引?最好不用代码?

如何在 SQL Server 2008 数据库上创建非聚集索引?最好不用代码?

我希望得到有关如何在不使用代码的情况下在 SQL Server 2008 数据库上创建非聚集索引的帮助 - 或者更确切地说,在运行任何 SQL 查询之前一劳永逸地“静态”创建非聚集索引(这可能没有意义,但我的观点是我不想每次运行作为我的业务应用程序一部分的 SQL 查询时都运行 SQL 命令来创建索引)。

也就是说,理想情况下,在 Visual Studio 2010 Professional 中内置有 Microsoft SQL Server 工具(注意:我没有企业版或旗舰版 - 这与使用专业版内置 SQL 管理器所能做的事情有很大不同)可以执行此操作 - 因为我没有其他工具(我刚刚查看,发现 Microsoft SQL Server 2008 没有我需要的东西 - 至少在我的系统上 - 它显然是一个有缺陷的免费软件版本)。因此,也许需要一个简单的 SQL 命令来索引下表。

我已阅读下面的参考资料,但我不知道如何做到这一点。

这是我的表格:

Table CUSTOMER
Columns:

CustomerID = GUID - this is a unique primary key

CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique   
compared to the rest of decimal fields.  I wish to index this field 1 of 2

CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
 compared to the rest of decimal fields. I wish to index this field 2 of 2

CustomerTextComments = vChar(50)

十进制字段经常用于 WHERE 子句,因此它们是非聚集索引的理想候选者,这显然是 Microsoft SQL Server 2008 中支持的新功能。

关于我的平台的更多信息:我已经有一个包含现有数据的表,但只有几条记录,大部分是空白的。我正在使用 Visual Studio 2010 内部的服务器资源管理器进行操作,它具有许多功能,包括生成 SQL 查询的能力。理想情况下,我想在 Linq-to-entities 中编写任何索引方法(只是因为我不太了解 SQL),但如果有人能给我一个完整的列表,说明如何在这个表中索引 CustomerDecimal1、CustomerDecimal2 字段,我将不胜感激。

参考:

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (SQL Server 2008 用于 WHERE 子句搜索的新“过滤”索引属性)

http://en.wikipedia.org/wiki/Index_%28database%29#Non-clustered

- - -更新

@mrdenny -- 感谢您抽出时间,我知道您享有极高的声誉,但我无法相信您说的话——是的,我很固执,我称之为否认! :-) 我会继续开放这个帖子,希望其他人能看到它。此外,由于我不在本机运行 SQL,只在实体框架 (EF 4.0) 内部运行 Linq-to-entities,我甚至不知道将您提供的代码放在哪里(“T/SQL 在两个十进制列上创建非聚集索引”)。我在 WHERE 搜索中始终使用两个十进制列——因此您的第一个 SQL 命令对我来说是合适的。

有人能将 Denny 先生的第一段 SQL 代码翻译成 Linq-to-Entities 吗?如果做不到,我会举手说我不相信(这与我读到的关于索引就像一棵平衡树的说法相悖,平衡树应该自动内置到系统中),或者,换句话说,我从字里行间读到索引最多可以为您节省大约 20% 的性能——这很好,但没有什么值得太过激动的。是的,这是酸葡萄心理!

答案1

首先,非聚集索引在 SQL Server 2008 中并不是新事物。它们一直存在。过滤索引在 SQL Server 2008 中是新事物。

在针对 SQL Server 运行任何查询之前,系统无法确定需要创建哪些索引。

在 SQL Server 中创建索引有两种方法。一种是使用 T/SQL,另一种是使用具有图形编辑器的 SQL Server Management Studio。图形编辑器将简单地生成 T/SQL 并针对数据库运行 T/SQL。

在两个十进制列上创建非聚集索引的 T/SQL 看起来如下所示。

CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

如果您计划在搜索数据库表时独立使用两个 CustomerDecimal 字段,则需要为每个字段使用单独的索引。

CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

无论哪种情况,您都需要将要返回的列添加到包含列的列表中,以便最大限度地减少生成的 IO。

相关内容