在下面的链接
http://www.programmerinterview.com/index.php/database-sql/selectivity-in-sql-databases/
作者写道,由于“性别”列只有两个可能的值,因此它对10000条记录的选择性将是;根据给定的公式;0.02 %。
但我的问题是,数据库系统如何知道此特定列具有如此多的唯一值?难道数据库系统不需要扫描整个表至少一次吗?或者以其他方式让数据库系统知道这些唯一的值?
发布于 2013-12-27 01:02:22
首先,你应用的公式是错误的。性别的选择性(在给定的示例中)将是50%,而不是0.02%。这意味着每个值大约50%的时间都会出现。
数据库跟踪这一点的一般方法是使用一种称为“统计”的东西。这些度量值保留在所有表中,并由优化器使用。有时,信息也可以由列上的索引提供。
发布于 2013-12-27 03:05:00
回到你的实际问题:是的,数据库频繁地扫描所有表数据并保存一些统计数据(例如最大值、最小值、不同键的数量、表中的行数等)。在内部表中。这些统计信息用于对查询(或其他DML操作)的基本结果进行,以便评估最佳的执行计划。您可以通过运行命令EXEC DBMS_STATS.GATHER_DATABASE_STATS;或一些other ones来手动触发统计信息的生成。您还可以建议Oracle仅读取所有数据的样本(例如,所有行的10% )
通常数据内容不会有很大的变化,所以如果这些数字不是绝对准确的,那也没关系,它们(通常)足以估计一个执行计划。
发布于 2013-12-27 13:52:13
Oracle有许多与计算不同值的数量(NDV)相关的进程。
https://stackoverflow.com/questions/20788324
复制相似问题