⑴ DB2 load數據時欄位超長,怎麼才能自動截斷存入
這個好說,首先,你先建一個varchar(30)的temp表。然後將數據load進這個temp表。
再substr()切取這個臨時表的列前6位,裝到你的目標表tablename中去不就可以了。你在文件中想要讀取前6位可能行不通啊。
⑵ sql 語句 最大長度限制 DB2如何修改最大長度限制
home/datamart$ db2 get db cfg|grep HEAP
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = AUTOMATIC
Sort list heap (4KB) (SORTHEAP) = AUTOMATIC
Database heap (4KB) (DBHEAP) = AUTOMATIC
Utilities heap size (4KB) (UTIL_HEAP_SZ) = 103816
SQL statement heap (4KB) (STMTHEAP) = AUTOMATIC
Default application heap (4KB) (APPLHEAPSZ) = AUTOMATIC
Statistics heap size (4KB) (STAT_HEAP_SZ) = AUTOMATIC
修改 STMTHEAP
P570_B_2:/DATAMART/usr/datamart >db2 update db cfg for datamart using STMTHEAP 20480 AUTOMATIC
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.
P570_B_2:/DATAMART/usr/datamart >db2stop force
10/19/2012 10:56:14 0 0 SQL1064N DB2STOP processing was successful.
SQL1064N DB2STOP processing was successful.
P570_B_2:/DATAMART/usr/datamart >db2start
10/19/2012 10:56:20 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
P570_B_2:/DATAMART/usr/datamart >db2 get db cfg |grep STMT
SQL statement heap (4KB) (STMTHEAP) = AUTOMATIC(20480)
Automatic statement statistics (AUTO_STMT_STATS) = OFF
DB2 V9.5 for Linux, UNIX, and Windows
stmtheap - 語句堆大小配置參數
此參數指定語句堆的大小,語句堆在編譯 SQL 或 XQuery 語句期間用作 SQL 或 XQuery 編譯器的工作空間。
配置類型
資料庫
參數類型
可聯機配置
傳播類
語句邊界
預設值 [范圍]
帶有本地客戶機和遠程客戶機的資料庫伺服器:預設值為 AUTOMATIC(底層值為 8192)。
還可將該參數僅設置為某個固定值。
帶有本地客戶機和遠程客戶機的資料庫伺服器:預設值為 AUTOMATIC(底層值為 2048)。
還可將該參數僅設置為某個固定值。
對於 32 位平台
AUTOMATIC [128 - 524288]
對於 64 位平台
AUTOMATIC [128 - 524288]
註: 在初始創建資料庫後,預設值將由 DB2® 配置顧問程序進行更改。
計量單位
頁 (4 KB)
分配時間
對於預編譯或綁定期間的每個語句
釋放時間
當每個語句的預編譯或綁定完成時
此區域並不總是處於分配狀態,但要對每個處理的 SQL 或 XQuery
語句進行分配和釋放。注意:對於動態 SQL 或 XQuery 語句,將在程序執行期間使用此工作區; 而對於靜態 SQL 或 XQuery
語句,在綁定進程而不是在程序執行期間使用此工作區。
可使用底層值或固定值將 STMTHEAP 參數設置為 AUTOMATIC。該參數設置為 AUTOMATIC 時,底層值會對使用動態連接枚舉為單個編譯分配的內存量加以限制。如果遇到內存限制,語句編譯會使用貪婪連接枚舉和不受限制的語句堆重新啟動。其僅受到剩餘應用程序內存量
(APPL_MEMORY)、實例內存 (INSTANCE_MEMORY) 或系統內存的限制。如果貪婪連接枚舉成功完成,那麼將向應用程序返回一個 SQL0437W 警告。如果貪婪連接枚舉也遇到內存限制,那麼語句預編譯失敗,且帶有
SQL0101N。
例如,db2 update db cfg for SAMPLE using STMTHEAP 8192 AUTOMATIC 將為動態連接枚舉設置
8192 *4K (32MB) 的語句堆限制並對貪婪連接枚舉不設限制。
當 STMTHEAP 參數設置為固定值時,該限制同時適用於動態和貪婪連接枚舉。如果動態連接枚舉遇到內存限制,那麼將使用同一固定語句堆限制來嘗試貪婪連接枚舉。在 AUTOMATIC 情況下,類似的警告/錯誤也適用。
例如,db2 update db cfg for SAMPLE using STMTHEAP 8192 將同時為動態和貪婪連接枚舉生成
8192 * 4K (32MB) 的語句堆限制。
如果在運行時的查詢性能不夠高,請考慮增大 stmtheap 配置參數值(底層為 AUTOMATIC 的值或固定值),從而確保動態編程連接枚舉能夠成功。如果您更新 stmtheap 配置參數以提高查詢性能,那麼會導致重新編譯語句,以便查詢優化器可以創建新的訪問方案來利用已更改數量的語句堆。
註: 僅在優化類 3 和更高級別(預設值為 5)進行動態編程聯合枚舉。
⑶ SQL 語句 最大長度限制 DB2如何修改最大長度限制
home/datamart$ db2 get db cfg|grep HEAP
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = AUTOMATIC
Sort list heap (4KB) (SORTHEAP) = AUTOMATIC
Database heap (4KB) (DBHEAP) = AUTOMATIC
Utilities heap size (4KB) (UTIL_HEAP_SZ) = 103816
SQL statement heap (4KB) (STMTHEAP) = AUTOMATIC
Default application heap (4KB) (APPLHEAPSZ) = AUTOMATIC
Statistics heap size (4KB) (STAT_HEAP_SZ) = AUTOMATIC
修改 STMTHEAP
P570_B_2:/DATAMART/usr/datamart >db2 update db cfg for datamart using STMTHEAP 20480 AUTOMATIC
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.
P570_B_2:/DATAMART/usr/datamart >db2stop force
10/19/2012 10:56:14 0 0 SQL1064N DB2STOP processing was successful.
SQL1064N DB2STOP processing was successful.
P570_B_2:/DATAMART/usr/datamart >db2start
10/19/2012 10:56:20 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
P570_B_2:/DATAMART/usr/datamart >db2 get db cfg |grep STMT
SQL statement heap (4KB) (STMTHEAP) = AUTOMATIC(20480)
Automatic statement statistics (AUTO_STMT_STATS) = OFF
⑷ DB2 SQL 語句 如何修改最大長度限制
能不能不要用中文做這些資料庫對象的名字?想試著幫你改下,需要你把你的需求描述下。同時,需要你把這之中牽涉到的資料庫對象的創建語句都貼出來。最後,如果你已經做了測試了,可把遇到的問題描述下,這樣會比較有針對性。
⑸ SQL 語句 最大長度限制 DB2如何修改最大長度限制
<proinsight-br>10/19/2012 10:56:20 0 0 SQL1063N DB2START processing was successful.<proinsight-br>Automatic statement statistics (AUTO_STMT_STATS) = OFFDB2 V9.5 for Linux, UNIX, and Windowsstmtheap - 語句堆大小配置參數此參數指定語句堆的大小,語句堆在編譯 SQL 或 XQuery 語句期間用作 SQL 或 XQuery 編譯器的工作空間。 配置類型資料庫 參數類型可聯機配置 傳播類語句邊界 預設值 [范圍] 對於32 位平台AUTOMATIC [128 - 524288] 帶有本地客戶機和遠程客戶機的資料庫伺服器:預設值為 AUTOMATIC(底層值為 2048)。還可將該參數僅設置為某個固定值。 對於64 位平台AUTOMATIC [128 - 524288] 帶有本地客戶機和遠程客戶機的資料庫伺服器:預設值為 AUTOMATIC(底層值為 8192)。還可將該參數僅設置為某個固定值。註: 在初始創建資料庫後,預設值將由 DB2�0�3 配置顧問程序進行更改。 計量單位頁(4 KB) 分配時間對於預編譯或綁定期間的每個語句 釋放時間當每個語句的預編譯或綁定完成時此區域並不總是處於分配狀態,但要對每個處理的 SQL 或 XQuery 語句進行分配和釋放。注意:對於動態 SQL 或 XQuery 語句,將在程序執行期間使用此工作區; 而對於靜態 SQL 或 XQuery 語句,在綁定進程而不是在程序執行期間使用此工作區。可使用底層值或固定值將 STMTHEAP 參數設置為 AUTOMATIC。該參數設置為 AUTOMATIC 時,底層值會對使用動態連接枚舉為單個編譯分配的內存量加以限制。如果遇到內存限制,語句編譯會使用貪婪連接枚舉和不受限制的語句堆重新啟動。其僅受到剩餘應用程序內存量 (APPL_MEMORY)、實例內存 (INSTANCE_MEMORY) 或系統內存的限制。如果貪婪連接枚舉成功完成,那麼將向應用程序返回一個 SQL0437W 警告。如果貪婪連接枚舉也遇到內存限制,那麼語句預編譯失敗,且帶有 SQL0101N。例如,db2 update db cfg for SAMPLE using STMTHEAP 8192 AUTOMATIC 將為動態連接枚舉設置 8192 *4K (32MB) 的語句堆限制並對貪婪連接枚舉不設限制。當STMTHEAP 參數設置為固定值時,該限制同時適用於動態和貪婪連接枚舉。如果動態連接枚舉遇到內存限制,那麼將使用同一固定語句堆限制來嘗試貪婪連接枚舉。在 AUTOMATIC 情況下,類似的警告/錯誤也適用。例如,db2 update db cfg for SAMPLE using STMTHEAP 8192 將同時為動態和貪婪連接枚舉生成 8192 * 4K (32MB) 的語句堆限制。如果在運行時的查詢性能不夠高,請考慮增大 stmtheap 配置參數值(底層為 AUTOMATIC 的值或固定值),從而確保動態編程連接枚舉能夠成功。如果您更新 stmtheap 配置參數以提高查詢性能,那麼會導致重新編譯語句,以便查詢優化器可以創建新的訪問方案來利用已更改數量的語句堆。註: 僅在優化類 3 和更高級別(預設值為 5)進行動態編程聯合枚舉。<proinsight-br>
⑹ DB2如何修改sql最大長度限制
DB2中的限制之一SQL標識符的長度限制
作者﹕CCBZZP
在現實的DB2應用中大家可能經常會遇到一些錯誤,錯誤的原因是對DB2的
限制不太了解而引起的,在此我簡單地總結一下,歡迎大家繼續﹐以便和大家共享﹐
共同探討﹐共同近步﹗(以下主要以DB2 7.X為例)。
1. 最長的認證名(單位元組字元)<=30
2. 最長的約束名稱<=18
3. 最長的關聯名稱<=128
4. 最長的條件名稱<=64
5. 最長的游標名稱<=18
6. 最長數據源列名稱<=128
7. 最長數據源索引名稱<=128
8. 最長數據源名稱<=128
9. 最長數據源表名稱(遠程認證名稱)<=128
10. 最長外部程序名稱<=8
11. 最長主機標識符<=255
12. 最長數據源用戶的標識符(遠程認證名稱)<=30
13. 最長標簽名稱<=64
14. 最長方法名稱<=18
15. 最長參數名稱<=128
16. 最長訪問數據源的口令<=32
17. 最長保存點名稱<=128
18. 最長模式名稱<=30
19. 最長伺服器(資料庫別名)<=8
20. 最長SQL變數名稱<=64
21. 最長語句名稱<=18
22. 最長轉換組名<=18
23. 最長不受限制的列名<=30
24. 最長不受限制的包名<=8
25. 最長不受限定的用戶自定義類型,用戶自定義函數,緩沖池,表空間,節點組,
觸發器索引,索引規范名稱<=18
26. 最長不受限定的表名,視圖,存儲過程名,別稱或別名<=128
27. 最長的包裝器名<=128
⑺ DB2 中查詢語句超過了表限制怎麼辦
語句太長、太復雜,超出了DB2的限制,重新SQL語句吧。
建立臨時表,把數據放入臨時表中。
db2 => ? sql101
SQL0101N The statement is too long or too complex.
Explanation:
The statement could not be processed because it exceeds a system limit
for either length or complexity, or because too many constraints or
triggers are involved.
If the statement is one that creates or modifies a packed description,
the new packed description may be too large for its corresponding column
in the system catalogs.
Federated system users should also check to see if the statement:
* Exceeds either a federated server system limit or a data source
system limit for length or complexity.
* Violates some other data source specific limit.
The statement cannot be processed.
Note: Where character data conversions are performed for applications
and databases running under different codepages, the result of the
conversion is exceeding the length limit.
User response:
Either:
* Break the statement up into shorter or less complex SQL statements.
* Increase the size of the statement heap (stmtheap) in the database
configuration file.
* Rece the number of check or referential constraints involved in the
statement or rece the number of indexes on foreign keys.
* Rece the number of triggers involved in the statement.
* Federated system users: determine which data source is failing the
statement (see the Troubleshooting Guide for proceres to follow to
identify the failing data source) and determine the cause of the
rejection. If the rejection is coming from the federated server,
increase the size of the statement heap (stmtheap) in the database
configuration file.
sqlcode: -101
sqlstate: 54001
⑻ 【DB2】SQL優化
於我來說,我喜歡技術,不偏執於某一類開發語言,願意花時間精力去解決問題。
1.去除在謂詞列上編寫的任何標量函數
優化前:(耗時3.1s)
優化後:(耗時0.922s)
總結:
DB2可以選擇使用START_DATE上的列索引,但是在列上使用了函數後,DB2就無法使用列索引了,從而導致查詢效率變低。
2.去除在謂詞列上編寫的任何數學運算
優化前:(耗時10.265)
優化後:(耗時3.39s)
總結:
DB2查詢時候,會優先選擇列CONTRACT_AMT上的索引,如果直接對列CONTRACT_AMT應用數學運算,DB2就無法使用索引了。一定要做到:列本身(不加數學運算)放在操作符的一邊,而所有的計算都放在另外一邊。
3.SQL語句中指定查詢列
優化前:(耗時13.15s)
優化後:(耗時2.922s)
總結:
如果Select包含不需要的列,優化工具會選擇Indexonly=』N』,這會強制DB2必須進入數據頁來得到所請求的特定列,這就要求更多的I/O操作,梁歪,這些多餘的列可能是某些排序的部分,這樣一來就需要和傳遞一個更大的排序文件,相應的會使排序成本更高。
4.盡可能不使用distinct
優化前:(耗時0.687s)
優化後:(耗時0.437s)
總結:
在測試distinct與group by性能的過程中,在列CST_ID上添加索引後,發現group by 確實比distinct快一些,但是在數據分布比較離散的情況下使用group by ,比較集中的情況下使用distinct.表數據量較少的情況隨便使用哪個都一樣, 不管選擇誰,都要建立索引
5.Exists、in、not in 、not exists的使用場景選擇
5.1 in跟exists的區別:
例如:表A(小表),表B(大表)
優化前:(耗時1.93s)
優化後:(耗時1.125s)
相反的,
優化前:(耗時1.9s)
優化後:(耗時1.0s)
總結:
in是把外表和內表作hash連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。 如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in;
簡稱:子大Exists,子小in
5.2 not in 與 not exists區別:
如果查詢語句使用了not in,那麼對內外表都進行全表掃描,沒有用到索引;而not exists的子查詢依然能用到表上的索引。所以無論哪個表大,用not exists都比not in 要快。
6.盡可能使用union all來代替union
優化前:(耗時15.344s)
優化後:(耗時2.719s)
總結:
在union中,DB2最後會自動執行一個排序來消除重復值,這樣是很耗費資源的,所以在不需要去重復的情況下,盡可能使用UNION ALL 代替union
N.模板
優化前:(耗時3.1s)
優化後:(耗時0.922s)
總結:
⑼ db2 sql語句優化
b/g/h三個表的workdate有索引么?另外,1.如果可能最好將所有聯表用的欄位都進行索引,2.(workdate,agentserialno)可以考慮二維索引,前提是空間足夠的話,這樣效率提高會非常明顯。
⑽ 請教 :db2資料庫 如何查找出執行時間最長的sql
執行時間最長的20條SQL語句(按時間降序排列),可保存為腳本方便調用:
SELECT rows_read / (num_executions + 1) as avg_rows_read,
rows_written / (num_executions + 1) as avg_rows_written,
stmt_sorts / (num_executions + 1) as avg_sorts,
total_exec_time / (num_executions + 1) as avg_exec_time,
substr(stmt_text,1,1000) as SQL_Stmt
FROM SYSIBMADM.SNAPDYN_SQL ORDER BY avg_exec_time desc fetch first 20 rows only;
祝你學習愉快!