1

これはの質問と聞こえるかもしれませんが、SQLは本当に強くないので、ここでいくつかの助けを求めています。各呼び出しでテーブル値関数(SQL)がテーブルを作成しますか? [パフォーマンス]

私は何かを実装しようとしていますが、パフォーマンスの問題が心配です。

私が修正しようとしています問題は、このようなものである:DATA1、DATA2、DATA3、data57

私はコンマで区切られた大量のデータを持つ列「」このような 何かを持っています

私は必要なものすべてのレコードのカンマで区切られたデータの各部分をループあり、そしては、その一枚でデータを何かを、あなたはそれを得るのですか?

can actually help meの解決策が見つかりましたが、私はを別のパラメータを使用して複数回呼び出す必要があるため、システムパフォーマンスが心配ですです!

テーブル値関数(UDF)に対して行った呼び出しごとにテーブルが作成されるのですか、またはSQL Serverによってキャッシュとして保存されますか? [多分私は一時テーブルが必要でしょうか?]

ありがとうございました!


注:データは私ではない、とあるように私はそれを使用する必要があり、そのデータベースを変更することが示唆され(ただし、私はそれが最善のシナリオだろう知っている)問題外です。 a 注2:この質問/問題の目的は、初期データをデータベースにインポートすることです。何度も実行されることはないため、パフォーマンスは深刻な問題ではないかもしれませんが、それでも問題を考える必要があります私ができる最善の方法!

+1

はい。この関数は 'tempdb'にエントリを作成し、それを入力して各呼び出しでそれを破棄します。 – TZHX

+0

Alllrighhht ...コメントありがとう! – TiagoM

+0

あなたがこの問題に近づくためのより良い解決策を提供できるならば、私のゲストになってください、私は感謝します:) – TiagoM

答えて

2

複数のステートメントで構成されているユーザー定義のテーブル値関数は、見つかったものとしてtempdbシステムデータベースにオブジェクトを作成し、オブジェクトを作成してオブジェクトがスコープ外になったときに破棄します。

これを同じパラメータで複数回実行する場合は、テーブル変数を作成してその結果をキャッシュすることを検討してください。あなたがカンマで区切られた値で別のリストでそれを呼び出すつもりなら、オーバーヘッドを避ける素晴らしい方法はありません。 SQL Serverは実際にたくさんの文字列操作用に構築されていません。

一般に、1回限りのジョブでは、このtempdbの使用に伴うパフォーマンスの影響は、大きな懸念事項になることはありません。それは、それがデータベースの日々の生活の中で共通のパターンであるときにはもっと重要です。

可能であれば、データの適切なサイズのサブセットを使用してソリューションのパフォーマンスを評価することをお勧めします。

あなたは、SQL Server 2016にしていると言うので、あなたは

SELECT t.Column1, t.Column2, s.value 
FROM table t 
CROSS APPLY STRING_SPLIT(t.CsvColumn, ',') s 

のようなものが新しいを定義する必要なしに、あなたがしたい場所にあなたが近づく可能性があり、新しいSTRING_SPLIT機能を利用することができます関数。データベースを2016互換性レベル(130)で実行する必要があることに注意してください。SQL 2016で動作させるだけでは不十分です(互換性を失うような変更を避けるため、 )。

+0

あなたの答えをありがとう、結果を確認するためにそのクエリを実行しようとしていますが、これまで動作していない、 "無効なオブジェクト名 'STRING_SPLIT'"と言います。また、 's'はテーブルを表していないので、s.valueを消去しなければなりませんでした。たぶんそれはタイプミスでした。ありがとう! – TiagoM

+1

これで、STRING_SPLITによって返されたテーブルにsをエイリアスとして追加するつもりでした。あなたはそれがないように聞こえる。あなたはデータベースの互換性レベルをチェックできますか? 2014(120)または2012(110)に設定されている可能性があります。変更できない限り、STRING_SPLITは使用できなくなります。 – TZHX

+0

私はこのコマンドを実行する必要があることをgoogleから通知します: "ALTER DATABASE TestAzureDB SET COMPATIBILITY_LEVEL = 130" – TiagoM

関連する問題