SELECT с подзапросом занимает около 1 мин в sqlite и <1 с в SQL Server - PullRequest
2 голосов
/ 22 февраля 2010

Я уже просмотрел много сообщений об этой проблеме (подзапросы очень медленные в sqlite). но я не очень хорош в SQL, и я не знаю, что я могу сделать.

У меня есть этот запрос:

SELECT * FROM data d WHERE d.category = 3 AND 
(SELECT COUNT(id) FROM data_tag WHERE data = d.id AND (tag = 2136 OR tag = 8)) >= 2 
ORDER BY id ASC

у меня 3 стола data, tag и data_tag (n-m данных и тега) Каждые данные имеют n тегов, и в этом запросе я ищу данные по тегам (2 тега, оба должны быть в данных)

я переключил свою базу данных с SQL Server на sqlite, и кроме этого запроса все работает отлично. в SQL Server выполнение этого заняло менее 1 секунды, а в sqlite - около 1 минуты. дайте мне несколько советов.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010
SELECT d.* FROM data d
INNER JOIN data_tag ON data_tag.data = d.id AND (tag = 2136 OR tag = 8)
WHERE d.category = 3 
GROUP BY d.id
HAVING COUNT(data_tag.id) >= 2 
ORDER BY id ASC
1 голос
/ 22 февраля 2010

Попробуйте:

  SELECT d.* 
    FROM DATA d 
    JOIN (SELECT dt.data,
                 COUNT(id) AS num_tags
            FROM DATA_TAG dt
           WHERE dt.tag IN (2136, 8)
        GROUP BY dt.data
          HAVING COUNT(id) >= 2) x ON x.data = d.id
ORDER BY d.id 

Не нужно ASC в ORDER BY - это значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...