回答

收藏

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

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-14

我有很多带有外键的表,有些表有索引,而另一些则没有。所有外键均使用名为FK_的索引命名IX_。' v, \. \) B# ~0 z. @
给定外键的列基数,是否有一些好的做法来创建(或不创建)索引?可以将此脚本编写为T-SQL命令吗?
' x' w; ^3 y% }$ ~& ?% K* ^6 Z               
& ]: c- V% g  C1 @解决方案:+ v/ q- j" @) W( i5 r& L0 ^. n
               
' V: }3 v, n. h$ t0 c* P
* V7 e8 G4 r: D! O- A7 E' s" H8 i4 s4 I! B2 E
                它们是通过T-4 x. l& z6 V3 m0 [% [
SQL脚本还是通过设计器创建的,都没有关系。您的问题有点模棱两可,所以我不确定您是否也在询问是否可以索引所有外键。但是,如果是这样,则应该在查询中经常引用的列上创建索引,并且可以执行以下操作以提高性能:
, w9 z7 ?& A# ?+ H% ~* Q$ c
8 t: ^4 ~. [& i0 c0 x( L运行数据库调整向导,该向导将提供改进摘要并建议索引。
1 [  }( z# X1 k  v0 v, D! @" Y# F/ @! C4 U+ e# ?
索引所有外键并运行执行计划(以查看查询执行得更快还是更慢)。
2 Z8 K* j- E; D4 M5 t& b) O9 S5 o; Y/ V2 ]3 f0 _' `0 R. h
% j" {1 ?9 B. y) z) v. A0 p
通过创建索引T-SQL:
+ X2 O) {- N; q, T7 W, GCREATE INDEX IX_INDEX_NAME3 W+ `- s" C! U" Y, }; P
ON Table (FieldName);
8 e; U! q( b  L( T! Q& ]$ O要获取所有外键的列表:
, B( B6 I7 t+ h8 A" G% MSELECT f.name AS ForeignKey, 8 B( q8 v4 d6 Z
OBJECT_NAME(f.parent_object_id) AS TableName, 2 K0 v, a' o% G! i% h
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
; M, V; E$ W/ d  G5 G OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
7 K9 t/ S. H5 ?  K$ Q# v; K4 a COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName $ c& F" Z1 K" z6 F; A7 V. k
FROM sys.foreign_keys AS f
: X/ A6 [  b* }1 _& eINNER JOIN sys.foreign_key_columns AS fc
0 v2 Z) _( u: ~1 ?/ _& S/ fON f.OBJECT_ID = fc.constraint_object_id
5 j2 d( n, Q; G. c' w: h要生成将索引应用于所有外键的脚本,您可以执行以下操作:
" v6 `: q# Z( O% L4 F1 ?' ZSELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'
* I/ t* U- M; a7 E6 vFROM sys.foreign_keys AS f
5 Z" W$ S. ~/ j$ U" n6 k, \  a/ ^. ?INNER JOIN sys.foreign_key_columns AS fc   E8 \2 `& D' D/ e  g
ON f.OBJECT_ID = fc.constraint_object_id
; Y; F0 q9 T+ n$ ehttp://msdn.microsoft.com/en-
# l2 [6 o( `6 v6 M* f$ }* Gus/library/ms188783.aspx
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则