数据库索引?

9 浏览
0 Comments

数据库索引?

这个问题已经有答案了:

数据库索引是如何工作的?[已关闭]

我对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表统计数据的命令?

应该显示一个模型,但是因为这是一个样例考试,所以没有显示!

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

非常感谢您的帮助。

admin 更改状态以发布 2023年5月21日
0
0 Comments

首先,我将使用标准的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)它可能扫描供应商表,查找到产品表(然后应用过滤和排序)。还有其他选项,但这些是可能的。

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

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

哪种策略实际上更好取决于where子句的选择性和需要排序的数据量。如果四个索引都可用,优化引擎(在大多数数据库中)会使用统计信息来计算这一点。

0