【发布时间】:2013-09-05 15:54:35
【问题描述】:
我有一个类似的查询,我需要查找特定客户在某个时间范围内的交易数量:
select customer_id, count(transactions)
from transactions
where customer_id = 'FKJ90838485'
and purchase_date between '01-JAN-13' and '31-AUG-13'
group by customer_id
表 transactions 不是在 customer_id 上建立索引,而是在另一个名为 transaction_id 的字段上建立索引。 Customer_ID 是字符类型,而 transaction_id 是数字类型。
“accounting_month”字段也被索引。该字段仅存储交易发生的月份...即,purchase_date = '03-MAR-13' 将具有 accounting_month = '01-MAR-13'
事务表在“01-JAN-13”和“31-AUG-13”的时间范围内有大约 2000 万条记录
当我运行上述查询时,花了 40 多分钟才回来,有什么想法或提示吗?
【问题讨论】:
-
能否添加覆盖索引?
-
这个查询 - 按原样 - 会出错。如果您想要真正的答案,请添加实际查询。虽然我会说任何答案都会涉及添加索引 - 这是你做不到的。
-
要添加的最佳索引可能是 (customer_id, purchase_date) 上的复合索引。但正如 ypercube 所说,您的查询给出了错误...您有一个聚合函数,但没有“分组依据”子句...为什么是“计数(交易)”而不是“计数(*)”?是否还有“交易”列?
-
联系数据库管理员。请求他在 CustomerId 上添加一个索引。
-
请不要依赖隐式数据类型转换。
'01-JAN-13'是字符串文字而不是日期。如果从具有不同 NLS 设置的计算机运行,这将失败。
标签: sql performance oracle