因此,对于这个项目,我们有一堆定期执行的查询(每分钟左右.我使用"数据库引擎中的分析查询"来检查它们.
它们非常简单:select*from tablex where processed ='0'
处理时有一个索引,每个查询应在具有1MM记录的表上返回<1000行.
分析器建议在此创建一些统计数据......所以我的问题是:这些统计数据是什么?他们真的有助于表现吗?对于像上面这样的桌子,它们的成本有多高?
请记住,我绝不会称自己为SQL Server有经验的用户......这是第一次使用此分析器.
统计信息是SQL Server用于确定如何获取数据的可行性的统计信息.
例如,假设您有一个只在主键上有聚簇索引的表.执行时SELECT * FROM tablename WHERE col1=value
,SQL Server只有一个选项,用于扫描表中的每一行以查找匹配的行.
现在我们在col1上添加一个索引,所以你假设SQL Server将使用索引来查找匹配的行,但这并不总是正确的.假设该表有200,000行,并且col1
只有2个值:1和0.当SQL Server使用索引查找数据时,索引包含指向聚簇索引位置的指针.鉴于索引列中只有两个值,SQL Server认为仅扫描表更有意义,因为使用索引会更有效.
现在我们将向表中添加另外800,000行数据,但这次值的col1
变化很大.现在它是一个有用的索引,因为SQL Server可以通过使用索引来限制从表中提取的内容.SQL Server会使用索引吗?
这取决于.它取决于统计数据.在某个时间点,如果AUTO UPDATE STATISTICS
设置为on,服务器将更新索引的统计信息并知道它是一个非常好且有效的索引.然而,在那之前,它将忽略索引无关紧要.
这是统计数据的一种用途.但还有另一种用途,与指数无关.SQL Server保留有关表中所有列的基本统计信息.如果有足够的不同数据使其值得,SQL Server实际上会在列上创建一个临时索引并使用它来过滤.虽然这比使用现有索引花费更多时间,但它比完整表扫描花费的时间更少.
有时,您会获得建议,以创建对此有用的列的特定统计信息.这些不是索引,但是会跟踪列中数据的统计抽样,因此SQL Server可以确定创建临时索引以返回数据是否有意义.
HTH