当前位置: 首页 > 面试题库 >

sql server:在必要时在外键上创建索引

柳志专
2023-03-14
问题内容

我有很多带有外键的表,有些表有索引,而另一些则没有。所有外键均使用名为FK_<name of the foreign key>的索引命名IX_<name of the foreign key>

给定外键的列基数,是否有一些好的做法来创建(或不创建)索引?可以将此脚本编写为T-SQL命令吗?


问题答案:

它们是通过T-
SQL脚本还是通过html" target="_blank">设计器创建的,都没有关系。您的问题有点模棱两可,所以我不确定您是否也在询问是否可以索引所有外键。但是,如果是这样,则应该在查询中经常引用的列上创建索引,并且可以执行以下操作以提高性能:

  • 运行数据库调整向导,该向导将提供改进摘要并建议索引。

  • 索引所有外键并运行执行计划(以查看查询执行得更快还是更慢)。

通过创建索引T-SQL

CREATE INDEX IX_INDEX_NAME
ON Table (FieldName);

要获取所有外键的列表:

SELECT f.name AS ForeignKey, 
 OBJECT_NAME(f.parent_object_id) AS TableName, 
 COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
 OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
 COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id

要生成将索引应用于所有外键的脚本,您可以执行以下操作:

SELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id

http://msdn.microsoft.com/en-
us/library/ms188783.aspx



 类似资料:
  • b)对Employee类中的ReferencedColumnName='department id'使用@ManyToOne和@JoinColumn。 建议采用哪种方法?还是这两种方法用于完全不同的问题?

  • 问题内容: 如何创建外键 从表tGeoAnswers列’locationId’ 表tLocations列“ ID”? 我正在尝试找到的这段代码,但出现以下错误: “ FK_Answer_Location”列的定义必须包含数据类型 问题答案: 否则,假设您要添加名为的列。

  • 我试图在两个表之间创建一个外键约束,但在执行alter命令之后,mysql创建了索引而不是外键。 我使用的是hibernate,所以最初我认为这是hibernate的问题,但当我直接在mysql上执行查询时,行为是一样的。 更改表person添加约束FK9ircw28d19mdg5pu8yfg1qs8p外键(Address_Id)引用地址(Address_Id) 运行此命令后,我会在mysql数据

  • 我试图在laravel中创建一个主键-外键关系,但我一直遇到这个错误 我似乎找不到哪里出错了,因为我在查看了SO上的其他答案后,对模式进行了更改。 当我运行时,上面的错误会弹出,这是一个部分迁移。 任何指向这将是真棒,因为我已经寻找了一段时间的解决方案! 谢谢 员工表 部门表 工资表 新增:DB播种机。 根据评论更改了DB种子程序

  • 问题内容: 在用户属于特定组织的情况下,我们具有以下实体关系。我的查询看起来像是“从org =:org用户选择”或“从org =:org用户输入和type =:type选择” 我在User类上有单独的索引。由于外键元素上的索引,因此第一个查询会很好。第二个查询是否对组织和类型列要求多列索引。如果是这样,我应该如何注释以创建一个这样的索引。 问题答案: 使用hibernate特定注释可以做到这一点。

  • 问题内容: 我有一个CHAR(250)列用作varchar(24)列的外键。 在MySQL中,我记得我可以创建一个指定column(24)的索引,以便在最左边的24个字符上创建索引。在MS SQL Server上似乎无法实现。 我的问题是这样的: 是否可以在SQL Server 2008上使用索引视图为该列的子字符串建立索引,如果是,则它会对表的性能产生任何副作用吗? 问题答案: 您可以创建一个持