LINUX.ORG.RU

Сообщения codenewb

 

Оптимизация запроса

Форум — Development

Пишу запрос, постепенно его усложняя. На каждом шаге время выполнения увеличивается. Рост ожидаем, проблема в том, что он очень высок - на порядок. То есть, на втором шаге - 0.3с, на третьем - уже 3с (по данным профайлера).

Помогите понять, почему так быстро растет время запроса.

По существу. Есть две связанных таблицы, в первой - список уникальных наборов данных, во второй - сами данные в виде ключ->значение, каждая пара привязана к набору:

CREATE TABLE dataset
  set_id INT PRIMARY KEY,
  label TEXT;

CREATE TABLE keyvalue
  id INT PRIMARY KEY,
  set_id INT,
  key varchar(10),
  val int;

CREATE INDEX index_k_v ON keyval (set_id, key, val);

Запрос:

SELECT t.set_id as id, t1.val as key1, t2.val as key2, t3.val as key3  FROM dataset t
  JOIN keyvalue t1 ON t1.key='key1' and t.set_id=t1.set_id
  JOIN keyvalue t2 ON t2.key='key2' and t.set_id=t2.set_id -- 0.3s
  JOIN keyvalue t3 ON t3.key='key3' and t.set_id=t3.set_id -- 3.0s

Ясно, что добавляется еще один проход, непонятно, почему он требует времени на порядок больше.

Профайлер говорил, что время занимало sending data (98%), поэтому, чтобы снять вопрос объема данных, в тестовой схеме поле val имеет тип INT, хотя картина осталась прежней. Замеры времени приведены для этой схемы.

 

codenewb
()

RSS подписка на новые темы