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"

1リクエストあたり約0.7秒かかるので、1リクエストあたりの時間を短縮したい。どうすれば処理できますか? 最初の 2 つの要求を 1 つのみで行うことは可能ですか?

よろしくお願いいたします。

スティーブ

4

3 に答える 3

1

最初の 2 つを組み合わせる:

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

ご想像のとおり、最初の 2 つのクエリを組み合わせることができます。

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";

( youDATE BETWEEN句は単なる例だと思いますが、そうでない場合は に変更できますDATE = "0000-00-00")

company_symbol の非クラスター化インデックスは必須です。dbms が非キー列をサポートしている場合はOPEN、このインデックスにCLOSEを含めDATEます。データを挿入/更新する頻度によっては、日付列にもインデックスを作成する価値があるかもしれません.

いつものように、パフォーマンス ベースの質問では、私たちが手助けするよりも、自分自身を助ける方がはるかに有利な立場にあります。特定したら、実行計画、IO 統計を表示し、さまざまなテストを実行して、クエリの速度を低下させている原因を特定できます。より具体的には、問題を解決するために特定のインデックスを追加することを検討できます。

于 2013-04-16T08:42:36.893 に答える
-1

パフォーマンスを改善するための私の最初の提案は、決して user count(*) ではなく、 count(eod_id)のような単一の列を使用することです。

于 2013-04-16T08:30:27.627 に答える