1. 程式人生 > >客戶端直接執行儲存過程正常但程式碼呼叫慢的問題

客戶端直接執行儲存過程正常但程式碼呼叫慢的問題

JAVA呼叫SQL後臺儲存過程時,有時突然就變得很慢,在後臺直接執行儲存過程沒問題,但在前臺呼叫儲存過程時就是很慢,而且在前臺呼叫成功後,再次呼叫還是一樣的慢,但更新一下儲存過程再呼叫就很快了。但這始終不能徹底解決問題,過段時間又會出來同樣的問題。

解決辦法:

簡單方法一:在可能比較耗時的語句後面加上option(recompile)

方法二:新編譯儲存過程
在用諸如新增索引或更改索引列中的資料等操作更改資料庫時,應通過重新編譯訪問資料庫表的原始查詢計劃使其得到重新優化。在重新啟動 SQL Server 後第一次執行儲存過程時自動發生該優化。當儲存過程使用的基礎表更改時也會發生優化。但是如果添加了儲存過程可能從中受益的新索引,將不發生自動優化,直到下一次 SQL Server 重新啟動後再執行該儲存過程時為止。

SQL Server 提供三種重新編譯儲存過程的方法:  

sp_recompile 系統儲存過程強制在下次執行儲存過程時進行重新編譯。

直接執行:exec sp_recompile @objname=儲存過程名或者function名


建立儲存過程時在其定義中指定 WITH RECOMPILE 選項,表明 SQL Server 將不對該儲存過程計劃進行快取記憶體;該儲存過程將在每次執行時都重新編譯。當儲存過程的引數值在各次執行間都有較大差異,導致每次均需建立不同的執行計劃時,可使用 WITH RECOMPILE 選項。此選項並不常用,因為每次執行儲存過程時都必須對其進行重新編譯,這樣會使儲存過程的執行變慢。


在執行儲存過程時指定 WITH RECOMPILE 選項,可強制對儲存過程進行重新編譯。僅當所提供的引數不典型,或者自建立該儲存過程後資料發生顯著更改時才應使用此選項。  


說明 如果刪除或重新命名了儲存過程所引用的物件,那麼在執行該儲存過程時會返回錯誤。但如果用同名物件替換了儲存過程中引用的物件,則可以不進行重新編譯而繼續執行該儲存過

相關推薦

客戶直接執行儲存過程正常程式碼呼叫的問題

JAVA呼叫SQL後臺儲存過程時,有時突然就變得很慢,在後臺直接執行儲存過程沒問題,但在前臺呼叫儲存過程時就是很慢,而且在前臺呼叫成功後,再次呼叫還是一樣的慢,但更新一下儲存過程再呼叫就很快了。但這始終不能徹底解決問題,過段時間又會出來同樣的問題。 解決辦法: 簡單

DB2大資料重一張表複製到另外一張表儲存過程直接客戶執行

  IN PI_PCKBED VARCHAR(32672),IN PI_PCKEND VARCHAR(32672)) BEGIN   DECLARE SQL1 VARCHAR(200);   DECLARE SQL2 VARCHAR(200);   DECLARE SQL3 VARCHAR(200);   D

OSS直傳結合STS使用流程—— 授權您的客戶直接訪問雲端儲存

摘要:當阿里雲客戶使用雲端儲存服務來儲存來自其客戶端的使用者資料時,現有的解決方案都存在一些問題。針對這一場景及問題,本文介紹了一種輕量級的安全解決方案,即使用STS服務授權客戶端直接訪問雲端儲存。本文闡述了STS方案的基本原理,並且結合具體應用場景,對實施步驟進行了詳細的描

NIO客戶主要創建過程

receive blocking 返回 reactor 地址 業務邏輯 != ask .config NIO客戶端主要創建過程: 步驟一:打開SocketChannel,綁定客戶端本地地址(可選,默認系統會隨機分配一個可用的本地地址),示例代碼如下: Sock

轉!mysql 命令列下 通過DELIMITER臨時改變語句分隔符 執行儲存過程

mysql 在 Navicat 介面工具 執行儲存過程ok,但是在命令列下執行失敗。 原因在於,預設的MySQL語句分隔符為' ; ',在輸入' ; '的時候,“以為”語句已經結束了,但實際上語句還沒有結束。 解決方案:使用DELIMITER臨時改變命令列的語句分隔符,在儲存過程建立之後再修改分隔符為原來

