回答

收藏

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

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

我有很多带有外键的表,有些表有索引,而另一些则没有。所有外键均使用名为FK_的索引命名IX_。
% R; e" P9 j# W: c3 [) o. c给定外键的列基数,是否有一些好的做法来创建(或不创建)索引?可以将此脚本编写为T-SQL命令吗?
: k$ B# \; t) q$ f5 T& n* u* X- z                / j" ?: v9 @2 ?3 J" C
解决方案:) K' p1 _. ]3 ?5 F
               
& M+ @$ H) u- U4 q$ S3 U
( @7 T( p5 c( w6 L) I! V" N' M  |1 D
! Z' x) B3 Q1 m2 T7 d, D5 Q                它们是通过T-
' s- s' c- ^' W: l7 A% m/ kSQL脚本还是通过设计器创建的,都没有关系。您的问题有点模棱两可,所以我不确定您是否也在询问是否可以索引所有外键。但是,如果是这样,则应该在查询中经常引用的列上创建索引,并且可以执行以下操作以提高性能:
9 L5 g- M* ^6 `7 _: z+ {; G
) P' e: J5 ^. Q+ E! z运行数据库调整向导,该向导将提供改进摘要并建议索引。
; M* U) V$ q% `% h5 Z8 n$ u  k) B3 h
索引所有外键并运行执行计划(以查看查询执行得更快还是更慢)。
( S9 j4 o- e% h; h' ^  P/ t/ j7 J. O7 N1 P* u' b( y2 R% F

, L6 N! J8 s2 ]通过创建索引T-SQL:
  f! q: N! Y  XCREATE INDEX IX_INDEX_NAME
' U/ B5 Q( ?: S* qON Table (FieldName);
/ t- p" y" j8 g" E& U2 b) @要获取所有外键的列表:. n5 A$ g, R9 Q; f
SELECT f.name AS ForeignKey,
6 ?% |$ Z) N  ^' ]7 H OBJECT_NAME(f.parent_object_id) AS TableName, 9 m, l: v7 n: w) W0 x
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
! I+ ], M. b" q9 a& r" L: r OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
6 x+ r  W5 C; h7 n9 y! ^( X# K" q5 X COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
9 X, _  m: f# R+ k1 ^7 V% D/ j% EFROM sys.foreign_keys AS f 7 E- |, ?/ |2 ~# u5 @
INNER JOIN sys.foreign_key_columns AS fc
2 [/ ]. i7 C( l& U4 @; nON f.OBJECT_ID = fc.constraint_object_id
5 \. T8 s1 }3 b0 f- k/ [要生成将索引应用于所有外键的脚本,您可以执行以下操作:
6 R0 B( \( k( ^; ?SELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'- [& |5 j; }" ]
FROM sys.foreign_keys AS f - A5 ?/ b: e8 t% S) t) M5 M
INNER JOIN sys.foreign_key_columns AS fc   N9 r9 z/ B2 Y( k' T' W
ON f.OBJECT_ID = fc.constraint_object_id; S7 Y' r3 u) g8 {) C
http://msdn.microsoft.com/en-/ ]3 O; u- c' f9 t3 |' s
us/library/ms188783.aspx
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则