У нас есть три таблицы, в которых хранятся данные документа, которые я буду называть таблицами A, B и C. В таблице A хранятся основные поля для указанных документов (такие как имя файла и размер и другая общая информация). Чтобы динамически добавлять новые поля, мы используем таблицу B для хранения списка новых полей и их типов данных (определяемых перечислением) и таблицы C для хранения значений для этих полей.Наиболее эффективный способ объединения полей в динамическую структуру таблиц
Table A
ID - PK int
FieldX...
FieldY...
FieldZ...
Table B
Id - PK int
Name - nvarchar(max)
Type - int
Table C
Id - PK int
AId - FK to table A int
BId - FK to table B int
Value - nvarchar(max)
Что мы хотим сделать как можно более эффективно, чтобы вытащить значения из таблицы С в качестве дополнительного столбца в запросе из таблицы А. Сейчас здесь, как я делаю это для каждого дополнительного поля Таблица B.
select (select c.value
from B b, C c
where c.AId = a.Id
and c.Bid = b.Id
and b.Name = 'Dynamic Field Name') As 'Dynamic Field Name'
From A a
У нас есть база данных с таблицей А, заполненная 36000 строк. Для каждого дополнительного динамического поля, которое добавляется к запросу, его добавление около 4 секунд к общему времени для завершения запроса, делая запрос, содержащий 10 динамических полей, занимает не менее 40 секунд. Реально, мы хотим, чтобы любой запрос заканчивался в возрасте до 10. Есть ли способ написать это более эффективно?
Как передать имена динамических полей 'b.Name'? Через список с разделителями-запятыми, жестко закодированный или много аргументов sp? – cctan