我有这张桌子(eod):
| eod_id | company_symbol | date | open | close | high | low |
| 1 | AAA | 01-01-2000 | 40.00 | 42.00 | 43.00 | 39.00 |
我使用这3个请求:
1. SELECT COUNT(*) FROM eod WHERE company_symbol="AAA" AND CLOSE>OPEN
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
2. SELECT COUNT(*) FROM eod WHERE company_symbol="AAA" AND CLOSE<OPEN
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
3. SELECT min(date), max(date) FROM eod WHERE company_symbol="AAA"
每个请求大约需要执行0,7秒,因此我希望减少每个请求的时间。我怎么处理?是否可以只在一个中执行两个第一个请求?
先谢谢你的帮助,
史蒂夫
答案 0 :(得分:1)
结合前两个:
SELECT
SUM(CASE WHEN CLOSE>OPEN THEN 1 ELSE 0 END) as Higher,
SUM(CASE WHEN CLOSE<OPEN THEN 1 ELSE 0 END) as Lower
FROM eod WHERE company_symbol="AAA"
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
答案 1 :(得分:0)
您怀疑可以合并前两个查询:
SELECT COUNT(CASE WHEN CLOSE < OPEN THEN 1 END),
COUNT(CASE WHEN CLOSE > OPEN THEN 1 END)
FROM eod
WHERE company_symbol="AAA"
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
(我假设您DATE BETWEEN
子句只是一个示例,但如果不是,则可以更改为DATE = "0000-00-00"
)
我要说如果你的dbms支持非关键列,那么在company_symbol上有一个非聚簇索引,那么在这个索引中包含OPEN
,CLOSE
和DATE
,那么取决于如何经常你插入/更新数据也可能值得在你的日期列上有索引。
与往常基于性能的问题一样,您可以更好地帮助自己,而不是帮助您,您可以查看执行计划,IO统计信息以及运行各种测试等,以确定减慢查询的速度,一次您已经更具体地确定了问题,然后可以查看添加特定索引来解决问题。
答案 2 :(得分:-1)
我提高性能的第一个建议是永远不会使用 count(*),而是在您的情况下使用 count(eod_id)这样的单个列。