Какой самый быстрый способ сделать запрос из исторической базы данных EAV - PullRequest
1 голос
/ 09 апреля 2009

Стандартная схема EAV: один столбец для идентификатора объекта, один для идентификатора атрибута, один для идентификатора значения.

Историческая схема EAV: добавление дополнительных столбцов для времен / диапазонов дат

Во время выполнения определенные строки будут исключены. Может быть 0, 1 или много строк, возвращаемых на объект для каждого атрибута. Нам нужно только самое последнее значение для каждого оставшегося атрибута.

Наше текущее решение использует функцию Rank () SQL Server, чтобы пометить каждую строку рангом, а затем в предложении where мы имеем «and rank = 1».

Тем не менее, производительность не является удовлетворительным. В ходе анализа мы обнаруживаем, что присвоение рангов происходит довольно быстро, однако выполнение предложения where против ранга требует повторного сканирования данных и сохраняет весь набор данных в ОЗУ.

Какой самый быстрый способ ранжировать оставшиеся строки атрибута и возвращать только последние?

Ответы [ 2 ]

1 голос
/ 20 мая 2009

Хотя я думаю, что ответа gbn, вероятно, достаточно, мне интересно, не будет ли использование предложения OVER для определения максимальной даты для каждого идентификатора / атрибута, с помощью которого сокращается SELECT в предложении WHERE, быстрее, чем RANK? Нет времени для тестирования производительности, но вот запрос:

select * 
from (
  select *, max(dt) over (partition by eID, aID) maxdt 
    from table
) t
where t.dt = t.maxdt and ...

Удачи!

1 голос
/ 09 апреля 2009

Общая идея заключается в том, чтобы сначала извлечь последний ключ +, а затем соединиться назад, чтобы получить значение, которое не является частью совокупности. То, что это EAV, не имеет значения.

SELECT
    *
FROM
    table t
    JOIN
    (SELECT MAX(dt) AS mdt, eID, aID FROM table GROUP BY eID, aID) mt
                     ON t.eID = mt.eID AND t.aID = mt.aID AND t.dt = mt.mdt
WHERE
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...