OLE DB 访问接口的分发内容统计要求
为进一步优化分布式查询,SQL Server 定义了 OLE DB 规范的扩展,OLE DB 访问接口可以使用这些扩展来报告它们所显示的行集或表的分布统计。尽管这些扩展是在 SQL Server 文档中定义的,但如果要使 SQL Server 可以使用这些信息,各个 OLE DB 访问接口开发人员必须为其访问接口中的扩展提供支持代码。如果访问接口有支持扩展的代码,则 SQL Server 就可以使用这些扩展来优化分布式查询的性能。如果访问接口不支持扩展,SQL Server 将使用分布统计的简单估计值。
注意 |
---|
MicrosoftSQL Server Native Client OLE DB 访问接口和 Microsoft OLE DB Provider for Oracle 都支持分布统计。 |
分布统计扩展围绕称为“统计”的单元生成。每个表都可以有零个或多个统计,每个统计报告一个或多个列的数据。统计记录以下内容:
该统计所涉及的每列中的值的基数(即唯一值的个数)。
该统计所涉及的所有列的串联值的基数。
或者,报告有关该统计所涉及的第一列中不同范围的键值的信息的直方图。报告的值可以包括每一键值范围内的行数、唯一值的数目,或者键值小于或等于该范围内最高键值的表中的行数。
下面是示例表。
ColumnA |
ColumnB |
---|---|
'abc' |
'xyz' |
'abc' |
'xyz' |
'def' |
'xyz' |
'mno' |
'xyz' |
'mno' |
'mmm' |
'tuv' |
'xyz' |
对于包含 ColumnA 和 ColumnB 的统计,两列组合值的基数是 5。这意味着 ColumnA 和 ColumnB 的值有 5 种唯一组合,因为前两行的组合值 ('abc' + 'xyz') 相同。
ColumnA 单独的基数是 4,ColumnB 单独的基数是 2。对于 ColumnA,将报告一个简单的四步直方图。
值范围 |
该范围内表行数所占的百分比 |
---|---|
'aaa' 到 'hzz' |
50% |
'iaa' 到 'nzz' |
33% |
'oaa' 到 'rzz' |
00% |
'taa' 到 'zzz' |
17% |
不同的 OLE DB 数据源记录不同列组合的分布统计,OLE DB 访问接口报告的一组统计是可以通过定义来实现的。例如,SQL Server 6.5 版和更低版本仅为索引涉及的列生成分布统计,为表中定义的每个索引生成一个统计。SQL Server 7.0 版和更高版本生成下列统计:
为表中定义的每个索引生成一个统计。
为每个 CREATE STATISTIC 语句生成一个统计。
为自动生成的每个统计生成一个统计。
如果对于谓词参数中指定的特定值,某列可能返回较少的行数,则该列具有很高的选择性。分布统计可以用来估计选择性的程度:
与基数小的列比较而言,基数大的列具有更多的数据值,每个数据值可能与更少的行数匹配。
如果 OLE DB 访问接口提供直方图来报告列中值的分布情况,则 SQL Server 优化器还可以估计谓词参数中的特定值是位于选择性较好的范围内,还是位于选择性较差的范围内。
链接服务器有一个良好的分布统计还有助于优化器为分布式查询的本地部分生成高效的执行计划。
SQL Server 优化器使用分布统计来尝试减少必须在 OLE DB 访问接口与 SQL Server 之间通信的数据量。例如,在本地服务器的 TableA 和链接服务器的 TableB 之间执行分布式联接时,SQL Server 可以使用分布统计来确定以下两个过程中哪一个效率更高:
将 TableA 中与非联接谓词匹配的行发送到链接服务器,并使链接服务器执行该联接。
将 TableB 中与非联接谓词匹配的行检索到本地服务器,并在本地服务器上执行该联接。
如果 OLE DB 访问接口没有报告有关列的基数信息,则 SQL Server 优化器将估计一个较小的基数。如果访问接口没有报告统计的分布直方图,则优化器在进行操作时将把值视为均匀分布在表的各行中。
SQL Server 使用 OLE DB 访问接口的下列扩展来报告分布统计:
数据源属性 DBPROP_TABLESTATISTICS,指示该访问接口是否报告分布统计。
IDBSchemaRowset TABLE_STATISTICS,列出了指定基表的可用统计。它包括列基数和行基数。
IOpenRowset::OpenRowset,接受用于确定统计的参数。如果指定一个统计,OpenRowset 将返回一个直方图行集,其中显示 StatisticID 中指定的统计所涉及的第一列中值的分布情况。
OLE DB 2.6 版或更高版本中包括 OLE DB 的这些扩展。有关与分布统计有关的这些扩展的信息,请参阅 OLE DB 2.6 规范。
OLE DB 访问接口可以选择实现以下性能增强功能:仅对基表中的部分行进行抽样来确定分布统计和直方图。这些访问接口应该在 TABLE_STATISTICS 和直方图行集中报告它们的基数和直方图数据之前计算这些数据来反映表的总值。
在实现时定义 OLE DB 访问接口是否将 TABLE_STATISTICS 和直方图行集中的数据与当前的基表内容保持一致。
注意 |
---|
若要在某一链接服务器上使用表时创建最佳查询计划,查询处理器必须具有来自该链接服务器的数据分布统计。对表的任何列具有有限权限的用户可能没有足够的权限来获取所有有用的统计,并且可能会收到效率较低的查询计划和经历不佳的性能。如果链接服务器是 SQL Server 的实例,若要获取所有可用的统计,用户必须拥有该表或者是链接服务器上 sysadmin 固定服务器角色、db_owner 固定数据库角色或者 db_ddladmin 固定数据库角色的成员。 |