Кто-нибудь реализовал очень большую EAV или открытую базу данных схемы в SQL Server? Мне интересно, есть ли проблемы с производительностью и как вы смогли преодолеть эти препятствия.Производительность больших систем EAV/открытых схем на SQL Server
ответ
Я не эксперт по EAV, а несколько более опытных разработчиков, чем я заметил, что инфраструктура электронной коммерции с открытым исходным кодом Magento медленна в первую очередь из-за архитектуры EAV через MySQL. Наиболее очевидный недостаток трудно преодолеть. Это трудность, с которой приходится устранять неполадки, где и как представлена информация для сущностей и значений атрибутов по мере увеличения размера приложения. Второй аргумент против EAV, который я слышал, заключается в том, что он требует объединения таблиц, которые попадают в низкие двузначные числа, но было прокомментировано, что использование InnoDB поверх MyISAM улучшило производительность (или это может быть наоборот, но я не могу полностью запомнить).
Независимо от MS SQL Server по сравнению с любой другой базой данных, наихудшая проблема с производительностью EAV заключается в том, что люди пытаются выполнять запросы монстров для восстановления объекта в одной строке. Для этого требуется отдельное соединение для каждого атрибута.
SELECT e.id, a1.attr_value as "cost", a2.attr_value as "color",
a3.attr_value as "size", . . .
FROM entity e
LEFT OUTER JOIN attrib a1 ON (e.entity_id = a1.entity_id AND a1.attr_name = 'cost')
LEFT OUTER JOIN attrib a2 ON (e.entity_id = a2.entity_id AND a2.attr_name = 'color')
LEFT OUTER JOIN attrib a2 ON (e.entity_id = a3.entity_id AND a3.attr_name = 'size')
. . . additional joins for each attribute . . .
Независимо от того, какую марку базы данных вы используете, больше объединений в запросе означает геометрически увеличивающуюся стоимость работы. Неизбежно, вам нужно достаточно атрибутов, чтобы превысить архитектурные возможности любого механизма SQL.
Решение состоит в том, чтобы извлекать атрибуты в строках вместо столбцов и записывать класс в код приложения для циклизации по этим строкам, присваивая значения свойствам объекта по одному.
SELECT e.id, a.attr_name, a.attr_value
FROM entity e JOIN attrib a USING (entity_id)
ORDER BY e.id;
Этот SQL-запрос настолько прост и эффективен, что он учитывает дополнительный код приложения.
Что бы я искал в структуре EAV, это некоторый код шаблона, который извлекает многострочный результат, подобный этому, и сопоставляет атрибуты в свойствах объекта, а затем возвращает коллекцию заполненных объектов.
- 1. Оптимизация больших таблиц SQL Server
- 2. Изменение коллекции схем SQL Server
- 3. Использование для схем SQL Server
- 4. SQL Server - производительность запросов больших таблиц с GROUP BY
- 5. Производительность SQL Server
- 6. Производительность SQL Server FILESTREAM
- 7. Неверная производительность SQL Server
- 8. SQL Server: производительность курсора
- 9. Дилемма SQL Server, производительность
- 10. Производительность индекса SQL Server
- 11. Производительность datetime SQL Server
- 12. Производительность в SQL Server
- 13. Производительность SQL Server JOIN
- 14. Производительность обновления SQL (Server)
- 15. Является ли агент SQL Server влиять на производительность SQL Server?
- 16. SQL Server Использование TableDiff на больших таблицах
- 17. SQL Server: изменения или модификации сглаживающих схем
- 18. A * Производительность на больших картах
- 19. Производительность SQLite на больших таблицах
- 20. Производительность JaxB на больших документах
- 21. SQL производительность запросов для больших объемов данных
- 22. Соглашения об именах схем SQL Server 2008
- 23. Использование схем в SQL Server 2008/2012
- 24. Таблица фильтров SQL Server Несколько схем
- 25. SQL Server: экспорт нескольких схем баз данных
- 26. Инструмент сравнения схем SQL Server CE
- 27. Воздействие больших нулевых столбцов в SQL Server
- 28. Производительность SQL Server CE на устройстве
- 29. Производительность XQuery в SQL Server
- 30. Производительность charindex SQL Server 2005