1. 程式人生 > >如何解決儲存過程中關聯臨時表時快時慢的情況

如何解決儲存過程中關聯臨時表時快時慢的情況

     呼叫一個儲存過程,同樣的條件,資料庫負載也是正常的情況下,時快時慢。原因是資料庫無法獲取臨時表的統計資訊,導致執行計劃會走錯。之前寫過一個帖子,被臨時表坑了,http://blog.csdn.net/stevendbaguo/article/details/39964807,就是用hint/*+ dynamic_sampling(T 10) */來做動態採集,這種解決方案實踐證明還是沒有很好的解決問題,出現時快時慢的機率只是小了一點。

     最優的解決方案是什麼呢?

     一般我們會選擇事務型的臨時表,如果你用的是oracle 12c,恭喜你,插入臨時表後,直接收集統計資訊即可,dbms_stats.gather_table_stats是不會提交事務的。

如果是11g及以下的資料庫,會提交事務,表會被清空。

     那換成基於會話的臨時表,也有問題,weblogic連線池中的session是不會釋放的,臨時表的資料會不斷累積。

     最終的解決方案是:用基於會話的統計資訊,向臨時表中插入資料後,緊接著收集統計資訊,在儲存過程的末尾truncate表。

相關推薦

如何解決儲存過程關聯臨時情況

     呼叫一個儲存過程,同樣的條件,資料庫負載也是正常的情況下,時快時慢。原因是資料庫無法獲取臨時表的統計資訊,導致執行計劃會走錯。之前寫過一個帖子,被臨時表坑了,http://blog.csdn.net/stevendbaguo/article/details/399

關於sql server 在儲存過程建立臨時,並往臨時插入資料出現亂碼的問題

  此前在客戶一個繁體系統的sql  server中執行儲存過程的時候出現亂碼,經查發現建立臨時表後,往臨時表中插入資料時得到的資料是亂碼的,所以檢視建立表的sql指令碼,經查需要將變數型別設定為  

在oracle儲存過程建立臨時

在oracle的儲存過程中,不能直接使用DDL語句,比如create、alter、drop、truncate等。 那如果我們想在儲存過程中建立一張臨時表就只能使用動態sql語句了: create o

oracle儲存過程使用臨時

1、儲存過程中動態建立表失敗,提示許可權問題,execute immediate 'create global temporary t1 as select * from table1';  解決:  1-授權 create any table  2-儲存過程中加AUT

儲存過程建立臨時,為何沒有許可權?

oracle在儲存過程中建立臨時表,執行execute immediate str;報許可權不夠,但是複製出這個sql,直接在sql視窗執行成功,原因如下: 在儲存過程中的所有操作都必須直接顯式授權,不能通過角色授權。你必須把 CREATE TABLE 許可權顯式授予建立 

sqlserver 儲存過程使用臨時到底會不會導致重編譯

曾經在網路上看到過,SqlServer的儲存過程中使用臨時表,會導致執行計劃無法重用, 執行時候會導致重編譯的這麼一個說法,自己私底下去做測試的時候,根據profile的跟蹤結果, 如果不是統計資訊變更導致導致的重編譯,單單是使用臨時表,並不會導致重編譯, 但是對於

Mysql儲存過程(六)——儲存過程使用臨時

Mysql 不支援陣列。但有時候需要組合幾張表的資料,在儲存過程中,經過比較複雜的運算獲取結果直接輸出給呼叫方,比如符合條件的幾張表的某些欄位的組合計算。 Mysql 臨時表可以解決這個問題。 臨時表:只有在當前連線情況下, TEMPORARY 表才是可見的。當連線關閉時

儲存過程 建立全域性臨時

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE CreateTempTableForPostIdWithIdentity -- Add the parameters for the stor

