У меня есть хранилище данных, где многие значения хранятся в виде закодированных значений.Кодированные столбцы хранят числовое значение, которое относится к строке в таблице CODE_VALUE.Строка в таблице CODE_VALUE содержит описательную информацию для кода.Например, таблица ADDRESS имеет столбец Address_TYPE_CD. Типом адреса может быть домашний / офисный / почтовый адрес и т. Д.Результатом выбора этих столбцов будет список чисел 121234.0 / 2323234.0 / 2321344.0.Поэтому нам нужно запросить таблицу code_value, чтобы получить их описания.
Мы создали функцию, которая обращается к таблице code_value и получает описание для этих кодов.Но когда я использую функцию для изменения кодов в их описании, для запроса, который в противном случае занимает несколько секунд, уходит почти 15 минут.Поэтому я думал о постоянной загрузке таблицы в Cache.Любые предложения, как это можно решить ??
Решение, используемое другой системой, описано ниже
Я использовал Cerner для запроса к базе данных, которая использует процедуры доступа пользователя для преобразования этих code_values и очень быстрая.Обычно они написаны на C ++.Процедура использует глобальный кэш кода для поиска отображаемого значения для code_value, которое передается ей.Это UAR никогда не поражает Oracle напрямую.Кэш кода извлекает значения из таблицы Code_Value и загружает их в память.Таким образом, система кеширования кода обращается к Oracle и выполняет замену памяти для кэширования значений кода, но UAR обращается к этим кэшированным данным вместо того, чтобы запрашивать таблицу Code_Value.
ПРИМЕР:
Таблица персоны
person_id(PK)
person_type_cd
birth_dt_cd
deceased_cd
race_cd
name
Таблица посещений
visit_id(PK)
person_id(FK)
visit_type_cd
hospital_cd
visit_dt_tm
disch_dt_tm
reason_visit_cd
адрес code_value
address_id(PK)
person_id(FK)
address_type_cd
street
suburb_cd
state_cd
country_cd
таблица code_value
code_value
code_set
description
DATA: таблица code_value
code_value code_set description
visit_type :
121212 12 admitted
122233 12 emergency
121233 12 outpatient
address_type :
1234434 233 home
23234 233 office
343434 233 postal
ALTER function [dbo].[getDescByCv](@cv int)
returns varchar(80)
as begin
-- Returns the code value display
declare @ret varchar(80)
select @ret = cv.DESCRIPTION
from CODE_VALUE cv
where cv.code_value = @cv
and cv.active_ind = 1
return isnull(@ret, 0)
end;
Окончательный запрос:
SELECT
v.PERSON_ID as PersonID
, v.ENCNTR_ID as EncntrID
, [EMR_DWH].dbo.[getDispByCv](v.hospital_cd) as Hospital
, [EMR_DWH].dbo.[getDispByCv](v.visit_type_cd) as VisitType
from visit v
SELECT
v.PERSON_ID as PersonID
, v.ENCNTR_ID as EncntrID
, [EMR_DWH].dbo.[getDispByCv](v.hospital_cd) as Hospital
, [EMR_DWH].dbo.[getDispByCv](v.visit_type_cd) as VisitType
, [EMR_DWH].dbo.[getDispByCv](n.person_type) as PersonType
, [EMR_DWH].dbo.[getDispByCv](v.deceased_cd) as Deceased
, [EMR_DWH].dbo.[getDispByCv](v.address_type_cd) as AddressType
, [EMR_DWH].dbo.[getDispByCv](v.country_cd) as Country
from visit v
,person p
,address a
where v.visit_id = 102288.0
and v.person_id = p.person_id
and p.person_id = a.person_id