国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

小議SQLServer批量更新的優(yōu)化

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 15:21:29
文檔

小議SQLServer批量更新的優(yōu)化

小議SQLServer批量更新的優(yōu)化:聽全老大的 JDBC 課的時(shí)候,聽到一節(jié)是講在利用 JDBC 中處理批量更新oracle數(shù)據(jù)時(shí)候的特性,讓我很為 JDBC 的特性感的興奮,利用這個(gè)特性可以在批量更新數(shù)據(jù)的時(shí)候不同往常一樣每次都需要傳送完成的 SQL 語句到數(shù)據(jù)庫中。其中示范代碼如下 : 1 impo
推薦度:
導(dǎo)讀小議SQLServer批量更新的優(yōu)化:聽全老大的 JDBC 課的時(shí)候,聽到一節(jié)是講在利用 JDBC 中處理批量更新oracle數(shù)據(jù)時(shí)候的特性,讓我很為 JDBC 的特性感的興奮,利用這個(gè)特性可以在批量更新數(shù)據(jù)的時(shí)候不同往常一樣每次都需要傳送完成的 SQL 語句到數(shù)據(jù)庫中。其中示范代碼如下 : 1 impo

聽全老大的 JDBC 課的時(shí)候,聽到一節(jié)是講在利用 JDBC 中處理批量更新oracle數(shù)據(jù)時(shí)候的特性,讓我很為 JDBC 的特性感的興奮,利用這個(gè)特性可以在批量更新數(shù)據(jù)的時(shí)候不同往常一樣每次都需要傳送完成的 SQL 語句到數(shù)據(jù)庫中。其中示范代碼如下 : 1 import java.s

聽全老大的JDBC課的時(shí)候,聽到一節(jié)是講在利用JDBC中處理批量更新oracle數(shù)據(jù)時(shí)候的特性,讓我很為JDBC的特性感的興奮,利用這個(gè)特性可以在批量更新數(shù)據(jù)的時(shí)候不同往常一樣每次都需要傳送完成的SQL語句到數(shù)據(jù)庫中。其中示范代碼如下:

1 import java.sql.*;
2
3 publicclass BatchUpdates
4 {
5 publicstaticvoid main(String[] args)
6 {
7 Connection conn =null;
8 Statement stmt =null;
9 PreparedStatement pstmt =null;
10 ResultSet rset =null;
11 int i =0;
12
13 try
14 {
15 DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
16
17 String url ="jdbc:oracle:oci8:@";
18 try {
19 //檢查是否配置JDBC環(huán)境變量
20 String url1 = System.getProperty("JDBC_URL");
21 if (url1 !=null)
22 url = url1;
23 } catch (Exception e) {
24 //如果是在集成開發(fā)環(huán)境導(dǎo)入了JDBC的話可以注釋這句
25 }
26
27 // 連接到數(shù)據(jù)庫用 scott
28 conn = DriverManager.getConnection (url, "scott", "tiger");
29
30 stmt = conn.createStatement();
31 try { stmt.execute(
32 "create table mytest_table (col1 number, col2 varchar2(20))");
33 } catch (Exception e1) {}
34
35 //
36 // 批量插入新值.
37 //
38 pstmt = conn.prepareStatement("insert into mytest_table values (?, ?)");
39
40 pstmt.setInt(1, 1);
41 pstmt.setString(2, "row 1");
42 pstmt.addBatch();
43
44 pstmt.setInt(1, 2);
45 pstmt.setString(2, "row 2");
46 pstmt.addBatch();
47
48 pstmt.executeBatch();
49
50 //
51 // 查詢 輸出結(jié)構(gòu)集
52 //
53 rset = stmt.executeQuery("select * from mytest_table");
54 while (rset.next())
55 {
56 System.out.println(rset.getInt(1) +", "+ rset.getString(2));
57 }
58 }
59 catch (Exception e)
60 {
61 e.printStackTrace();
62 }
63 finally
64 {
65 if (stmt !=null)
66 {
67 try { stmt.execute("drop table mytest_table"); } catch (Exception e) {}
68 try { stmt.close(); } catch (Exception e) {}
69 }
70 if (pstmt !=null)
71 {
72 try { pstmt.close(); } catch (Exception e) {}
73 }
74 if (conn !=null)
75 {
76 try { conn.close(); } catch (Exception e) {}
77 }
78 }
79 }
80 }

