1

我有这张桌子(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 秒才能执行,所以我想减少每个请求的时间。我该如何处理?是否可以只在一个中完成两个第一个请求?

在此先感谢您的帮助,

史蒂夫

4

3 回答 3

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";
于 2013-04-16T08:41:34.863 回答
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"

我想说 company_symbol 上的非聚集索引是必须的,如果您的 dbms 支持非键列,则包含OPEN,CLOSEDATE在此索引中,然后根据您插入/更新数据的频率,也可能值得在您的日期列上建立索引.

与基于性能的问题一样,您可以比我们帮助您更好地帮助自己,您可以查看执行计划、IO 统计数据并运行各种测试等,以确定是什么导致您的查询变慢,一旦您确定更具体地说,您可以查看添加特定索引来解决问题。

于 2013-04-16T08:42:36.893 回答
-1

我提高性能的第一个建议是永远不要使用用户计数(*),而是在您的情况下使用像count(eod_id)这样的单个列。

于 2013-04-16T08:30:27.627 回答