執行儲存過程,報錯提示 找不到儲存過程

原因: SQL Server 客戶端, 在連線到 SQL Server 資料庫以後。會自動讀取 資料庫的 資料字典資訊。也就是 當前資料庫,有哪些表/欄位/檢視/儲存過程等基礎資訊。儲存在客戶端的記憶體裡面。這樣。當你在客戶端輸入 SQL 語句的時候,輸入 表名字.會自動彈出 這個表的欄位列表,

執行儲存過程時,返回引數示例程式碼

//引數 SqlParameter[] fparams = new SqlParameter[7]; fparams[0] = new SqlParameter("@ID", ID); fparams[

MySQL-SQLyog執行儲存過程儲存函式等

1.開啟SQLyog在目錄樹-函式(儲存過程)資料夾上右鍵,建立函式(建立儲存過程) 2.按照MySQL定義函式的規則,新定義一個函式:   3. 然後新建查詢編輯器,呼叫自定義的函式。 命令:SELECT function_name(params1, ...),函式名稱

SQLSERVER 連結伺服器執行儲存過程

1.建立連結伺服器 exec sp_addlinkedserver 'server_tmp','','SQLOLEDB','192.168.1.1' -- server_tmp 為別名 exec sp_addlinkedsrvlogin 'server_tmp','false',null,'sa','

Oracle job 定時執行 儲存過程

一:簡單測試job的建立過程案例: 1,先建立一張JOB_TEST表,欄位為a 日期格式 SQL> create table JOB_TEST(a date); Table created SQL> commit; Commit complete

連線ORACLE資料庫,是不是必須要安裝oracle客戶執行

大神給的回答: net連線oracle使用的是oci介面,必須安裝oracle客戶端,並配置本地網路服務名 tnsnames.ora。不過oracle網站有精簡版的客戶端軟體,不到30M吧,解壓,並編輯tnsnames.ora既可。很是方便,不用安裝700M左右的客戶端 ,而且安裝後還不好解除安裝。如果是j

thinkphp5 連線 SqlServer 執行儲存過程,返回為空解決方案

專案做在win下,伺服器是類似空間伺服器,所以不可以裝擴充套件,只能yum 老闆又非要用雙資料庫(sqlsever 心酸里程) ,結果就是伺服器sqlsrv 不可用,裝的是dblib  ......云云雲 水準不高 ,只能用最簡單的方法 。 貼程式碼記錄一下,返回結果成功

定時執行儲存過程

需求:客戶要求把A系統出來的一些資料每月底同步到指定表(在A系統資料庫)中。 實現方案:往指定表插資料採用儲存過程(procA)。每月底執行採用windows任務定時或“SQL Server代理——作業”實現。 怎麼使用windows自帶任務定時執行bat實現上述需求? 1、先建

oracle執行儲存過程返回遊標cursor

create or replace procedure TEST(s varchar2, r_result out sys_refcursor) is   --作者:lml   --功能:根據tokenid查詢放行指令   --詳情:   --1.返回放行指令   --時間

sybase執行儲存過程的方法

如題第一種: 如果安裝了dba客戶端的話,開啟isql查詢分析器: 輸入helloworld '2012-4-8','2012-4-9',0 結果: 注意這是有引數的儲存過程,由於受mysql、影響我剛剛是這樣輸入的helloworld ('2012-4-8','2012-

PLsql中執行儲存過程的方法

1、在sqlplus命令列介面使用"EXECUTE"命令(簡寫做"EXEC")執行[email protected]> exec proc_helloworldHello World!PL/SQL procedure successfully complet

Oracle如何執行儲存過程

示例:有如下建立索引的儲存過程 --procedure create_index create or replace procedure create_index(indexName in varch

怎麼在plsql中執行儲存過程

1寫一個簡單的儲存過程 CREATE OR REPLACE PROCEDURE aaa(rs_cursor out TYPES.REFCURSOR)  AS BEGIN open rs_cursor for select *  from user; END; 2在plsq

Oracle定時任務執行儲存過程帶引數

儲存過程: create or replace procedure pro_test (retCode out number, retMsg out varchar2) is  vcrm v_prod_inst%ROWTYPE; TYPE ref_cursor_type I

java socket伺服器客戶執行緒小例子

package com.xueyoucto.xueyou; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; im