【发布时间】: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
-
为每个表创建索引最有效的方法是什么?
-CUST:COUNTRY_CD + CUST_ID
-DIST : CUST_CD + DIST_NM
-ORDS : CUST_ID + ORDER_CD
-CUST_INFO:INFO + CUST_ID
---> 我认为上面的索引是最有效的索引。但我还有什么需要考虑的吗?
- 根据上面的索引,执行计划是什么样的? (加入订单?方式?子查询角色?,如果结果相同可以更改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