📄 61427.htm
字号:
<link href="./dzs_cs.css" rel="stylesheet" type="text/css" /><table width="96%" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td> </td> </tr> <tr> <td height="24" align="center" valign="bottom" class="d_font3">SQL Server如何识别真实和自动创建的索引</td> </tr> <tr> <td height="3" bgcolor="#E3E3E3"></td> </tr> <tr> <td> </td> </tr> <tr> <td class="d_font4"><P><STRONG>问:</STRONG>最近我发现sysindexes索引表中的很多条目并不是我自己创建的。听同事说它们并不是真正的索引,而是SQL Server查询优化器自动创建的统计。怎样才能识别哪些是真正的索引,哪些是SQL Server自动创建的统计呢? </P>
<P><STRONG>答:</STRONG>按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计。然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案。分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys。 </P>
<P>您还可以使用INDEXPROPERTY()函数的IsAutoStatistics属性来区分一个索引是真正的还是自动创建的统计,让SQL Server优化器选择需要创建的统计。您还可以为您管理的数据库启用“自动创建统计表”选项。 </P>
<P>很多人忽略了下面的明显的结论。自动创建统计的存在意味着某个真正的索引可能会从中受益。请考虑下列代码的输出: </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE> USE tempdb<BR> GO<BR> IF OBJECTPROPERTY(OBJECT_ID('dbo.orders'), 'IsUserTable')=1<BR> DROP TABLE dbo.orders<BR> GO<BR> SELECT * INTO tempdb..orders FROM northwind..orders<BR> GO<BR> SELECT * FROM tempdb..orders WHERE orderid = 10248<BR> GO<BR> SELECT * FROM tempdb..sysindexes WHERE id = object_id('orders')<BR> AND name LIKE<BR> '_wa_sys%'<BR> GO</PRE></TD></TR></TBODY></TABLE></P>
<P>该代码在tempdb中复制Northwind Orders表,选择一行,然后检查SQL Server是否添加了一个统计。很显然,该表没有OrderId列的索引,所以SQL Server自动创建了名为_WA_Sys_OrderID_58D1301D 的统计。OrderId列统计表的存在表明Northwind Orders表将得益于附加的索引。 </P>
<P>以下查询显示了为数据库中每个用户表自动创建的统计的数量,该数据库至少有一个自动创建的统计。 </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE> SELECT<BR> object_name(id) TableName<BR> ,count(*) NumberOfAutoStats<BR> FROM<BR> sysindexes<BR> WHERE<BR> OBJECTPROPERTY(id, N'IsUserTable') = 1<BR> AND INDEXPROPERTY ( id , name , 'IsAutoStatistics' ) = 1<BR> GROUP BY<BR> object_name(id)<BR> ORDER BY<BR> count(*) DESC</PRE></TD></TR></TBODY></TABLE></P>
<P>并不是所有的统计都可被真正的索引所替代。在某些情况下,SQL Server会为一个表自动创建超过50个统计。很明显,这些表的索引策略很差劲。对表及自动创建的与之相关联的统计的快速记数可以帮助您确定哪些表需要索引。</P>
<P><FONT size=4>【相关文章】</FONT></P>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200711/61057.htm" target=_blank><U><FONT color=blue>SQL Server存储过程命名标准</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200711/60954.htm" target=_blank><U><FONT color=blue>SQL Server和Oracle防止数据锁定的比较</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200711/60809.htm" target=_blank><U><FONT color=blue>如何实现SQL Server快速导入数据</FONT></U></A></LI></UL><DIV align=right>【责任编辑:<A class=ln href='mailto:sunsj@51cto.com'>火凤凰</A> TEL:(010)68476606】</DIV></td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -