【问题标题】:What is the most effective way of creating indexes under certain situation在某些情况下创建索引的最有效方法是什么
【发布时间】:2017-12-05 22:30:56
【问题描述】:

好的,这是我的条件和问题。假设这是我们用于表/索引的唯一 SQL

SELECT B.DIST_NM
, COUNT(+)
  FROM CUST A, DIST B
 WHERE A.COUNTRY_CD = 'USA'
   AND A.CUST_CD = B.CUST_CD
   AND A.CUST_ID IN (SELECT CUST_ID FROM ORDS WHERE ORDER_CD = '20')
   AND A.CUST_ID IN (SELECT CUST_ID FROM CUST_INFO WHERE INFO = 'N')
 GROUP BY B.DIST_NM

 ........................................

SELECT COUNT(*) FROM CUST WHERE A.COUNTRY_CD = 'USA' -> about half million rows
SELECT CUST_ID FROM ORDS WHERE ORDER_CD = '20' -> about 1.5 million rows
SELECT CUST_ID FROM CUST_INFO WHERE INFO = 'N' -> about 50 rows
  1. 为每个表创建索引最有效的方法是什么?

    -CUST:COUNTRY_CD + CUST_ID

    -DIST : CUST_CD + DIST_NM

    -ORDS : CUST_ID + ORDER_CD

    -CUST_INFO:INFO + CUST_ID

---> 我认为上面的索引是最有效的索引。但我还有什么需要考虑的吗?

  1. 根据上面的索引,执行计划是什么样的? (加入订单?方式?子查询角色?,如果结果相同可以更改sql)

你能给我解释一下吗... 我想从 1. SELECT CUST_ID FROM CUST_INFO WHERE INFO 第一次应该执行的行数最少, 2. 然后加入 CUST 表, 3. 然后用 SELECT CUST_ID FROM ORDS WHERE ORDER_CD = '20' 子查询输出过滤, 4. 然后加入 DIST 表,然后执行 group by ...

我在正确的轨道上吗?谁能给我一个建议??

【问题讨论】:

  • 无论您在优化工作中编写的各种查询的文本(以及相关索引)如何,我都建议您跟踪每次尝试以确定哪个具有最佳执行统计信息。您可能会学到一些有用的东西,可以与其他人分享。
  • 这种连接语法在 19 世纪 90 年代初期变得多余。请不要使用它。并且别名应该与它们所代表的表有助记符连接(例如,c 代表 cust,d 代表 dist,ci 代表 cust_info,...)。
  • COUNT(+)?威士忌探戈狐步舞?

标签: sql database oracle indexing sql-tuning


【解决方案1】:

我会将查询写成:

SELECT d.DIST_NM, COUNT(*)
FROM CUST c JOIN
     DIST d
     ON c.CUST_CD = d.CUST_CD
WHERE c.COUNTRY_CD = 'USA' AND
      c.CUST_ID IN (SELECT o.CUST_ID FROM ORDS o WHERE o.ORDER_CD = '20')
      c.CUST_ID IN (SELECT ci.CUST_ID FROM CUST_INFO ci WHERE ci.INFO = 'N')
GROUP BY d.DIST_NM;

我会推荐以下索引:CUST(COUNTRY_CD, CUST_ID, CUST_CD)DIST(CUST_CD, DIST_NM)ORDS(ORDER_CD, CUST_ID)CUST_INFO(INFO, CUST_ID)

注意索引中键的顺序。

【讨论】:

    【解决方案2】:

    让我们考虑一下 DBMS 如何处理任务:

    1. 阅读ORDS:index idx1 on ords (order_cd, cust_id)
    2. 阅读CUST_INFO:index idx2 on cust_info (info, cust_id)
    3. 阅读CUSTindex idx3 on cust (country_cd, cust_id, cust_cd)index idx4 on cust (cust_id, country_cd, cust_cd)
    4. 加入DIST:index idx5 on dist (cust_cd, dist_nm)

    或许是这样:

    1. 阅读CUSTindex idx3 on cust (country_cd, cust_id, cust_cd)index idx6 on cust (country_cd, cust_cd, cust_id)
    2. 查找ORDSindex idx7 on cust (cust_id, order_cd)
    3. 查找CUST_INFOindex idx8 on cust_info (cust_id, info)
    4. 加入DIST:index idx5 on dist (cust_cd, dist_nm)

    这使得 8 个索引可能会被使用,也可能不会被使用。创建它们,使用EXPLAIN PLAN 查看使用了哪些,然后删除其他的:-)

    【讨论】:

      猜你喜欢
      • 2020-02-22
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多