Sql 数据库系统如何知道一个特定列有多少不同的值?
在下面的链接 作者写道,由于“SEX”列只有两个可能的值,因此它对10000条记录的选择性是;根据给出的公式;0.02%Sql 数据库系统如何知道一个特定列有多少不同的值?,sql,database,oracle,Sql,Database,Oracle,在下面的链接 作者写道,由于“SEX”列只有两个可能的值,因此它对10000条记录的选择性是;根据给出的公式;0.02% 但我的问题是,数据库系统如何知道这个特定列有这么多独特的值?数据库系统不需要至少扫描整个表一次吗?或者数据库系统通过其他方式了解这些唯一值?数据库扫描表中的数据集,以便使用最有效的方法检索数据。数据库使用以下公式测量值的唯一性: Index Selectivity = number of distinct values / the total number of value
但我的问题是,数据库系统如何知道这个特定列有这么多独特的值?数据库系统不需要至少扫描整个表一次吗?或者数据库系统通过其他方式了解这些唯一值?数据库扫描表中的数据集,以便使用最有效的方法检索数据。数据库使用以下公式测量值的唯一性:
Index Selectivity = number of distinct values / the total number of values
结果将在0或1之间。索引选择性为零意味着没有任何唯一值。在这些情况下,索引实际上会降低性能。所以数据库使用顺序扫描而不是搜索操作。
有关索引的详细信息,请阅读数据库扫描表中的数据集,以便使用最有效的方法检索数据。数据库使用以下公式测量值的唯一性:
Index Selectivity = number of distinct values / the total number of values
结果将在0或1之间。索引选择性为零意味着没有任何唯一值。在这些情况下,索引实际上会降低性能。所以数据库使用顺序扫描而不是搜索操作。
有关索引的详细信息,请首先阅读,您应用的公式是错误的。性别选择性(在给出的示例中)为50%,而不是0.02%。这意味着每个值大约有50%的时间出现
数据库跟踪这种情况的一般方法是使用一种叫做“统计”的东西。这些是保存在所有表中并由优化器使用的度量。有时,也可以通过列上的索引提供信息。首先,您应用的公式是错误的。性别选择性(在给出的示例中)为50%,而不是0.02%。这意味着每个值大约有50%的时间出现
数据库跟踪这种情况的一般方法是使用一种叫做“统计”的东西。这些是保存在所有表中并由优化器使用的度量。有时,信息也可以通过列上的索引提供。回到实际问题:是的,数据库经常扫描所有表数据,并在内部表中保存一些统计信息(例如最大值、最小值、不同键的数量、表中的行数等)。这些统计信息用于估计查询(或其他DML操作)的基本结果,以评估最佳执行计划。您可以通过运行命令
EXEC DBMS\u STATS.GATHER\u DATABASE\u STATS手动触发统计信息的生成
或某些。您还可以建议Oracle仅读取所有数据的样本(例如,所有行的10%)
通常,数据内容不会发生剧烈变化,因此,如果数字不完全准确,则无所谓,它们(通常)足以估计执行计划。回到实际问题:是的,数据库会经常扫描所有表数据并保存一些统计信息,(例如,最大值、最小值、不同键的数量、表中的行数等)。这些统计信息用于估计查询(或其他DML操作)的基本结果为了评估最佳执行计划。您可以通过运行命令
EXEC DBMS\u STATS.GATHER\u DATABASE\u STATS;
或其中一些命令手动触发统计数据的生成。您还可以建议Oracle仅读取所有数据的样本(例如,所有行的10%)
通常,数据内容不会发生剧烈的变化,因此,如果数字不完全准确,则无所谓,它们(通常)足以估计执行计划。Oracle有许多与计算不同值(NDV)数量相关的过程
Oracle有许多与计算不同值数(NDV)相关的过程