了解指数和缺失指数建议
我正在努力更好地理解索引.我有很多阅读要做的事情,并从其他SO帖子中找到了一些宝贵的资源,其中一些是我读过的,其他一些我还需要阅读.与此同时,我正试图从我的数据库中获得更好的性能.
我已经了解到覆盖索引的性能会比单个列上的索引更好,因此我决定首先删除单个索引,然后让建议的查询执行计划推荐索引.
SSMS索引建议
CREATE NONCLUSTERED INDEX IX_my_index_name
ON [dbo].[my_table] ([field_a],[field_b])
INCLUDE (
[field_1]
,[field_2]
,[field_3]
,[field_4]
,[field_5]
,[field_6]
)
Run Code Online (Sandbox Code Playgroud)
表详细信息
字段1-6是我通常用来连接我正在使用的2个表的列.字段a和b可以在我运行的几个耗时的查询的where子句中找到.
我理解使用字段1-6,因为在大多数情况下它们都包含许多不同的值,但field a只有大约75个不同的值,并且field b只有3个不同的值.这是一张包含70MM记录的表格.
请注意,这是一个堆.此表上的所有记录都来自另一个具有主键的表,因此它带有唯一值,但它不会在此表上设置为键或唯一索引.SSMS不建议在该索引中包含该列.想知道我应该如何处理这张表中的独特价值?我猜的是一个集群的,独特的索引?
我的问题
我想了解这个索引建议背后的逻辑.鉴于有关a和b列中类似值的信息,为什么建议这样做?
我想了解ON列和INCLUDE列之间的区别?
我有一个这种格式的存储过程(简化):
SET XACT_ABORT ON
GO
BEGIN TRY
BEGIN TRANSACTION myTransaction
--multiple CRUD operations
--insert statement inserts records into table with unique constraint.
IF (XACT_STATE()) = 1
BEGIN
COMMIT TRANSACTION myTransaction
RAISERROR ('TRANSACTION COMMITTED', 0, 1) WITH NOWAIT
RETURN 1
END
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
BEGIN
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
ROLLBACK TRANSACTION myTransaction
RAISERROR ('TRANSACTION ROLLED BACK', 0, 1) WITH NOWAIT
RETURN …Run Code Online (Sandbox Code Playgroud)