У меня есть сценарий, который нам нужен для фильтрации и сортировки документов, хранящихся в таблице документов, по свойствам документа. Каждый документ может иметь неизвестное количество свойств.
Столбцы таблицы Documents выглядят примерно так:
ID, Name, Modified, ...
и таблица свойств:
DocumentID, PropertyName, TextValue, DateValue
Все столбцы в таблице свойств проиндексированы для быстрого поиска.
Первой попыткой было написать запрос, который выглядит следующим образом:
SELECT DocumentID
From Properties
WHERE (PropertyName ='Status' and TextValue = ' Approved')
Это работало нормально для сценария простого фильтра. Для сценария, который возвращает
SELECT DocumentID
From Properties
WHERE ((PropertyName ='Status' and TextValue = ' Approved') and
(PropertyName ='Dept' and TextValue = 'IT'))
Если есть еще условия фильтра, ничего не возвращается.
После некоторых исследований я попробовал несколько вариантов:
- Использование PIVOT для преобразования строк в столбцы с динамическим sql. Очень медленно и до сих пор не работает. Документы могут иметь уникальные свойства
- Использование Dynamic с левым соединением
- Использование подзапросов
Я следовал за предоставленным ответом Эффективно преобразовать строки в столбцы на сервере sql .
С mongodb это было бы намного проще, но нам нужно добиться такой же гибкости и скорости с SQL Server.
SQL PIVOT слишком медленный для этого сценария. Любое предложение о том, как это можно сделать быстро?
Обновление: после прочтения некоторых предложений и комментариев я подправил предложения к следующему:
SELECT DocumentID FROM Properties
WHERE DocumentID in
( SELECT DocumentID FROM Properties WHERE Name = 'Status' and TextValue = 'Approved')
and | or DocumentID in( SELECT DocumentID FROM Properties WHERE Name = 'Dept' and TextValue = 'IT')
Следующим шагом является тестирование производительности для больших наборов данных> 5 миллионов
Какие-либо предложения для приведенного выше псевдокода?