MSSQLServer中呢,沒有這個(gè)實(shí)用的特性嗎,隨后的幾天自己開始注意了以下sql Server的架構(gòu),sql server號稱是以C/S模式架構(gòu),其實(shí)它的前身Sybase DataServer 才是C/S模式關(guān)系型的第一款數(shù)據(jù)庫。既然是C/S模式肯定就包含一個(gè)客戶端與數(shù)據(jù)庫段的交互過程,SQLServer在客戶端使用一種稱為TDS的協(xié)議來與服務(wù)器的Sqlserver服務(wù)器來進(jìn)行數(shù)據(jù)庫的交互,

TDS (Table Data Strem)

客戶端使用稱為表格格式數(shù)據(jù)流 (TDS) 的 SQL Server 專用應(yīng)用程序級協(xié)議來發(fā)送 SQL 語句。SQL Server 2000 接受 TDS 的下列版本

SQL Server 2000 的 SQL Server 客戶端組件版的客戶端發(fā)送的 TDS 8.0

SQL Server 7.0 版的 SQL Server 客戶端組件版的客戶端發(fā)送的 TDS 7.0

SQL Server 6.5、6.0 和 4.21a 中運(yùn)行 SQL Server 客戶端組件的客戶端所發(fā)送的 TDS 4.2

如圖表示

客戶段發(fā)送一條 select 之類的T-SQL語句,首先會進(jìn)過TDS使用ODS(output data strem)來包裝數(shù)據(jù)之后再發(fā)送到服務(wù)器端,在服務(wù)器端會有一個(gè)Net-librales的程序?qū)Ω鞣N網(wǎng)絡(luò)協(xié)議進(jìn)行監(jiān)聽,不管此時(shí)你使用的是tcp/ip還是什么其他的協(xié)議,Net-librales會根據(jù)連接近來的不同協(xié)議進(jìn)行分類,然后歸類集中監(jiān)聽、處理數(shù)據(jù).。

當(dāng)數(shù)據(jù)到達(dá)服務(wù)器端之后交由SQL引擎來處理,如下圖所表示,

在 SQL Server 7.0 中,絕大多數(shù)來自客戶機(jī)的功能調(diào)用都是通過 RPC(遠(yuǎn)程存貯過程控制) 消息進(jìn)行的(但這不是本文想說明的重點(diǎn)),通常,作為 TDS SQL 語言消息的 SQL 語句直接在編譯一端執(zhí)行,再經(jīng)過查詢優(yōu)化器進(jìn)行一定的優(yōu)化處理再將結(jié)果通過表達(dá)試服務(wù)返回給客戶機(jī),
在查詢優(yōu)化器中每編譯(優(yōu)化)一條T-SQL語句就會生成其對應(yīng)的執(zhí)行計(jì)劃就是我們常說的緩存。但是平常在客戶端提交上來的T-SQL 經(jīng)過TDS的包裝,即使2條T-SQL語句完全也不會生成完全相同的TDS格式的數(shù)據(jù)流,所以查詢優(yōu)化器編譯之后會認(rèn)為是2條不同的執(zhí)行計(jì)劃,所以每次都要去重新編譯再緩存,浪費(fèi)了不必要的時(shí)間。難道sqlserver真的做不到j(luò)dbc那樣批量提交的優(yōu)化功能嗎?
其實(shí)在Sqlserver中有一個(gè)sp_executesql系統(tǒng)存儲過程,通過使用它就能實(shí)現(xiàn)高效率的調(diào)用因?yàn)?font face="Times New Roman">:

  1. 因?yàn)樵?/font> sp_executesql 中,Transact-SQL 語句的實(shí)際文本在兩次執(zhí)行之間未改變,所以查詢優(yōu)化器應(yīng)該能將第二次執(zhí)行中的 Transact-SQL 語句與第一次執(zhí)行時(shí)生成的執(zhí)行計(jì)劃匹配。這樣,SQL Server 不必編譯第二條語句。
  2. Transact-SQL 字符串只生成一次。

整型參數(shù)按其本身格式指定。不需要轉(zhuǎn)換為 Unicode。

