Опитвам се да оптимизирам SQL заявка. Проблемът е, че е много бавен! Работя с sqlite и със средно големи набори от данни (20000 реда). Моят sql синтаксис изглежда така:
SELECT DISTINCT date(A.last_update) as lastUpdate,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = 1) AS valid,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = 0) AS invalid,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = -1) AS notFound
FROM (SELECT DISTINCT last_update FROM bgp_update ORDER BY last_update) AS A WHERE last_update BETWEEN '%var' and '%var2';
По-долу е даден пример за това, което имам:
id | last_update | Validity
48 | 2009-1-6 18:34:38 | notFound
47 | 2009-1-6 18:34:38 | valid
46 | 2009-1-6 18:34:38 | valid
45 | 2009-1-3 18:34:38 | invalid
44 | 2009-1-3 18:34:38 | invalid
42 | 2009-1-4 18:34:38 | notFound
41 | 2009-1-4 18:34:38 | notFound
48 | 2009-1-4 18:34:38 | valid
И резултатът от заявката ще изглежда така:
Date | valid | invalid | notFound
2009-1-3 | 0 | 2 | 0
2009-1-4 | 1 | 0 | 2
2009-1-6 | 2 | 0 | 1
Имам нужда от това, за да генерирам линейна графика от него. Примерът би бил: линейна диаграма!
Но както споменах, заявката е много бавна! Как мога да го направя по-бързо?
:::: 2. РЕДАКТИРАНЕ :::::
Предишните описания опростих проблема. Изявлението ми за създаване на таблица изглежда така:
CREATE TABLE bgp_update
(id INTEGER PRIMARY KEY,
ip VARCHAR(64) NOT NULL,
mask INTEGER NOT NULL,
asn INTEGER NOT NULL,
validity INTEGER NOT NULL,
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
Както можете да видите, моята заявка използва само last_update и полетата за валидност.
EXPLAIN
, поставете резултатите и във въпроса. - person Andy Lester   schedule 27.01.2013date('2009-1-6 18:34:38')
ще бъдеNULL
, защото месецът и денят не са подплатени с нула. Вашите примерни данни наистина ли са правилни? - person CL.   schedule 27.01.2013