SQL Server資料庫的儲存過程定義的臨時,真的有必要顯式刪除(drop table #tableName)嗎?

問題背景 在寫SQL Server儲存過程中,如果儲存過程中定義了臨時表,有些人習慣在儲存過程結束的時候一個一個顯式地刪除過程中定義的臨時表(drop table #tName),有些人又沒有這個習慣,對於不明真相的群眾或者喜歡思考的人會問,儲存過程中定義的臨時表,最後要不要主動刪除,為什麼

SQL檢視資料庫包含臨時的所有儲存過程

使用遊標過濾包含#開頭的儲存過程 declare @name varchar(300) declare mycur cursor for     select name from sysobjects o,syscomments s     where o.id =

SQL Server的巢狀儲存過程使用同名的臨時怪像淺析

     SQL Server的巢狀儲存過程,外層儲存過程和內層儲存過程(被巢狀呼叫的儲存過程)中可以存在相同名稱的本地臨時表嗎?如果可以的話,那麼有沒有什麼問題或限制呢? 在巢狀儲存過程中,呼叫的是外層儲存過程的臨時表還是自己定義的臨時表呢? 是否類似高階語言的變數一樣,本地臨

mysql 存儲過程使用遊標使用臨時可以替代數組效果

效果 tmp declare ges 必須 eight bold lar ora mysql不支持數組。但有時候需要組合幾張表的數據,在存儲過程中,經過比較復雜的運算獲取結果直接輸出給調用方,比如符合條件的幾張表的某些字段的組合計算,mysql臨時表可以解決這個問題.臨時表

Oracle 編譯儲存過程報錯: 或檢視不存在問題分析與解決

今天遇到一個問題,自己寫了一個很簡單的儲存過程,編譯的時候,報錯: 表或檢視不存在;      但是:表確實是存在,單獨拿出來查詢,一點問題也沒有。      經過幾番查詢,找到了問題所在: 查詢表的許可權不夠; 解決方案:

SQL Server儲存過程top後為變數的處理

@pageRecordNum為每頁顯示的記錄數,@currentPageNum為當前的頁數 create proc pagination  @pageRecordNum int,@currentPageNum int as  declare @recNum varchar(

安裝SQL Server 2012過程出現“啟用windows功能NetFx3出錯”(錯誤原因、詳細分析及解決方法)以及在Windows Server2012上安裝.NET Framework

  問題:在伺服器(作業系統為Windows server 2012)上安裝SQL Server 2012的過程中,安裝停留在下圖所示的介面上,顯示”正在啟用作業系統功能NetFx3”隨後出現提示框,告知啟用windows功能NetFx3時出錯。    分析:NetFx3指的

mysql儲存過程使用select count(*) into 變數名 from ++ where條件的用法

select count(*) into v_count from dual where userid=2;此語句的意思就是根據where條件查詢dual表,得到的行數存入變數v_count中(給變數賦值) 只能在儲存過程中編寫這樣的語句?如果在mysql的sql語句中編寫

SqlDataAdapter.Fill()超時的一個另類的原因:你的儲存過程有超長的註釋嗎?

最近在研究網站中,使用SqlDataAdapter進行Fill時總超時的問題,使用查詢分析器執行,結果秒出,使用Sql Server Profiler跟蹤後,得到指令扔到查詢分析器裡,結果還是秒出,但是在頁面執行,就永遠是超時,相當納悶啊 於是把Sql Server Pro

Hive儲存過程HQL/SQL(二)– 在Hive儲存過程讀寫MySQL

關鍵字:Hive儲存過程、PL/HQL、HQL/SQL、MySQL 通過PL/HQL可以在一個指令碼中同時訪問多個數據庫系統。在實際業務場景中,經常會有需要將Hive和RDBMS中的資料結合分析,比如: 往RDBMS中寫入Hive分析的審計資訊;從RDBMS中獲取一些維

在Oracle資料庫查詢所有觸發器、儲存過程、檢視、

在Oracle資料庫中查詢所有觸發器、儲存過程、檢視、表 方法一: Select object_name From user_objects Where object_type='TRIGGER';  --所有觸發器 Select object_name From user_objects Where ob

儲存過程使用dblink,碰到dblink死鎖解決方案

CREATE OR REPLACE PROCEDURE synchronous_pm_t_material AS PRAGMA AUTONOMOUS_TRANSACTION; ---開啟自動事務機制,此處的分號別忘了     last_version VARCHAR2(14)