sqlserver編譯
只編譯一次。
在發布存儲過程時就編譯一次,頁面上只要調用就可以,兩次打開就是調用兩次存儲過程
2. sqlserver
摘自:http://database.ctocio.com.cn/analysis/465/7709465.shtml
【IT專家網獨家】SQL Server用戶自定義函數和存儲過程有類似的功能,都可以創建捆綁SQL語句,存儲在server中供以後使用。這樣能夠極大地提高工作效率,通過以下的各種做法可以減少編程所需的時間:
重復使用編程代碼,減少編程開發時間。
隱藏SQL細節,把SQL繁瑣的工作留給資料庫開發人員,而程序開發員則集中處理高級編程語言。
維修集中化,可以在一個地方做業務上的邏輯修改,然後讓這些修改自動應用到所有相關程序中。
乍看之下,用戶自定義函數和存儲過程的功能似乎一摸一樣。但是,其實這兩者之間還有一些雖然細微但是很重要的差異:
存儲過程是使用EXEC命令獨立調用的,而用戶自定義函數是在另一個SQL語句中調用的。
l存儲程序是允許用戶和程序去使用存儲過程,而不是允許其存取表格,這樣能夠增強程序安全性。與標準的SQL Server相比,存儲程序限制用戶行動許可權方面更為細化。例如,如果你有一個貨存表格,每次賣出一個貨物收銀員都要對表格進行更新一次(從貨存中把該貨品減去一件)。你可以給收銀員設置許可權,允許其使用decrement_item存儲過程,而不是允許他們有任意修改或村表格的許可權。
函數必須始終返回一個值(一個標量值或一個表格)。而存儲過程可以返回一個標量值、一個表值或無需返回值。
總而言之,存儲程序對SQL Server開發員來說是最有價值的寶物之一,用於資料庫中,能夠大大的提高工作效率,增強安全性,絕對超值。
3. SQLServer資料庫收縮相關知識
SQL Server 資料庫採取預先分配空間的方法來建立資料庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁碟存儲空間的浪費。可以通過資料庫收縮技術對資料庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省伺服器的存儲的成本。
官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。
收縮後的資料庫不能小於資料庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。
比如:如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
不能在備份資料庫時收縮資料庫。 反之,也不能在資料庫執行收縮操作時備份資料庫。
介紹:收縮指定資料庫中的數據文件大小。
語法格式:
參數說明:
介紹:收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。
語法格式:
參數說明:
例如,如果創建一個10MB 的文件,然後在文件仍然為空的時候將文件收縮為2 MB,默認文件大小將設置為2 MB。這只適用於永遠不會包含數據的空文件。
另附SqlServer常見問題解答
1)管理器不會主動刷新,需要手工刷新一下才能看到最新狀態(性能方面的考慮)
2)很少情況下,恢復進程被掛起了。這個時候假設你要恢復並且回到可訪問狀態,要執行:
RESTORE database dbname with recovery
這使得恢復過程能完全結束。
3)如果你要不斷恢復後面的日誌文件,的確需要使資料庫處於「正在還原狀態」,
這通常是執行下面命令:
RESTORE database dbname with norecovery
原來SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。我們可以通過DBCC MemoryStatus來查看內存狀態。
SQL SERVER運行時會執行兩種緩存:
1. 數據緩存:執行個查詢語句,SQL SERVER會將相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。
可以調用以下幾個DBCC管理命令來清理這些緩存:
但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server並不會因此釋放掉已經佔用的內存。SQL SERVER並沒有提供任何命令允許我們釋放不用到的內存。因此我們只能通過動態調整SQL SERVER可用的物理內存設置來強迫它釋放內存。
解決SQLSERVER內存佔用過高的方法:
1、清除所有緩存DBCC DROPLEANBUFFERS
2、調整SQLSERVER可使用的最大伺服器內存。
在SQL管理器,右擊實例名稱
在屬性實例屬性裡面找到內存選項
把最大內存改成合適的內存,確定後內存就會被強制釋放,然後重啟實例。再看看任務管理器,內存使用率就降下來啦。
1、查看連接對象
USE master
GO
--如果要指定資料庫就把注釋去掉
SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'
當前連接對象有67個其中『WINAME』的主機名,『jTDS』的進程名不屬於已知常用軟體,找到這台主機並解決連接問題。在360流量防火牆中查看有哪個軟體連接了伺服器IP,除之。
2、然後使用下面語句看一下各項指標是否正常,是否有阻塞,正常情況下搜索結果應該為空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC
查看是哪些SQL語句佔用較大可以使用下面代碼
--在SSMS里選擇以文本格式顯示結果
SELECT TOP 10
dest.[text] AS 'sql語句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC
3、如果SQLSERVER存在要等待的資源,那麼執行下面語句就會顯示出會話中有多少個worker在等待
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
der.[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[dows].[waiting_tasks_count] AS '當前正在進行等待的任務數',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
INNER JOIN [sys].[dm_os_wait_stats] AS dows
ON der.[wait_type]=[dows].[wait_type]
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC;
4、查詢CPU佔用最高的SQL語句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC;
5、索引缺失查詢
SELECT
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
找到索引缺失的表,根據查詢結果中的關鍵次逐一建立索引。
4. SQLSERVER 什麼時候重新編譯執行計劃
根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,並將計劃標記為無效。此後,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:
對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
對執行計劃所使用的任何索引進行更改。
對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
刪除執行計劃所使用的索引。
顯式調用 sp_recompile。
對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
對於帶觸發器的表,插入的或刪除的表內的行數顯著增長。
使用 WITH RECOMPILE 選項執行存儲過程。
為了使語句正確,或要獲得可能更快的查詢執行計劃,大多數都需要進行重新編譯。
在 SQL Server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過存儲過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 SQL Server 2005 和更高版本中,只會重新編譯批處理中導致重新編譯的語句。由於這種差異,SQL Server 2000 和更高版本中的重新編譯計數不可比較。另外,由於 SQL Server 2005 和更高版本擴展了功能集,因此它們具有更多類型的重新編譯。
語句級重新編譯有助於提高性能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 CPU 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。
SQL Server ProfilerSP:Recompile 跟蹤事件報告語句級重新編譯。此跟蹤事件在 SQL Server 2000 中僅報告批處理重新編譯。此外,將填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必須跟蹤 SP:StmtStarting 或 SP:StmtCompleted 以獲取導致重新編譯的 Transact-SQL 文本的做法。
跟蹤事件 SQL:StmtRecompile 報告語句級重新編譯。此跟蹤事件可用於跟蹤和調試重新編譯。SP:Recompile 僅針對存儲過程和觸發器生成,而SQL:StmtRecompile 則針對存儲過程、觸發器、即席批查詢、使用 sp_executesql 執行的批處理、已准備的查詢和動態 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一個整數代碼,用以指明重新編譯的原因。
5. 璇曡堪宓屽叆寮廠QL璇璦浣跨敤瑕佽冭檻
宓屽叆寮廠QL紼嬪簭鐨刅C+SQL server 2000瀹炵幇鐨勭幆澧冮厤緗
宓屽叆SQL鐨凜搴旂敤紼嬪簭鍏蜂綋鍒癡C++6.0, SQL Server2000 涓嬭皟璇曞彲鍒嗕負浜旀ワ細1銆佺幆澧冨垵濮嬪寲;2銆侀勭紪璇;3銆佺紪璇;4銆佽繛鎺;5銆佽繍琛屻備笅闈㈠氨鍏朵腑閲嶈佺殑鐨勬搷浣滄柟娉曠粰浠ヨ︾粏璇存槑銆
1銆佺幆澧冨垵濮嬪寲
(1) SQL Server2000涓哄叾宓屽叆寮廠QL鎻愪緵浜嗕竴姝ょ壒孌婄殑鎺ュ彛錛涢粯璁ょ殑瀹夎呮柟寮忔病鏈夊畨瑁呰繖姝ゆ帴鍙o紱鍥犳わ紝闇瑕佹妸devtools.rar瑙e帇鍒癝QLServer鐨勭郴緇熸棩褰曚笅錛堝嵆鏂囦歡澶筪evtools涓鐨勬墍鏈夋枃浠訛級;濡傛灉鎿嶄綔緋葷粺瀹夎呭湪C鐩橈紝鍒橲QL Server鐨勭郴緇熺洰褰曟槸C:\Program Files\Microsoft SQL Server銆傦紙鎴 鍦ㄥ畨瑁匨icrosoft SQL Server 2000鏃墮夋嫨瀹夎匘evelopment Tools錛屼負浣跨敤宓屽叆寮廠QL璇璦鍑嗗囧繀瑕佺殑澶存枃浠跺拰搴撴枃浠躲傦級
( 2)鍒濆嬪寲Visual C++ 6.0緙栬瘧鍣ㄧ幆澧冦傚湪鍛戒護琛屾柟寮忎笅榪愯屾枃浠\Microsoft Visual Studio\VC98\Bin\vcvars32.bat銆
(3)鍒濆嬪寲SQL Server鐨勯勭紪璇戠幆澧冦傚湪鍛戒護琛屾柟寮忎笅榪愯屾枃浠:\Devtools\samples\esqlc\setenv.bat銆
( 4) VC++6.0鐜澧冮厤緗銆傚叿浣撻厤緗鍒嗕負濡備笅涓夋[錛
鈶燭ools->options->directories->Include Files:娣誨姞 C:\Program Files\Microsoft SQL Server\devtools\include銆傚皢SQL server鑷甯︾殑鐢ㄤ簬鏁版嵁搴撳紑鍙戠殑澶存枃浠跺寘鍚鍒板伐紼嬬幆澧冧腑銆
鈶Tools->options->directories->Lib Files:娣誨姞C:\Program Files\Microsoft SQL Server\devtools\x861ib銆傚皢寮鍙戠敤鍒扮殑鍖呭寘鍚鍒板伐紼嬩腑銆
鈶project->Settings->Link->Object/Library Moles錛屾坊鍔犲簱鏂囦歡:SQLakw32.lib錛 Caw32.lib銆傝繖涓や釜鏂囦歡涔嬮棿鐢ㄧ┖鏍煎垎寮銆
2銆侀勭紪璇
C璇璦緙栬瘧紼嬪簭涓嶈兘璇嗗埆搴旂敤紼嬪簭涓鐨凷QL璇鍙ワ紝闇瑕佺粡榪囬勫勭悊紼嬪簭灝嗗叾杞鎹㈡垚C璇鍙ャ係QL Server鐨勯勫勭悊紼嬪簭鏄痭sqlprep.exe銆 nsqlprep.exe鍦⊿QL Server瀹夎呮棩褰曠殑MSSQL\Binn涓嬨傝嫢SQL Server鏁版嵁搴撻噰鐢ㄧ殑鏄榛樹換瀹夎呮柟寮忥紝鍒欓渶瑕佹妸binn.rar鐨勫唴瀹規嫹璐濆埌鎸囧畾鐩褰曚笅銆
Microsoft SQL Server 2000鎻愪緵鐨勯勭紪璇戠▼搴弉sqlprep.exe錛岀敤浜庡瑰祵鍏ュ紡SQL紼嬪簭榪涜岄勭紪璇戝勭悊錛岀敓鎴怌璇璦婧愮▼搴.瀹為檯涓婂氨鏄灝嗗祵鍏ュ紡SQL紼嬪簭涓鐨勫祵鍏ュ紡SQL璇鍙ユ浛鎹涓哄硅繍琛屾椂搴撴枃浠禨qlakw32. dll鐨勫嚱鏁拌皟鐢錛屾帴鐫榪愯屾椂搴撴枃浠惰皟鐢ㄥ姩鎬佽繛鎺ュ簱Ntwdblib. dll閫氳繃緗戠粶鏉ュ瓨鍙朚icrosoft SQL Server 2000鏁版嵁搴撴湇鍔″櫒.