小编Jon*_*Jon的帖子

了解SSMS中的索引和缺失索引建议

了解指数和缺失指数建议

我正在努力更好地理解索引.我有很多阅读要做的事情,并从其他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不建议在该索引中包含该列.想知道我应该如何处理这张表中的独特价值?我猜的是一个集群的,独特的索引?

我的问题

  1. 我想了解这个索引建议背后的逻辑.鉴于有关a和b列中类似值的信息,为什么建议这样做?

  2. 我想了解ON列和INCLUDE列之间的区别?

sql sql-server sql-server-2012

7
推荐指数
1
解决办法
1120
查看次数

事务在违反唯一约束后仍然提交

我有一个这种格式的存储过程(简化):

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)

sql t-sql sql-server

3
推荐指数
1
解决办法
169
查看次数

标签 统计

sql ×2

sql-server ×2

sql-server-2012 ×1

t-sql ×1