如果能和存貯過程結(jié)合起來一起使用在性能上能進(jìn)一步提供
比如
CREATETABLE May1998Sales
(OrderID INT PRIMARYKEY,
CustomerID INT NOTNULL,
OrderDate DATETIME NULL
CHECK (DATEPART(yy, OrderDate) =1998),
OrderMonth INT
CHECK (OrderMonth =5),
DeliveryDate DATETIME NULL,
CHECK (DATEPART(mm, OrderDate) = OrderMonth)
)

CREATEPROCEDURE InsertSales @PrmOrderIDINT, @PrmCustomerIDINT,
@PrmOrderDateDATETIME, @PrmDeliveryDateDATETIME
AS
DECLARE@InsertStringNVARCHAR(500)
DECLARE@OrderMonthINT

-- Build the INSERT statement.
SET@InsertString='INSERT INTO '+
/* Build the name of the table. */
SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
CAST(DATEPART(yy, @PrmOrderDate) ASCHAR(4) ) +
'Sales'+
/* Build a VALUES clause. */
' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,'+
' @InsOrdMonth, @InsDelDate)'

/* Set the value to use for the order month because
functions are not allowed in the sp_executesql parameter
list. */
SET@OrderMonth=DATEPART(mm, @PrmOrderDate)

EXEC sp_executesql @InsertString,
N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME,
@InsOrdMonth INT, @InsDelDate DATETIME',
@PrmOrderID, @PrmCustomerID, @PrmOrderDate,
@OrderMonth, @PrmDeliveryDate

GO
/*
在該過程中使用 sp_executesql 比使用 EXECUTE 執(zhí)行字符串更有效。使用 sp_executesql 時(shí),只生成 12 個(gè)版本的 INSERT 字符串,每個(gè)月的表 1 個(gè)。使用 EXECUTE 時(shí),因?yàn)閰?shù)值不同,每個(gè) INSERT 字符串均是唯一的。盡管兩種方法生成的批處理數(shù)相同,但因?yàn)?sp_executesql 生成的 INSERT 字符串相似,所以查詢優(yōu)化程序更有可能反復(fù)使用執(zhí)行計(jì)劃

*/

這時(shí)候我想起電影<霍元甲>中的一句話:我本以為,武術(shù)本無高低之分,只有練武的人才有高低之分.
呵呵 

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

小議SQLServer批量更新的優(yōu)化

小議SQLServer批量更新的優(yōu)化:聽全老大的 JDBC 課的時(shí)候,聽到一節(jié)是講在利用 JDBC 中處理批量更新oracle數(shù)據(jù)時(shí)候的特性,讓我很為 JDBC 的特性感的興奮,利用這個(gè)特性可以在批量更新數(shù)據(jù)的時(shí)候不同往常一樣每次都需要傳送完成的 SQL 語句到數(shù)據(jù)庫中。其中示范代碼如下 : 1 impo
推薦度:
標(biāo)簽: 批量 新的 sql
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美亚洲综合激情在线 | 激情一区二区三区成人 | 亚洲国语在线视频手机在线 | 午夜在线免费视频 | 精品国产96亚洲一区二区三区 | 欧美日韩精品一区二区在线播放 | 国产区视频在线 | 欧美色色图 | 成人a毛片一级 | 国内精品久久久久久久aa护士 | 精品久久亚洲一级α | 日韩精品一区二区三区 在线观看 | 欧美日韩综合 | 亚洲欧美日韩高清 | 国产日韩欧美精品 | 欧美日本国产 | 久久www免费人成_看片美女图 | 精品在线免费视频 | 日本韩国欧美一区 | 亚洲图片欧美在线 | 日韩精品1区 | 亚洲国产成人精品区 | 福利视频二区 | 国产欧美日韩一区二区三区在线 | 亚洲韩精品欧美一区二区三区 | 日韩欧美视频二区 | 精品国产亚一区二区三区 | 国产一区二区在线观看视频 | 日韩爱爱| 日韩欧美国产中文 | 国产成人麻豆精品 | 国产真实乱人偷精品 | 一区二区三区视频 | 国产精品欧美一区二区三区 | 在线亚洲欧国产精品专区 | 欧美不卡在线视频 | 一本色道久久88综合亚洲精品高清 | 欧美亚洲国产一区二区 | 国产欧美日韩另类 | 国产片一区二区三区 | 国产黄色免费看 |