Взгляните на эту схему псевдо (обратите внимание, что является упрощением, поэтому постарайтесь не комментировать слишком «целесообразность» самой схемы). Предположим, что на ФК установлены индексы.
TABLE Lookup (
Lookup_ID int not null PK
Name nvarchar(255) not null
)
TABLE Document (
Document_ID int not null PK
Previous_ID null FK REFERENCES Document(Document_ID)
)
TABLE Document_Lookup (
Document_ID int not null FK REFERENCES Document(Document_ID)
Lookup_ID int not null FK REFERENCES Lookup(Lookup_ID)
)
Тома: Документ, 4 миллиона строк, из которых 90% имеют нулевое значение поля Previous_ID; Поиск, 6000 строк, Среднее число запросов, прикрепленных к каждому документу 20, что дает Document_Lookup 80 миллионов строк.
Теперь в .NET Service есть структура для представления строки поиска, подобной этой: -
struct Lookup
{
public int ID;
public string Name;
public List<int> DocumentIDs;
}
и строки поиска хранятся в Dictionary<int, Lookup>
, где ключом является идентификатор поиска. Важным моментом здесь является то, что в этом словаре должны содержаться записи, на которые на поиск ссылается хотя бы один документ, то есть список DocumentIDs
должен иметь число> 0.
Моя задача - эффективно заполнить этот словарь. Таким образом, простой подход будет: -
SELECT dl.Lookup_ID, l.Name, dl.Document_ID
FROM Document_Lookup dl
INNER JOIN Lookup l ON l.Lookup_ID = dl.Lookup_ID
INNER JOIN Document d ON d.Document_ID = dl.Lookup_ID
WHERE d.Previous_ID IS NULL
ORDER BY dl.Lookup_ID, dl.Document_ID
Это может быть использовано для достаточно эффективного заполнения словаря.
Вопрос : Производит ли базовая доставка набора строк (TDS?) Некоторую оптимизацию? Мне кажется, что запросы, которые нормализуют данные, очень распространены, поэтому вероятность того, что значения полей не меняются от одной строки к другой, высока, поэтому было бы целесообразно оптомизировать поток, не посылая значения полей, которые не т изменилось. Кто-нибудь знает, имеет ли место такая оптомизация? (Оптимизация, по-видимому, не существует).
Какой более сложный запрос я мог бы использовать для устранения дублирования (я думаю, в частности, для повторения значения имени)? Я слышал о такой вещи, как «вложенный набор строк», можно ли создать такую вещь? Будет ли это более производительным? Как бы я получить доступ к нему в .NET?
Я бы выполнил два запроса; один для заполнения словаря поиска, а второй для заполнения списков. Затем я добавил бы код, чтобы выбить неиспользуемый поиск. Однако представьте, что мои прогнозы были неверными, и в конечном итоге «Уточняющий запрос» составил 1 миллион строк, а на какой-либо документ ссылалась только четверть?