首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库索引?

数据库索引?
EN

Stack Overflow用户
提问于 2014-02-10 04:54:53
回答 1查看 615关注 0票数 1

我有一个关于DBMS中的索引的问题。我知道它们通过更快地定位数据来提高性能。但我的问题是,我想要为某个数据库使用哪种类型的索引?

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

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

SaleCo ER模型

代码语言:javascript
复制
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;

对于这个查询,我推荐使用-What索引吗?为什么?

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

-How用于编写用于生成产品表和供应商表的统计信息的命令。

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

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

非常感谢你提前

EN

回答 1

Stack Overflow用户

发布于 2014-02-10 05:43:27

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

代码语言:javascript
复制
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)。这些索引中的每一个都“覆盖”各自的表,这意味着索引将用于查询,而不需要在原始数据页中进行任何查找。通过在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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21664916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档