Sql 如何在列上创建索引以增加查询的执行

Sql 如何在列上创建索引以增加查询的执行,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我不会在这里添加查询,因为查询中没有特殊内容。 在查询中,我在10个表上留下了连接。 ...left join tableB b on a.UserId = b.UserId left join tableC c on a.UserId = c.UserId left join tableD d on a.UserId = d.UserId 此查询的执行时间为23秒。这已经太多了。 所有表都通过UserId外键连接,外键类型为uniqueidentifier 现在我想我可能需要添加索引,但这是

我不会在这里添加查询,因为查询中没有特殊内容。
在查询中,我在10个表上留下了连接。

...left join tableB b on a.UserId = b.UserId
left join tableC c on a.UserId = c.UserId
left join tableD d on a.UserId = d.UserId
此查询的执行时间为23秒。这已经太多了。
所有表都通过
UserId
外键连接,外键类型为
uniqueidentifier

现在我想我可能需要添加索引,但这是我第一次这么做,我不确定我是否做对了。
在ManagementStudio中,我进入
表格设计>管理键索引>添加索引>在下拉列表中选择用户ID(ASC)

我在所有10个表中执行此操作,运行查询后,查询的执行时间为45秒。这比以前更糟。

添加索引时我是否做错了?

如果您选择的是用户id以外的任何列,则在用户id上添加索引对您没有帮助。为了获得最佳性能,您可以在每个表上创建一个非聚集索引,该索引按用户id排序,并且还包含查询所需的所有其他列


这将为您提供最佳性能,但维护所有这些索引会带来大量开销,因此您必须考虑到这一点。

这是按问题分组的。我用稍微不同的方式组织这个组,现在执行时间是以毫秒为单位:)这里是我所做的。我从select中删除了
count()
,并按部分删除了整个组,从我写的中删除了:

select S3.TotalCheckIns
...
left join (select userid, count(CheckInId) as TotalCheckIns
   FROM dbo.checkins
   GROUP BY UserId) S3 on p.UserId = S2.UserId
   where p.UserId = @m_UserId

我使用了此链接中的技术

想法是为每个FK和PK创建索引(此索引是自动创建的)这样做,您的连接将加快

请在更改前后发布执行计划。我在问题中添加了查询。我从不参与执行计划。我应该给你看什么?我运行它,但我得到了非常大的文本。