Кэширование таблицы в базе данных сервера SQL - PullRequest
0 голосов
/ 12 октября 2018

У меня есть хранилище данных, где многие значения хранятся в виде закодированных значений.Кодированные столбцы хранят числовое значение, которое относится к строке в таблице 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...