2009-04-09 2 views
1

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

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

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

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

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

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

+0

Следуйте этим инструкциям, чтобы публиковать дополнительную информацию о вашем медленном запросе: http://www.brentozar.com/archive/2009/03/getting-help-with-a-slow-query/ –

ответ

1

Общая идея состоит в том, чтобы сначала извлечь последний + ключ, а затем присоединиться к нему, чтобы получить значение, которое не является частью совокупности. Дело в том, что это 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 
    ... 
1

Хотя я думаю, что ответ ГБН является, вероятно, достаточно, я задаюсь вопросом, является ли использование оговорки OVER установить дату MAX на каждый идентификатор/атрибута, с которым, чтобы уменьшить ВЫБРАТЬ в ИНЕКЕ не будет быстрее чем RANK? Нет времени для проверки производительности, но вот запрос:

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

Удачи!

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