2013-04-16 4 views
1

Я получил эту таблицу (EOD):SQL - Снизить запрос времени

| 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,7sec быть выполнена, поэтому я хотел бы сократить время каждого из них. Как я мог обработать? Можно ли выполнить два первых запроса только в одном?

Заранее спасибо за вашу помощь,

Стив

+1

Какие СУБД вы фактически используете? Если это позволяет вам создать индекс, включая подсчитанные числа, такие как 'CASE WHEN CLOSE> OPEN THEN 0 WHEN CLOSE

ответ

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, CLOSE и DATE в этом индексе, а затем в зависимости от того, как часто вы вставляете/обновляете данные, также может быть полезно иметь индексы в столбцах даты.

Как всегда с вопросами, основанными на производительности, вы находитесь в гораздо лучшем положении, чтобы помочь себе, чем нам помочь, вы можете просматривать планы выполнения, статистику IO и запускать различные тесты и т. Д., Чтобы определить, что замедляет ваш запрос, как только вы определили проблему более конкретно, вы можете посмотреть на добавление определенных индексов для решения проблемы.

+0

Спасибо за вашу помощь. Да, это был просто пример :) Я постараюсь добавить индекс, но я новичок в базах данных, поэтому у меня нет всех понятий. – user2269756

-1

Мое первое предложение, чтобы улучшить производительность будет никогда когда-либо пользователь COUNT (*) но использовать один столбец как графа (eod_id) в вашем случае.

+4

Это миф в любой разумной СУБД. –

+0

Я попробовал это, ничего не изменил. Спасибо за помощь – user2269756

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

Спасибо, уменьшите запрос времени на 2. – user2269756

Смежные вопросы