【问题标题】:Database Indexing? [duplicate]数据库索引? [复制]
【发布时间】:2014-03-07 01:24:39
【问题描述】:

我对 DBMS 中的索引有疑问。我知道他们通过更快地定位数据来提高性能。但我的问题是,我想为某个数据库使用索引类型吗?

这是我从样本考试中得到的一个问题:

以下问题基于查询中显示的 ER 模型。

SaleCo ER 模型

SELECT         P_CODE, P_DESCRIPT, P_PRICE, PRODUCT.V_CODE, V_STATE
FROM PRODUCT P, VENDOR V
WHERE          P.V_CODE = V.V_CODE
  AND         V_STATE = ‘NY’
  AND         V_AREACODE = ‘212’;
ORDER BY   P_PRICE;

-我会为此查询推荐哪些索引?为什么?

-如何编写我推荐的创建索引所需的命令。

-如何编写用于生成 PRODUCT 和 VENDOR 表的统计信息的命令。

应该有一个模型显示,但没有一个样本考试来告诉你期待什么!

如果有人可以通过查看代码以及如何创建它来帮助理解推荐索引的标准,我将不胜感激。如果我发布的问题(代码)不清楚,请举一个不同的例子。

非常感谢您

【问题讨论】:

  • 索引的经验法则:在比较操作中使用的任何字段都应该被索引。那是wherejoinorder by 等中使用的任何字段……但总的来说,您的问题太宽泛了。 “如何编写命令”由你决定——如果这个测试是关于 sql 语法的,如果我们只给你答案,你将一无所获。提示:查找“alter”。

标签: sql oracle indexing database


【解决方案1】:

首先,我将使用标准 join 语法和表别名重写查询(以消除列来自何处的歧义):

SELECT P.P_CODE, P.P_DESCRIPT, P.P_PRICE, P.V_CODE, V.V_STATE
FROM PRODUCT P join
     VENDOR V
     on P.V_CODE = V.V_CODE
WHERE V.V_STATE = ‘NY’  AND V.V_AREACODE = ‘212’;
ORDER BY P.P_PRICE;

此查询可能会以两种方式之一执行。 (1) 引擎可能会扫描产品表并对供应商表进行匹配以解决查询(然后应用过滤器和排序)。或者,(2)它可能会扫描供应商表,查找product 表(然后应用过滤器和排序)。还有其他选择,但这些都是可能的。

对于 (1),最佳索引是:vendor(v_code, v_state, v_areacode)product(p_price, v_code, p_code, p_descript)。这些索引中的每一个都“覆盖”了相应的表,这意味着这些索引将用于查询,而无需在原始数据页中进行任何查找。通过将p_price 首先包含在product 索引中,将按排序顺序扫描索引,然后在供应商表中进行查找以获取select 的字段并应用过滤。最后的排序是不必要的,因为product 表已经以正确的顺序被扫描了。

对于 (2),最佳索引是 vendor(v_state, v_areacode, v_code)product(v_code, p_code, p_descxript, p_price)。将扫描vendor 索引,直接在where 子句中应用过滤。然后会在product中查找对应的记录,并对最终结果进行排序。

实际上哪种策略更好取决于where 子句的选择性以及需要排序的数据大小。如果所有四个索引都可用,优化引擎(在大多数数据库中)会使用统计数据来解决这个问题。

【讨论】:

    猜你喜欢
    • 2013-02-20
    • 2023-03-29
    • 2011-06-07
    • 2019-03-26
    • 2018-08-24
    • 2011-03-17
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多