タグ付けされた質問 「stored-procedures」

データベースマネージャーにインストールされた呼び出し可能なコードは、それを呼び出すことができるAPIを公開します。通常、ネイティブクエリ言語で記述されますが、一部のDBMSプラットフォームは他の言語もサポートしています。

6
ストアドプロシージャの実行が突然遅くなる
SQL Server 2000で発生している問題を理解しようとしています。中程度のトランザクションWebサイトでありsp_GetCurrentTransactions、customerIDを受け入れるストアドプロシージャと2つの日付があります。 現在、日付と顧客に応じて、このクエリは0〜1000行の任意の行を返すことができます。 問題:私たちが経験したことはExecution Timeout Expired、特定のクライアントがそのストアドプロシージャを実行しようとすると、突然(通常または同様の)多くのエラーが発生することです。そのため、クエリを調べてSSMSで実行すると、30秒かかることがわかります。したがって、ストアドプロシージャを再コンパイルすると、-bang-が300ミリ秒で実行されます。 私はこれについてDBAに話しました。彼は、ストアドプロシージャを作成したときにデータベースがクエリプランを作成したと言っています。彼は、そのパラメーターセットには良い計画であると言いましたが、特定のパラメーターセットをスローすると、そのデータに最適なプランではなくなるため、実行が遅くなります。 私に提示されたオプションは、問題のクエリをストアドプロシージャから、実行ごとに作成された実行プランを持つ動的SQLに戻すことです。 これは私に一歩後退したような気がし、これを回避する方法があるに違いないと感じています。この問題に対処する他の方法はありますか? ありとあらゆる回答を歓迎します。

