SQL Server Как правильно создать представление для зависимых таблиц? - PullRequest
0 голосов
/ 15 мая 2019

Учитывая следующие таблицы (см. Ниже), мне нужно создать представление, которое показывает каждый код (SOC, HLGT, HLT, PT AND LLT) из таблицы MedDRARelations и его соответствующее значение (Soc_Value, HLGT_value, HLT_Value, PT_Value иLLT_Value) из таблицы MedDRANames.

Я пытался несколько раз объединить таблицу MedDRANames и создать скалярную функцию, которая возвращает значение с учетом кода (ключа).

Таблицаопределения:

CREATE TABLE dbo.MedDRANames 
(
    [Key]   INT NOT NULL,
    [Value] VARCHAR(100) NULL,
    CONSTRAINT [PK_MedDRANames] PRIMARY KEY CLUSTERED ([Key])
);

CREATE TABLE dbo.MedDRARelations 
(
    [SOC]  INT NOT NULL,
    [HLGT] INT NOT NULL,
    [HLT]  INT NOT NULL,
    [PT]   INT NOT NULL,
    [LLT]  INT NOT NULL,    
    CONSTRAINT [PK_MedDRARelations] 
        PRIMARY KEY CLUSTERED ([SOC] ASC, [HLGT] ASC, [HLT] ASC, [PT] ASC, [LLT] ASC),
    CONSTRAINT [FK_MedDRANameSOC] 
        FOREIGN KEY ([SOC]) REFERENCES dbo.MedDRANAmes([Key]),
    CONSTRAINT [FK_MedDRANameHLGT] 
        FOREIGN KEY ([HLGT]) REFERENCES dbo.MedDRANAmes([Key]),
    CONSTRAINT [FK_MedDRANameHLT] 
        FOREIGN KEY ([HLT]) REFERENCES dbo.MedDRANAmes([Key]),
    CONSTRAINT [FK_MedDRANamePT] 
        FOREIGN KEY ([PT]) REFERENCES dbo.MedDRANAmes([Key]),
    CONSTRAINT [FK_MedDRANameLLT] 
        FOREIGN KEY ([LLT]) REFERENCES dbo.MedDRANAmes([Key])
);

Просмотры:

Это представление выполняется за 22,1 с (SD 1.25) и влияет на 156867 строк

SELECT 
    [X].[SOC] AS [Código SOC],
    [SOC].[Value] AS [Término SOC],
    [X].[HLGT] AS [Código HLGT],
    [HLGT].[Value] AS [Término HLGT],
    [X].[HLT] AS [Código HLT],
    [HLT].[Value] AS [Término HLT],
    [X].[PT] AS [Código PT],
    [PT].[Value] AS [Término PT],
    [X].[LLT] AS [Código LLT],
    [LLT].[Value] AS [Término LLT]
FROM 
    dbo.MedDRARelations AS [X]
INNER JOIN 
    dbo.MedDRANames AS [SOC] ON [X].[SOC] = [SOC].[Key]
INNER JOIN 
    dbo.MedDRANames AS [HLGT] ON [X].[HLGT] = [HLGT].[Key]
INNER JOIN 
    dbo.MedDRANames AS [HLT] ON [X].[HLT] = [HLT].[Key]
INNER JOIN 
    dbo.MedDRANames AS [PT] ON [X].[PT] = [PT].[Key]
INNER JOIN 
    dbo.MedDRANames AS [LLT] ON [X].[LLT] = [LLT].[Key]

Это представление выполняется за 35,3 с (SD2.1) и влияет на 156867 строк

SELECT 
    [X].[SOC] AS [Código SOC],
    dbo.FindMedDRA(x.SOC) AS [Término SOC],
    [X].[HLGT] AS [Código HLGT],
    dbo.FindMedDRA(x.HLGT) AS [Término HLGT],
    [X].[HLT] AS [Código HLT],
    dbo.FindMedDRA(x.HLT) AS [Término HLT],
    [X].[PT] AS [Código PT],
    dbo.FindMedDRA(x.PT) AS [Término PT],
    [X].[LLT] AS [Código LLT],
    dbo.FindMedDRA(x.LLT) AS [Término LLT]
FROM 
    dbo.MedDRARelations AS [X]

Скалярные функции:

CREATE FUNCTION [dbo].[FindMedDRA]
    (@code INT)
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @returning VARCHAR(100)

    SELECT @returning = dbo.MedDRANames.Value 
    FROM dbo.MedDRANames 
    WHERE dbo.MedDRANames.[Key] = @code

    RETURN @returning
END

Я хотел бы знать, как правильно добиться этого, потому что создание объединенной таблицы занимает 12,2 с (SD0.1), но стоит в 5 раз больше оригинального пространства.

Заранее спасибо.

ОБНОВЛЕНИЕ: планы выполнения

  1. Использование функции: https://www.brentozar.com/pastetheplan/?id=rkso0aKnV
  2. До создания Ixs: https://www.brentozar.com/pastetheplan/?id=HkFlyRth4
  3. После создания Ixs (как предложил Смеющийся Вергилий): https://www.brentozar.com/pastetheplan/?id=B13ZW0t3V

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Самая большая проблема заключается в том, что в значениях в MedRARelations нет индекса. ПРИМЕЧАНИЕ. Распространенным заблуждением является то, что при создании внешнего ключа создается индекс. Это не так.

Итак, попробуйте запустить это:

CREATE INDEX Idx_MedDRARelations_SOC ON MedDRARelations (SOC);
CREATE INDEX Idx_MedDRARelations_HGLT ON MedDRARelations (HGLT);
CREATE INDEX Idx_MedDRARelations_HLT ON MedDRARelations (HLT);
CREATE INDEX Idx_MedDRARelations_PT ON MedDRARelations (PT);
CREATE INDEX Idx_MedDRARelations_LLT ON MedDRARelations (LLT);

Затем попробуйте снова посмотреть и другие методы.

0 голосов
/ 15 мая 2019

Первый способ правильный.INNER JOIN s для единственного целочисленного первичного ключа столбца очень быстро, обычно выполняется с помощью оператора MERGE JOIN.Конечно, быстрее, чем создание функции, как хорошо показывают ваши результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...