0

データベースにはGUIDが主キーとして格納されていますが、これは複数のシステム間で一意性を強制するためです。あなたはSQL計算フィールド効率

​​

のような選択を行うので、もし私は、計算フィールドを追加したテーブルが少し優しいようにするには

(ええ、私はテーブルごとに行あたり16のバイトがオーバーヘッド他のオプションが、同社の選択肢があります知っています)あなたは外部キーを持つ列を取得するだけでなく、関連するフレンドリーなフィールドを取得します。

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

正直言って私は他の誰と同じくらいここでデータをトレースしています。より直観的であれば良いです。データに時間を費やしているすべての人(そして1人の女の子)は、ジョインを書くことができます。ジョインは、毎回何度も何度も何度もやり直す必要があります。むしろ一度やり直して、もう一度やり直す必要はありません。 –

+2

または、それらの結合を行うビューを作成します。これをスカラーUDFにラップすると、パフォーマンスが非常に低下します。すべてのルックアップでRBARネストループを使用し、スカラーUDFに関連するさまざまな問題が発生します。 –

答えて

0

私の提言:companyGUID列の場合

  1. 、あなたがNEWSEQUENTIALID代わりのNEWIDを生成して使用することができ、それは断片化を低減します。インデックスのパフォーマンスを向上させます。
  2. PERSISTEDオプションを追加することで、CompanyName列を永続化させることができます。
+0

OPは、システム間の一意性を保証する手段としてGUIDを使用していると述べています。 sequentialidはこれを不可能にします。実際には、uniqueidentifierは主キーにとっては恐ろしいことではありませんが、クラスタ化インデックスとしては適していません。あなたが述べたように、断片化は狂っています。 –

+0

RE:2彼らはこれを持続させることはできません。それは決定論的ではありません。 –

+0

パフォーマンスを向上させるカラムを永続化することを検討しましたが、必要な記憶容量にも影響があります。大量ではありませんが、これらのフィールドはデバッグやトレースのためにのみ使用されます。私と同じ道をたどる誰かを見てうれしい。オプションありがとう。 –

2

あなたの主なパフォーマンスの問題は、検索によって引き起こされたものではなく、SCALAR FUNCTIONが原因です。

スカラ関数はすべての行で呼び出され、単独ではありませんが、パフォーマンスに大きな影響を及ぼす行数に乗算されます。

viewてもよいあなたのケースでのソリューションです:

:それはあなたがビューを使用するときに拡大し、ビュー内だけ mySchema.Companiesを使用して、テーブルのJOINされるコードだけだとして、それは追加のスペースを必要としません。
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

申し訳ありませんが、私はあなたの問題を理解していません。クライアントがテーブルを直接使用しないようにするには、ビューに対するselectパーミッションを残したままselectを拒否してください。 – sepupic

+0

クライアントはすでにアクセスが拒否されていますが、これは単なる例です。これは、主に非dbaがデータの問題を追跡する必要がある場合にのみ、私たちの社内向けです。なぜ私は製品を見ることができないのですか?なぜこの価格を買うのですか?私は自分の質問を書いてもらうことが公正だと思っていますが、もっと良い選択肢を見つけることができれば、より生産的に時間を費やすことができます。 +1の答えは、私が探しているものではありません。どうもありがとう。 –

関連する問題