SQL Server эффективно фильтрует и сортирует таблицу свойств - PullRequest
0 голосов
/ 04 мая 2018

У меня есть сценарий, который нам нужен для фильтрации и сортировки документов, хранящихся в таблице документов, по свойствам документа. Каждый документ может иметь неизвестное количество свойств.

Столбцы таблицы 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 миллионов Какие-либо предложения для приведенного выше псевдокода?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

PropertyName никогда не может иметь значения как «Статус», так и «Утверждено».

TextValue никогда не может иметь значения как ', так и' IT '.

and обрабатывается до or, но ( ) до любого из них, так что вы можете пропустить ( ), но обычно оставьте его для ясности.

SELECT DocumentID 
From Properties 
WHERE (PropertyName ='Status' and TextValue = ' Approved') 
   or (PropertyName ='Dept'   and TextValue = 'IT')
0 голосов
/ 04 мая 2018

Вы должны использовать ИЛИ между вашими сложными условиями, иначе вы никогда ничего не найдете.

Вот пример.

SELECT DocumentID 
From Properties 
WHERE ((PropertyName ='Status' and TextValue = ' Approved') OR   
       (PropertyName ='Dept' and TextValue = 'IT'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...