|
我有很多带有外键的表,有些表有索引,而另一些则没有。所有外键均使用名为FK_的索引命名IX_。, X+ Q* P0 ~# t% s
给定外键的列基数,是否有一些好的做法来创建(或不创建)索引?可以将此脚本编写为T-SQL命令吗?4 |8 \' g; K9 R9 S
% v9 @; L; s9 f' |解决方案:" k4 q% W" S( H3 W3 b1 S: s$ p
' ]& G. j1 n8 I0 W7 J/ Z5 Z+ N
( }3 K3 _2 @$ `, [
, [( K G& x( V) r. K; ` 它们是通过T-
% {/ R9 u8 |( P3 L+ i) ^" h0 TSQL脚本还是通过设计器创建的,都没有关系。您的问题有点模棱两可,所以我不确定您是否也在询问是否可以索引所有外键。但是,如果是这样,则应该在查询中经常引用的列上创建索引,并且可以执行以下操作以提高性能:6 i1 u- \+ o0 |
5 {$ N, h+ f1 T! ?
运行数据库调整向导,该向导将提供改进摘要并建议索引。, w, P: r6 F: ]/ P, b1 P' }, c1 \+ s
$ Q4 S4 [9 E# x$ S5 d索引所有外键并运行执行计划(以查看查询执行得更快还是更慢)。 4 t& S, j7 Q# A4 X8 G9 E$ s
. i, W | Q& n" v% v$ d6 ?) E
1 Y% ^. S* v, I0 e; ?# z# K通过创建索引T-SQL:6 ^1 K0 m* w D8 |
CREATE INDEX IX_INDEX_NAME
6 b. a7 b6 l/ e. xON Table (FieldName);
1 w) L# }& @6 t- ?4 ?7 @$ i要获取所有外键的列表:
; F2 T5 z' l! Z$ Q, eSELECT f.name AS ForeignKey, ! F3 z- g2 q& h/ u& ]9 |: O
OBJECT_NAME(f.parent_object_id) AS TableName, 8 e [7 f2 W$ [
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
8 t5 k. y4 n" ~ OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, ' x* ]3 _3 K2 b! ^' Z
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
2 q3 f1 i" B" M$ E0 ^8 \FROM sys.foreign_keys AS f
$ N i3 X6 X% s5 x1 B5 `INNER JOIN sys.foreign_key_columns AS fc
0 s! Q1 |2 a! w1 }+ C$ k# pON f.OBJECT_ID = fc.constraint_object_id
+ w1 K" Y/ B8 r I要生成将索引应用于所有外键的脚本,您可以执行以下操作:
5 T( D* a+ n2 y9 S, wSELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'
+ a* _# K% m" h `: o; K/ pFROM sys.foreign_keys AS f $ n4 {6 Z; `! _" L/ W1 d, z0 D) `
INNER JOIN sys.foreign_key_columns AS fc ; J- Q' L( K) [/ V1 x+ ?
ON f.OBJECT_ID = fc.constraint_object_id
, D" b1 ~3 H! N4 n" a/ ]. o: Q3 Shttp://msdn.microsoft.com/en-) J8 i' f/ ~$ _; x
us/library/ms188783.aspx |
|