0

데이터베이스에 GUID가 기본 키로 있습니다. 이는 여러 시스템에서 고유성을 적용하기 위해 수행되었습니다.SQL 계산 된 필드 효율성

것은 약간 우호적 내가 계산 필드를 추가 한 테이블을 만들려면 (그래 내가 오버 헤드 다른 옵션이 있지만, 회사의 선택이있는 테이블 당 행 당 16 바이트) 알고, 그래서 당신은 같은 선택을 할 경우

SELECT * FROM Products 

외래 키를 사용하여 열을 가져올뿐만 아니라 이와 관련된 필드도 가져옵니다.

CompanyGUID (저장 필드), 회사 명 (계산 필드) 계산 된 필드와 같은 스칼라 함수를 통해 실행

:

CREATE FUNCTION [mySchema].[udf_CompanyNameFromGUID] (@GUID UNIQUEIDENTIFIER) 
RETURNS NVARCHAR(MAX) 
AS 
    BEGIN 
     DECLARE @Return NVARCHAR(MAX) 
     SELECT @Return = CompanyName 
     FROM mySchema.Companies 
     WHERE CompanyGUID = @GUID 
     RETURN @Return 
    END 

내가 이러한 업이 기본 키에 대해 항상 보이는 것을 지적한다/클러스터 색인은 개별적으로 최대한 빨리 만들 수 있습니다.

이제는 문제를 추적 할 때 많은 이점이 있지만 큰 테이블을 쿼리 할 때 주 사용 효율 (계산 된 필드가 쿼리되지 않으므로 아무런 영향도주지 않음)에 아무런 영향을 미치지 않지만, 조회를 수행하는 동안. 나는 찾고있는 여분의 데이터를 희생하고 싶지 않고 테이블에 직접 저장하고 싶지 않습니다 (데이터 낭비와 유지 관리가 필요합니다). 나는 각 테이블에 대한 뷰를 빌드하는 것을 고려해 왔지만 과장된 것 같아서 노력을 두 배로 늘릴 필요가 없습니다.

저는 이처럼 일하는 사람이 유일한 사람이 아니라고 확신합니다. 누군가이 일을보다 효율적으로 수행 할 수 있는지 알고 싶습니다. 이 필드는 데이터베이스를 직접보고있는 사람들 만 사용하며 모든 저장 프로 시저 등은 모두 인덱싱 된 링크 등으로 모두 코드화되므로 기본 실행 효율성은 디버깅 중일뿐입니다. 큰 문제는 아니지만, 더 좋은 해결책이 있다면 듣고 싶습니다.

미리 감사드립니다.

+1

그래서 개발자가 쉽게 사용할 수 있도록 스칼라 함수를 사용하여 계산 된 열을 테이블에 추가합니까? 그들은 조인을 작성하는 법을 배워야하지 않습니까? 그 조인을 타이핑하는 것이 당신이하려고하는 것보다 적은 노력 일 것입니다. –

+0

솔직하게 다른 사람들만큼 여기에서 데이터를 추적합니다. 더 직관적 인 것이 더 낫습니다. 데이터에 시간을 보내는 모든 사람들 (그리고 한 소녀)은 조인을 작성할 수 있으며, 필요할 때마다 반복해서 반복해야합니다. 차라리 한 번 해보고 다시하지 않아도됩니다. –

+2

또는 조인을 수행하는보기를 작성하십시오. 스. 라 UDF에서 이것을 랩핑하면 성능이 매우 빨리 저하됩니다. 모든 조회가 RBAR 중첩 루프를 사용하고 스칼라 UDF와 관련된 여러 가지 문제점을 갖도록합니다. –

답변

0

내 추천 :

  1. companyGUID를 들어, 생성하고 NEWSEQUENTIALID 대신 NEWID을 사용할 수 있습니다, 그것은 단편화를 줄일 수 있습니다. 색인 성능을 향상시킬 수 있습니다.
  2. PERSISTED 옵션을 추가하여 CompanyName 열을 유지할 수 있습니다.
+0

OP는 시스템에서 고유성을 보장하기 위해 지침을 사용한다고 명시했습니다. sequentialid는 이것을 불가능하게 만듭니다. 사실 uniqueidentifier는 기본 키에 대해서는 끔찍한 것이 아니지만 클러스터 된 인덱스로는 적합하지 않습니다. 당신이 말한대로 분열은 미친 듯이 나아 간다. –

+0

RE : 2 그들은 이것을 지속시킬 수 없습니다. 결정적이지 않습니다. –

+0

성능 향상 효과가있는 열 지속성을 고려했지만 필요한 저장소 크기에도 영향을줍니다. 대규모는 아니지만이 필드는 디버깅 또는 데이터 추적에만 사용됩니다. 나 같은 경로를 따르는 누군가를 만나서 반갑습니다. 옵션을 가져 주셔서 감사합니다. –

2

주된 성능 문제는 조회로 인한 것이 아니며, SCALAR FUNCTION 사용으로 인한 것입니다.

스칼라 함수는 모든 행에 대해 호출되며 자체적으로는 아니지만 성능에 큰 영향을 미치는 행 수에 대해 곱합니다. 당신이보기를 사용하면 확장됩니다 단지 코드의대로 추가 공간이 필요하지 않습니다, 그리고 내부보기 만 mySchema.Companies와 테이블을 가입 : view 수 있음

는 귀하의 경우 솔루션입니다

create view dbo.MyView as 
select * -- put here your columns of interest including CompanyName 
from dbo.YourTable 
    join mySchema.Companies 
     on CompanyGUID = @GUID; 
+0

그래, 전 환경에서 뷰 방식을 사용했지만 여기에 부 풀리지를 추가하지 않으려 고했습니다. 이전에 SSRS보고를 위해 미리 최적화 된 뷰 스키마에 클라이언트가 액세스 할 수 있었기 때문에이 코드를 사용했습니다. 우리가 원했던 마지막 일은 데이터베이스가 얼마나 타당한 지 상관없이 쿼리 작성을 시도하는 클라이언트였습니다. –

+0

죄송합니다. 귀하의 문제를 이해하지 못했습니다. 클라이언트가 테이블을 직접 사용하지 않도록하려면보기에서 선택 권한을 남겨 두는 동안 선택을 거부하십시오. – sepupic

+0

클라이언트는 이미 액세스가 거부되었습니다. 이는 단지 예일뿐입니다. 이는 주로 dba가 데이터 문제를 추적해야하는 경우에만 내부 용도로 사용됩니다. 왜 제품을 볼 수 없는데 왜이 가격을 얻습니까? 내가 자신의 쿼리를 작성하도록 요청하는 공정성이라고 생각하는 동안, 나는 더 나은 대안을 생각해 낼 수 있다면 더 생산적으로 시간을 보냈을 것이다. 대답은 +1하지만 내가 찾고있는 것은 아닙니다. 많은 감사합니다. –