Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库系统如何知道一个特定列有多少不同的值?_Sql_Database_Oracle - Fatal编程技术网

Sql 数据库系统如何知道一个特定列有多少不同的值?

Sql 数据库系统如何知道一个特定列有多少不同的值?,sql,database,oracle,Sql,Database,Oracle,在下面的链接 作者写道,由于“SEX”列只有两个可能的值,因此它对10000条记录的选择性是;根据给出的公式;0.02% 但我的问题是,数据库系统如何知道这个特定列有这么多独特的值?数据库系统不需要至少扫描整个表一次吗?或者数据库系统通过其他方式了解这些唯一值?数据库扫描表中的数据集,以便使用最有效的方法检索数据。数据库使用以下公式测量值的唯一性: Index Selectivity = number of distinct values / the total number of value

在下面的链接

作者写道,由于“SEX”列只有两个可能的值,因此它对10000条记录的选择性是;根据给出的公式;0.02%


但我的问题是,数据库系统如何知道这个特定列有这么多独特的值?数据库系统不需要至少扫描整个表一次吗?或者数据库系统通过其他方式了解这些唯一值?

数据库扫描表中的数据集,以便使用最有效的方法检索数据。数据库使用以下公式测量值的唯一性:

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)数量相关的过程

  • 手动统计数据收集:可以通过DBMS_STATS中的许多不同过程手动触发统计数据收集
  • 自动任务:因为10g Oracle有一个默认的自动任务作业“自动优化器统计数据收集”。它只会在当前统计数据过时时收集统计数据
  • 批量装载:可以收集12c中的统计信息
  • 样本:NDV可以根据100%的数据计算,也可以基于样本进行估计。样本可以基于块或行
  • 一次不同采样:11g引入了一个。它扫描整个表,但只使用一次采样。扫描整个表要比对其中一小部分进行排序快得多。对该算法有一些更深入的描述,例如
  • 增量统计信息:对于分区表,Oracle可以存储有关NDV的额外信息,称为摘要。有了这些信息,如果只修改了一个分区,则只需分析一个分区即可生成分区和全局统计信息
  • 索引NDV:在创建索引时,默认情况下会创建索引统计信息。此外,可以定期从DBMS_STATS.GATHER_Index_STATS或DBMS_STATS中其他过程中的级联选项重新收集信息
  • 自定义统计信息:可以使用DBMS\u STATS.set\u*或关联统计信息手动设置NDV
  • 动态采样:在执行查询之前,Oracle可以从表中自动采样少量数据块以估计NDV。这通常仅在缺少统计数据时发生

  • Oracle有许多与计算不同值数(NDV)相关的过程

  • 手动统计数据收集:可以通过DBMS_STATS中的许多不同过程手动触发统计数据收集<