2
ストアドプロシージャでのクエリの実行がクエリウィンドウよりも遅いのはなぜですか?
クエリウィンドウで2秒で実行される複雑なクエリがありますが、ストアドプロシージャとしては約5分です。なぜストアドプロシージャとして実行するのにこれほど時間がかかるのですか? クエリは次のようになります。 それは(によって識別されたレコードの特定のセット取り@idと@createdDate)、および特定の時間枠(から始まる1年間@startDateそれらの手紙の結果として受け取った手紙の要約リストが送られた)とリターンと推定支払いを。 CREATE PROCEDURE MyStoredProcedure @id int, @createdDate varchar(20), @startDate varchar(20) AS SET NOCOUNT ON -- Get the number of records * .7 -- Only want to return records containing letters that were sent on 70% or more of the records DECLARE @limit int SET @limit = IsNull((SELECT Count(*) …

2
末尾にスペースがあるVarcharの動作
スペースを含むVarcharを使用すると、末尾のスペースが無視されます。 例: declare @X varchar(50) この... set @X= 'John' ...と同じです... set @X= 'John ' これらは等しいと見なします。システムにこれらを異なるものとして認識させるにはどうすればよいですか?

1
SQL Serverがオブジェクト名とシステムプロシージャに渡される文字列を交換できる理由
オブジェクト名をシステムストアドプロシージャに渡すことが合法である原因は何sp_helptextですか? オブジェクト名を文字列に変換するメカニズムは何ですか? 例えば -- works sp_helptext myproc sp_helptext [myproc] sp_helptext [dbo.myproc] -- and behaves the same as a string sp_helptext 'myproc' sp_helptext 'dbo.myproc' -- does not work sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.' -- an additional case that does not work. …

5
SQL Serverには、実行中のストアドプロシージャに渡されるパラメーターの値を決定する方法があります
実行中のストアドプロシージャを決定する1つの方法は、次のような「動的管理」メソッドを使用することです。 SELECT sqlText.Text, req.* FROM sys.dm_exec_requests req OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext ただし、これはストアドプロシージャのcreateステートメントのテキストのみを表示します。例えば: CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id 理想的には、問題のあるパラメーターの特定のセットに対して非常に長く実行する原因となっている実行中のプロシージャーのパラメーターを確認したいと思います。 それを行う方法はありますか?(この質問では、 Aaron BertrandがDBCC InputBufferについて言及していますが、この問題には適切ではないと思います。)

2
sp_send_dbmailストアドプロシージャは添付ファイル付きで送信します
私は、顧客の1人に小さな月次レポートを送信するという任務を負っています。レポートは以前にインスタンスで手動で実行され、出力はスプレッドシートにコピーされ、添付ファイルとして顧客に送信されていました。 より永続的なソリューションを探しているのでsp_send_dbmail、クエリを実行して添付ファイルとして送信するためにストアドプロシージャを使用する予定です。 メッセージのフォーマット以外はすべて機能します。最初に、出力をCSVファイルとして添付しようとしました@query_result_seperator = ','が、結果はどこにでもありました! レポートを正常に実行すると、SQLで出力が正常に表示されます。ただし、CSVとして送信したり、メッセージ本文で送信したりすることはできません。 出力をHTMLとしてエクスポートし、添付ファイルまたはXMLとして送信する方がうまくいくと思いますが、これを行う方法がわかりません。 誰か提案はありますか? 前もって感謝します!

3
一時的なMEMORYテーブルを削除しない場合、どのくらい持続しますか(MySQL)
MySQLの再帰ストアドプロシージャを使用してという一時テーブルを生成してid_listいますが、フォローアップ選択クエリでそのプロシージャの結果を使用する必要があるためDROP、プロシージャ内で一時テーブルを使用できません... BEGIN; /* generates the temporary table of ID's */ CALL fetch_inheritance_groups('abc123',0); /* uses the results of the stored procedure in the WHERE */ SELECT a.User_ID FROM usr_relationships r INNER JOIN usr_accts a ON a.User_ID = r.User_ID WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) GROUP BY …

2
sp_executesqlはクエリプランをいつ更新しますか?
私はDBAではないので、私の素朴さを許さなければなりませんが、データベースの変更とストアドプロシージャの統計を時間の経過とともに再コンパイルして、クエリプランを最新の統計で最新に保つ必要があることを理解しています。 私が最新の統計に対して再コンパイルされた私のデータベース内のストアドプロシージャ持つと仮定すると、いくつかのコードでストアドプロシージャをインライニングとそれを包むの意味するものは、一定の間隔をsp_executesql文では?プロシージャの再コンパイルの一部として行われていたクエリプランの更新が失われますか? この変更を行う前に考慮する必要のあるもの(権限以外)があれば、あなたの洞察に感謝します。 私はMSDNでこれを読みました: SQL Serverクエリオプティマイザーが既存の実行プランと新しいTransact-SQL文字列を一致させる機能は、特に複雑なTransact-SQLステートメントで、文字列のテキストのパラメーター値が絶えず変化することによって妨げられます。 だから、私がインラインしてラップしようとしているストアドプロシージャにsp_executesql実際にいくつかのパラメータが含まれていると仮定すると、これは私の実行計画がキャッシュされているが、SQL Serverがそれを見つけて再利用することをより難しくしているということですか?

1
SQL Server Profilerでトレース中に、プロシージャ呼び出しで着信パラメーター値を記録することは可能ですか?
SQL Server Profiler(私はSQL Server 2012を使用しています)を使用して、変数名を持つSQLだけでなく、パラメーター値を示す便利なトレースを生成しようとしています。ストアドプロシージャは、大量のインベントリデータを調べて非常に価値のある結果を生成します。既存の動作を文書化しようとしているので、ユニットテスト、正確な定義、およびリファクタリングを行って、適切なものにリファクタリングできます。 ストアドプロシージャがカーソルを作成し、whileループを実行するループ内で、54パラメーターサブプロシージャの実行を実行するストアドプロシージャがあります。これは簡略化されたビューです。 CREATE PROCEDURE [dbo].[OuterProcedure] ( @ProductCode varchar(8), -- 41 more parameters omitted ) AS SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations. -- OMIT ABOUT 10 temporary table declarations. DECLARE aCursor CURSOR FAST_FORWARD FOR SELECT …

3
MySQLストアドルーチンの動的SQL
ストアドルーチンとトリガーの制限に従って、動的SQLは使用できません(バージョン5.0.13以降のストアドプロシージャの制限は解除されました)。この制限が設定されているのはなぜですか?そして、なぜそれを手順のために持ち上げますが、機能やトリガーではありませんか?

4
ストアドプロシージャで動的SQLを使用したくないのはなぜですか?
動的SQLを使用したくないと言った人がいました。具体的な例や実際の例を挙げていただけますか?個人的には、データベースに数回コーディングします。柔軟性があるので大丈夫だと思います。私の推測では、SQLインジェクションまたはパフォーマンスについてです。他に何か?

1
一時テーブルを作成するストアドプロシージャの最後で一時テーブルを切り捨てるのはなぜですか?
SQL Serverは、ストアドプロシージャ内で作成された一時テーブルをキャッシュし、プロシージャが終了してその後実行されるときにそれらの名前を変更するだけです。私の質問は、tempdbスペースがいつ解放されるかに関するものです。手順の最後でテーブルが切り捨てられることを読みました。これはセッションごとに処理されることをコメントで読んでおり、クリーンアップが必要かどうかについての質問がMSDNで回答されています。しかし、同じセッションで2回実行されない場合はどうでしょうか? また、テーブルが範囲外になるとその領域を解放するバックグラウンドガベージコレクションプロセスがあることも聞いたことがあります。 それを作成するストアドプロシージャの最後で一時テーブルを切り捨てると、逆の期待にもかかわらず、truncateステートメントが使用されていない場合よりも、テーブルがtempdbでデータ用に使用するスペースがより速く解放されるようです。どうして? そのような切り捨てステートメントを使用するかどうかの相対的なパフォーマンスへの影響はどうなりますか?SNAPSHOT分離を使用する場合、tempdbにストレスがかかることがよくあります。tempdbで使用されているスペースをできるだけ大きなtempテーブルからできるだけ早く解放すると、tempdbの不必要な増大を防ぐことができると思います。この潜在的なスペース節約は、パフォーマンスを犠牲にして実現されるでしょうか? 以下に、問題を再現するためのコードを示します(主に@TheGameiswarから、いくつかの変更を加えたものです)。 SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL DROP TABLE #temp SELECT * INTO #temp FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused --SELECT SUM(user_object_reserved_page_count) AS [user object pages used] …

2
名前があいまいなプロシージャを削除するにはどうすればよいですか?
informixを使用しています... 私はそれをどうやってやったのか分かりませんが、私のデータベースには同じ名前の2つの手順があります。私がそれらを削除しようとすると DROP PROCEDURE myProc; その後、エラーメッセージが表示されます ERROR: Routine (add_adr_trigger_row) ambiguous - more than one routine resolves to given signature. Error Code: -9700 手順を削除するにはどうすればよいですか?

5
SQLストアドプロシージャを一度に1人で実行するように制限するにはどうすればよいですか?
基本的に、あるテーブルから値を選択して別のテーブルに挿入するストアドプロシージャがあります。これは一種のアーカイブです。複数の人が同時にそうするのを避けたいです。 このプロシージャが実行されている間、他の人がそれを開始できるようにしたくはありませんが、シリアライゼーションは必要ありません。他の人は、処理が終わった後にプロシージャを実行します。 私が欲しいのは、プロシージャを実行しているときに、他の人がそれを開始しようとしてエラーが発生することです。 私はsp_getapplockを使用して試しましたが、その人がプロシージャを実行するのを完全に止めることができません。 また、sys.dm_exec_requestsを使用してプロシージャを見つけてブロックしましたが、これは機能しますが、一部のサーバーではsys.dm_exec_sql_text(sql_handle)を実行する権限がないため、最適ではないと思います。 これを行うための最良の方法は何ですか?

1
SSMSオプション「追加の実行オプションなしでストアドプロシージャのショートカットを実行する」とは何ですか?
これは冗長なオプションです。ドキュメントはなく、ウェブ検索も役に立ちません。クエリを実行しているとき、チェックされているオプションとチェックされていないオプションの違いに気づきません。この設定は何を制御しますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.