0

多くのユーザー定義関数を使用するデータベース テーブルの計算列にインデックスを付けたいと考えています。しかし、私のコラムが非決定論的であることを知りました。

インデックスを作成しないと、必要なクエリの実行が遅くなります。

ユーザー定義関数を追跡して決定論的かどうかを判断する最良の方法は何ですか?

SQL Server Management Studio には、ユーザー定義関数が決定論的であるかどうかを教えてくれるツールがありますか?それとも、使用しているすべてのシステム定義関数をトレースして、どれが非決定論的であるかを見つけて見つける必要がありますか?それらなしで私のコードを書く他の方法は?

4

3 に答える 3

2

試す:

SELECT  *
FROM    INFORMATION_SCHEMA.ROUTINES
WHERE   IS_DETERMINISTIC = 'NO'
        AND ROUTINE_TYPE = 'FUNCTION'

また

SELECT OBJECTPROPERTY(OBJECT_ID('schemaname.functionname'), 'IsDeterministic')

申し訳ありませんが、IIRC、SQL Server 2000 では非決定論的な UDF が許可されていませんでした。

非決定論的な列にインデックスを付けるのはかなりばかげています-結局のところ、その値がパラメーターに厳密に依存していない場合、すべての意のままに変更されても、特にインデックスで使用されている場合は、あまり役に立ちませんものを見つけよう!

于 2008-11-19T21:08:14.363 に答える
1

多数のユーザー定義関数を使用しているとのことですが、関数ごとに個別に関数ベースのインデックスを作成してみましたか? それは少なくともそれを絞り込むはずです。

于 2008-11-19T21:13:08.503 に答える
0

関数が非決定論的である理由がわかりました。これは、スタイル コード 1、3、および 100 を超えるその他の Convert ステートメントに依存しています。

msdn Convert によると、次のとおりです。

次の条件のいずれかが存在しない限り、確定的:

ソース タイプは sql_variant です。

ターゲット タイプは sql_variant であり、そのソース タイプは非決定論的です。

ソースまたはターゲットの型が datetime または smalldatetime であり、もう一方のソースまたはターゲットの型が文字列であり、非決定論的スタイルが指定されている。決定論的であるためには、スタイル パラメーターは定数でなければなりません。さらに、スタイル 20 と 21 を除き、100 以下のスタイルは非決定論的です。スタイル 106、107、109、および 113 を除き、100 を超えるスタイルは決定論的です。

于 2008-11-20T12:07:34.827 に答える