⑴ sqlServer怎麼創建任務來自動執行一連串SQL語句
第一步當然是打開我們的SQLServer軟體,打開之後,我們需要找到「SQL Server Agent」,如下圖中所示。
這個時候我們需要注意的是:如果在「SQL Server Agent」的圖表左邊我們看到一個紅色的小x,這個時候就說明我們需要「start」,具體位置如下圖。
完成第二步之後,我們就可以看到,之前的小x已經消失了,會轉變為如下圖所示的樣子。
現在我們就開始來創建一個「job」,具體步驟是點擊「job」,右鍵選擇「New job」。然後我們就會看到一個創建一個新的「job」的窗口,如下圖:這個我們創建一個名為「test2」的「job」。
取好名字之後,我們就點擊「steps」進入最重要的步驟:這里我們需要把我們想要執行的sql語句按步驟一步一步的填寫好,具體步驟是點擊「New」開始每一步sql的錄入。
這里筆者只添加一步用來演示給大家看,假設我們要執行的是:「select * from test where id=001」,如下圖所示操作。
設置完成所有步驟之後,我們可以給這個「job」自動化運行的時間,具體做法是點擊「scheles」->"New" 然後就會出現設置自動化運行的時間設置窗口,如果我們希望每個月的第一天運行這個「job」,就可以入下圖所示設置。
完成設置之後,點擊「確定」,然後刷新我們的資料庫,我們就可以看到「test2」已經創建完成。
⑵ 如何使用SSDT進行SQL資料庫的自動化部署到生產環境和版本控制
嗯問題解決資料庫先附加2014資料庫給創建腳本腳本放低版本資料庫進行創建行想單純降低能微軟具兼容性所能高兼低低兼高太實現
⑶ 如何在SQL中建立一個自動化任務
自動化任務直接可以在SQL中創建job
job有時間執行周期
所以可以設置執行起始時間,可以按天,按周,等等
假如按小時,那就選擇按天,設置多少小時執行一次
⑷ 怎麼開始學習sql2000
軟體入門與提高叢書——SQL Server 2000中文版入門與提高
http://book.jqcq.com/advanced_search_result.php?keywords=sql%202000
http://book.jqcq.com/proct/800530.html
本書針對Microsoft公司最新推出的大型關系資料庫管理系統SQL Server 2000編寫,循序漸進地介紹了從入門到深入掌握SQL Server 2000所需的各方面知識。內容包括SQL Server 2000的新特點;安裝、配置SQL Server 2000的方法;SQL Server 2000日常管理方法和技巧;Transact-SQL語言程序設計;存儲過程,觸發器等資料庫對象的設計方法和使用策略;SQL Server 2000分布式管理、自動管理和數據輿服務等高級應用;應用高級程序開發語言開發基於SQL Server 2000的應用程序;使用Web向導快速生成HTML頁面。
本書介紹了大量SQL Server的使用經驗,對使用中的重點、難點進行了專門的講解,是一本有效實用的入門指南。本書的提高部分,內容有一定深度,對有SQL Server使用基礎但希望進一步提高的讀者來說也有一定幫助。
目錄: 第1章 SQL Server 2000概述
1.1 SQL Server的發展簡史
1.2 SQL Server 2000的特點
1.3 SQL Server 2000的體系結構
1.4 SQL Server 2000的新特點
1.5 本章小結
第2章 關系資料庫基礎
2.1 關系資料庫的基本概念
2.2 SQL Server的資料庫對象
2.3 SQL和Transact-SQL
2.4 本章小結
第3章 安裝SQL Server 2000
3.1 SQL Server實例
3.2 安裝SQL Server 2000所需的軟硬體配置
3.3 安裝SQL Server 2000必須注意的若幹事項
3.4 遠程安裝SQL Server 2000
3.5 本地安裝SQL Server 2000軟體
3.6 升級到SQL Server 2000
3.7 企業管理器介紹
3.8 本章小結
第4章 SQL Server的系統組成
4.1 SQL Server 2000的系統資料庫
4.2 SQL Server 2000的系統表
4.3 SQL Server 2000的系統存儲過程
4.4 SQL Server 2000的示例資料庫
4.5 本章小結
第5章 SQL Server伺服器管理與使用
5.1 管理SQL Server伺服器組
5.2 SQL Server伺服器的連接和注冊
5.3 注冊SQL Server伺服器的注意事項
5.4 配置SQL Server伺服器
5.5 啟動和關閉SQL Server服務
5.6 本章小結
第6章 查詢分析器使用方法
6.1 登錄到伺服器
6.2 查詢分析器的菜單命令
6.3 配置查詢分析器
6.4 對象瀏覽器的使用
6.5 模板的使用
6.6 本章小結
第7章 SQL Server資料庫管理
7.1 文件和文件組
7.2 創建資料庫
7.3 查看資料庫的信息
7.4 管理資料庫
7.5 刪除SQL Server資料庫
7.6 資料庫的存儲結構
7.7 本章小結
第8章 SQL Server的命名規則
8.1 SQL Server的標識符
8.2 對象命名規則
8.3 關於實例的命名習慣
8.4 本章小結
第9章 表的管理和使用
9.1 創建表
9.2 刪除表格
9.3 修改表格定義
9.4 查看錶屬性
9.5 表格重命名
9.6 索引
9.7 本章小結
第10章 Transact-SQL查詢基礎
10.1 簡單的SELECT查詢
10.2 使用TOP關鍵字
10.3 使用DISTINCT關鍵字
10.4 使用計算列
10.5 操作查詢的列名
10.6 使用WHERE子句
10.7 使用LIKE子句進行模糊查詢
10.8 使用ORDER BY給數據排序
10.9 本章小結
第11章 編輯維護表格數據
11.1 使用INSERT添加表格數據
11.2 使用RPDATE實現數據的修改
11.3 使用DELETE刪除表中數據
11.4 使用TRUNCATE TABLE清空表格
11.5 使用企業管理器管理表格數據
11.6 本章小結
第12章 視圖
12.1 視圖的優點
12.2 視圖的創建與刪除
12.3 修改視圖的定義
12.4 瀏覽視圖信息
12.5 使用視圖來簡化查詢
12.6 在視圖上使用INSERT語句
12.7 使用UPDATE更新視圖中的數據
12.8 刪除視圖中的數據
12.9 WITH CHECK OPTION的視圖
12.10 對視圖進行加密
12.11 使用視圖加強數據安全
12.12 本章小結
第13章 SQL Server的數據類型
13.1 3種新的數據類型
13.2 整數數據類型
13.3 貨幣數據類型
13.4 數字數據類型
13.5 浮點數據類型
13.6 日期/時間數據類型
13.7 字元數據類型
13.8 二進制數據類型
13.9 統一碼數據類型
13.10 圖像、文本數據的使用
13.11 sql_variant數據類型及使用
13.12 table數據類型及使用
13.13 用戶自定義數據類型及使用
13.14 本章小結
第14章 Transact-SQL高級查詢
14.1 多表查詢和笛卡兒乘積
14.2 使用表格別名
14.3 使用UNION子句
14.4 使用統計函數
14.5 使用GROUP BY子句
14.6 使用COMPUTE和COMPUTE BY子句
14.7 使用嵌套查詢
14.8 本章小結
第15章 設計數據完整性
15.1 數據完整性基礎
15.2 使用約束實施數據完整性
15.3 使用規則
15.4 使用默認值
15.5 使用IDENTITY列
15.6 本章小結
第16章 SQL Server編程結構
16.1 程序注釋語句
16.2 批處理
16.3 局部變數
16.4 全局變數
16.5 IF…ELSE條件判斷結構
16.6 BEGIN…END語句塊
16.7 WHILE循壞結構
16.8 CASE
16.9 RETURN
16.10 游標
16.11 事務
16.12 本章小結
第17章 SQL Server函數
17.1 SQL Server的數學函數
17.2 SQL Server的字元串函數
17.3 SQL Server的日期函數
17.4 SQL Server的系統函數
17.5 其他常用函數
17.6 設置查詢屬性
17.7 用戶自定義函數
17.8 本章小結
第18章 存儲過程與觸發器
18.1 存儲過程概述
18.2 存儲過程的使用和管理
18.3 觸發器概述
18.4 觸發器使用與管理
18.5 觸發器的特殊功能
18.6 利用存儲過程和觸發器維護數據完整性
18.7 本章小結
第19章 管理SQL Server的安全性
19.1 SQL Server的安全性機制
19.2 SQL Server標准登錄模式
19.3 SQL Server集成登錄模式
19.4 使用企業管理器建立登錄賬戶
19.5 SQL Server資料庫安全性
19.6 角色
19.7 許可權
19.8 本章小結
第20章 備份與恢復
20.1 資料庫備份概念
20.2 資料庫備份策略與規劃
20.3 執行數據備份與恢復
20.4 本章小結
第21章 SQL Server的數據傳輸服務
21.1 DTS概述
21.2 數據轉換服務導入向導和數據轉換服務導出向導
21.3 使用DTS設計器
21.4 本章小結
第22章 SQL Server自動化管理
22.1 SQL Server自動化管理基礎
22.2 使用SQL郵件
22.3 創建操作員
22.4 設置警報
22.5 創建作業
22.6 本章小結
第23章 SQL Server分布式數據管理
23.1 復制技術概述
23.2 配置出版伺服器
23.3 創建出版物
23.4 設計訂閱
23.5 本章小結
第24章 通過Web助手發布數據
24.1 SQL Server與Web頁的交互
24.2 使用SQL Server Web助手建立Web頁
24.3 本章小結
第25章 SQL Server 2000應用編程
25.1 SQL Server 2000應用編程概述
25.2 ADO概述
25.3 SQL Server 2000與ADO編程舉例
25.4 SQL-DMO概述
25.5 使用SQL-DMO對象
25.6 SQL-DMO應用舉例
25.7 本章小結
你得採納啊!
⑸ 如何在自動化腳本中寫SQL語句
在MS SQL SERVER 中:
打開查詢分析器,選擇資料庫,在腳本編輯窗口中輸入SQL語句,點擊保存,即可將擴展名為SQL的腳本文件存入磁碟(默認我的文檔或選擇的文件夾)中。
⑹ SQL如何快速處理海量數據
在以下的文章中,我將以「辦公自動化」系統為例,探討如何在有著1000萬條數據的MS SQL SERVER資料庫中實現快速的數據提取和數據分頁。以下代碼說明了我們實例中資料庫的「紅頭文件」一表的部分數據結構:
CREATE TABLE [dbo].[TGongwen] ( --TGongwen是紅頭文件表名
[Gid] [int] IDENTITY (1, 1) NOT NULL ,
--本表的id號,也是主鍵
[title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
--紅頭文件的標題
[fariqi] [datetime] NULL ,
--發布日期
[neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
--發布用戶
[reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,
--需要瀏覽的用戶。每個用戶中間用分隔符「,」分開
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
下面,我們來往資料庫中添加1000萬條數據:
declare @i int
set @i=1
while @i<=250000
begin
insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,辦公室,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,治安支隊,外事科','這是最先的25萬條記錄')
set @i=@i+1
end
GO
declare @i int
set @i=1
while @i<=250000
begin
insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','辦公室','辦公室,通信科,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,外事科','這是中間的25萬條記錄')
set @i=@i+1
end
GO
declare @h int
set @h=1
while @h<=100
begin
declare @i int
set @i=2002
while @i<=2003
begin
declare @j int
set @j=0
while @j<50
begin
declare @k int
set @k=0
while @k<50
begin
insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','辦公室,通信科,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,外事科','這是最後的50萬條記錄')
set @k=@k+1
end
set @j=@j+1
end
set @i=@i+1
end
set @h=@h+1
end
GO
declare @i int
set @i=1
while @i<=9000000
begin
insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,辦公室,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,治安支隊,外事科','這是最後添加的900萬條記錄')
set @i=@i+1000000
end
GO
通過以上語句,我們創建了25萬條由通信科於2004年2月5日發布的記錄,25萬條由辦公室於2004年9月6日發布的記錄,2002年和2003年各100個2500條相同日期、不同分秒的由通信科發布的記錄(共50萬條),還有由通信科於2004年5月5日發布的900萬條記錄,合計1000萬條。
一、因情制宜,建立「適當」的索引
建立「適當」的索引是實現查詢優化的首要前提。
索引(index)是除表之外另一重要的、用戶定義的存儲在物理介質上的數據結構。當根據索引碼的值搜索數據時,索引提供了對數據的快速訪問。事實上,沒有索引,資料庫也能根據SELECT語句成功地檢索到結果,但隨著表變得越來越大,使用「適當」的索引的效果就越來越明顯。注意,在這句話中,我們用了「適當」這個詞,這是因為,如果使用索引時不認真考慮其實現過程,索引既可以提高也會破壞資料庫的工作性能。
(一)深入淺出理解索引結構
實際上,您可以把索引理解為一種特殊的目錄。微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區別:
其實,我們的漢語字典的正文本身就是一個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文字母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。
我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。
我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。
通過以上例子,我們可以理解到什麼是「聚集索引」和「非聚集索引」。
進一步引申一下,我們可以很容易的理解:每個表只能有一個聚集索引,因為目錄只能按照一種方法進行排序。
(二)何時使用聚集索引或非聚集索引
下面的表總結了何時使用聚集索引或非聚集索引(很重要)。
動作描述
使用聚集索引
使用非聚集索引
列經常被分組排序
應
應
返回某范圍內的數據
應
不應
一個或極少不同值
不應
不應
小數目的不同值
應
不應
大數目的不同值
不應
應
頻繁更新的列
不應
應
外鍵列
應
應
主鍵列
應
應
頻繁修改索引列
不應
應
事實上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某范圍內的數據一項。比如您的某個表有一個時間列,恰好您把聚合索引建立在了該列,這時您查詢2004年1月1日至2004年10月1日之間的全部數據時,這個速度就將是很快的,因為您的這本字典正文是按日期進行排序的,聚類索引只需要找到要檢索的所有數據中的開頭和結尾數據即可;而不像非聚集索引,必須先查到目錄中查到每一項數據對應的頁碼,然後再根據頁碼查到具體內容。
(三)結合實際,談索引使用的誤區
理論的目的是應用。雖然我們剛才列出了何時應使用聚集索引或非聚集索引,但在實踐中以上規則卻很容易被忽視或不能根據實際情況進行綜合分析。下面我們將根據在實踐中遇到的實際問題來談一下索引使用的誤區,以便於大家掌握索引建立的方法。
1、主鍵就是聚集索引
這種想法筆者認為是極端錯誤的,是對聚集索引的一種浪費。雖然SQL SERVER默認是在主鍵上建立聚集索引的。
通常,我們會在每個表中都建立一個ID列,以區分每條數據,並且這個ID列是自動增大的,步長一般為1。我們的這個辦公自動化的實例中的列Gid就是如此。此時,如果我們將這個列設為主鍵,SQL SERVER會將此列默認為聚集索引。這樣做有好處,就是可以讓您的數據在資料庫中按照ID進行物理排序,但筆者認為這樣做意義不大。
顯而易見,聚集索引的優勢是很明顯的,而每個表中只能有一個聚集索引的規則,這使得聚集索引變得更加珍貴。
從我們前面談到的聚集索引的定義我們可以看出,使用聚集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢范圍,避免全表掃描。在實際應用中,因為ID號是自動生成的,我們並不知道每條記錄的ID號,所以我們很難在實踐中用ID號來進行查詢。這就使讓ID號這個主鍵作為聚集索引成為一種資源浪費。其次,讓每個ID號都不同的欄位作為聚集索引也不符合「大數目的不同值情況下不應建立聚合索引」規則;當然,這種情況只是針對用戶經常修改記錄內容,特別是索引項的時候會負作用,但對於查詢速度並沒有影響。
在辦公自動化系統中,無論是系統首頁顯示的需要用戶簽收的文件、會議還是用戶進行文件查詢等任何情況下進行數據查詢都離不開欄位的是「日期」還有用戶本身的「用戶名」。
通常,辦公自動化的首頁會顯示每個用戶尚未簽收的文件或會議。雖然我們的where語句可以僅僅限制當前用戶尚未簽收的情況,但如果您的系統已建立了很長時間,並且數據量很大,那麼,每次每個用戶打開首頁的時候都進行一次全表掃描,這樣做意義是不大的,絕大多數的用戶1個月前的文件都已經瀏覽過了,這樣做只能徒增資料庫的開銷而已。事實上,我們完全可以讓用戶打開系統首頁時,資料庫僅僅查詢這個用戶近3個月來未閱覽的文件,通過「日期」這個欄位來限製表掃描,提高查詢速度。如果您的辦公自動化系統已經建立的2年,那麼您的首頁顯示速度理論上將是原來速度8倍,甚至更快。
在這里之所以提到「理論上」三字,是因為如果您的聚集索引還是盲目地建在ID這個主鍵上時,您的查詢速度是沒有這么高的,即使您在「日期」這個欄位上建立的索引(非聚合索引)。下面我們就來看一下在1000萬條數據量的情況下各種查詢的速度表現(3個月內的數據為25萬條):
(1)僅在主鍵上建立聚集索引,並且不劃分時間段:
Select gid,fariqi,neibuyonghu,title from tgongwen
用時:128470毫秒(即:128秒)
(2)在主鍵上建立聚集索引,在fariq上建立非聚集索引:
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
用時:53763毫秒(54秒)
(3)將聚合索引建立在日期列(fariqi)上:
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
用時:2423毫秒(2秒)
雖然每條語句提取出來的都是25萬條數據,各種情況的差異卻是巨大的,特別是將聚集索引建立在日期列時的差異。事實上,如果您的資料庫真的有1000萬容量的話,把主鍵建立在ID列上,就像以上的第1、2種情況,在網頁上的表現就是超時,根本就無法顯示。這也是我摒棄ID列作為聚集索引的一個最重要的因素。
得出以上速度的方法是:在各個select語句前加:declare @d datetime
set @d=getdate()
並在select語句後加:
select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())
2、只要建立索引就能顯著提高查詢速度
事實上,我們可以發現上面的例子中,第2、3條語句完全相同,且建立索引的欄位也相同;不同的僅是前者在fariqi欄位上建立的是非聚合索引,後者在此欄位上建立的是聚合索引,但查詢速度卻有著天壤之別。所以,並非是在任何欄位上簡單地建立索引就能提高查詢速度。
從建表的語句中,我們可以看到這個有著1000萬數據的表中fariqi欄位有5003個不同記錄。在此欄位上建立聚合索引是再合適不過了。在現實中,我們每天都會發幾個文件,這幾個文件的發文日期就相同,這完全符合建立聚集索引要求的:「既不能絕大多數都相同,又不能只有極少數相同」的規則。由此看來,我們建立「適當」的聚合索引對於我們提高查詢速度是非常重要的。
3、把所有需要提高查詢速度的欄位都加進聚集索引,以提高查詢速度
上面已經談到:在進行數據查詢時都離不開欄位的是「日期」還有用戶本身的「用戶名」。既然這兩個欄位都是如此的重要,我們可以把他們合並起來,建立一個復合索引(compound index)。
很多人認為只要把任何欄位加進聚集索引,就能提高查詢速度,也有人感到迷惑:如果把復合的聚集索引欄位分開查詢,那麼查詢速度會減慢嗎?帶著這個問題,我們來看一下以下的查詢速度(結果集都是25萬條數據):(日期列fariqi首先排在復合聚集索引的起始列,用戶名neibuyonghu排在後列)
(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'
查詢速度:2513毫秒
(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='辦公室'
查詢速度:2516毫秒
(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='辦公室'
查詢速度:60280毫秒
從以上試驗中,我們可以看到如果僅用聚集索引的起始列作為查詢條件和同時用到復合聚集索引的全部列的查詢速度是幾乎一樣的,甚至比用上全部的復合索引列還要略快(在查詢結果集數目一樣的情況下);而如果僅用復合聚集索引的非起始列作為查詢條件的話,這個索引是不起任何作用的。當然,語句1、2的查詢速度一樣是因為查詢的條目數一樣,如果復合索引的所有列都用上,而且查詢結果少的話,這樣就會形成「索引覆蓋」,因而性能可以達到最優。同時,請記住:無論您是否經常使用聚合索引的其他列,但其前導列一定要是使用最頻繁的列。
(四)其他書上沒有的索引使用經驗總結
1、用聚合索引比用不是聚合索引的主鍵速度快
下面是實例語句:(都是提取25萬條數據)
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'
使用時間:3326毫秒
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000
使用時間:4470毫秒
這里,用聚合索引比用不是聚合索引的主鍵速度快了近1/4。
2、用聚合索引比用一般的主鍵作order by時速度快,特別是在小數據量情況下
select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi
用時:12936
select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid
用時:18843
這里,用聚合索引比用一般的主鍵作order by時,速度快了3/10。事實上,如果數據量很小的話,用聚集索引作為排序列要比使用非聚集索引速度快得明顯的多;而數據量如果很大的話,如10萬以上,則二者的速度差別不明顯。
3、使用聚合索引內的時間段,搜索時間會按數據占整個數據表的百分比成比例減少,而無論聚合索引使用了多少個
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1'
用時:6343毫秒(提取100萬條)
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-6-6'
用時:3170毫秒(提取50萬條)
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'
用時:3326毫秒(和上句的結果一模一樣。如果採集的數量一樣,那麼用大於號和等於號是一樣的)
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' and fariqi<'2004-6-6'
用時:3280毫秒
4 、日期列不會因為有分秒的輸入而減慢查詢速度
下面的例子中,共有100萬條數據,2004年1月1日以後的數據有50萬條,但只有兩個不同的日期,日期精確到日;之前有數據50萬條,有5000個不同的日期,日期精確到秒。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' order by fariqi
用時:6390毫秒
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi<'2004-1-1' order by fariqi
用時:6453毫秒
(五)其他注意事項
「水可載舟,亦可覆舟」,索引也一樣。索引有助於提高檢索性能,但過多或不當的索引也會導致系統低效。因為用戶在表中每加進一個索引,資料庫就要做更多的工作。過多的索引甚至會導致索引碎片。
所以說,我們要建立一個「適當」的索引體系,特別是對聚合索引的創建,更應精益求精,以使您的資料庫能得到高性能的發揮。
當然,在實踐中,作為一個盡職的資料庫管理員,您還要多測試一些方案,找出哪種方案效率最高、最為有效。
二、改善SQL語句
很多人不知道SQL語句在SQL SERVER中是如何執行的,他們擔心自己所寫的SQL語句會被SQL SERVER誤解。比如:
select * from table1 where name='zhangsan' and tID > 10000
和執行:
select * from table1 where tID > 10000 and name='zhangsan'
一些人不知道以上兩條語句的執行效率是否一樣,因為如果簡單的從語句先後上看,這兩個語句的確是不一樣,如果tID是一個聚合索引,那麼後一句僅僅從表的10000條以後的記錄中查找就行了;而前一句則要先從全表中查找看有幾個name='zhangsan'的,而後再根據限制條件條件tID>10000來提出查詢結果。
事實上,這樣的擔心是不必要的。SQL SERVER中有一個「查詢分析優化器」,它可以計算出where子句中的搜索條件並確定哪個索引能縮小表掃描的搜索空間,也就是說,它能實現自動優化。
雖然查詢優化器可以根據where子句自動的進行查詢優化,但大家仍然有必要了解一下「查詢優化器」的工作原理,如非這樣,有時查詢優化器就會不按照您的本意進行快速查詢。
在查詢分析階段,查詢優化器查看查詢的每個階段並決定限制需要掃描的數據量是否有用。如果一個階段可以被用作一個掃描參數(SARG),那麼就稱之為可優化的,並且可以利用索引快速獲得所需數據。
SARG的定義:用於限制搜索的一個操作,因為它通常是指一個特定的匹配,一個值得范圍內的匹配或者兩個以上條件的AND連接。形式如下:
列名 操作符 <常數 或 變數>
或
<常數 或 變數> 操作符列名
列名可以出現在操作符的一邊,而常數或變數出現在操作符的另一邊。如:
Name=』張三』
價格>5000
5000<價格
Name=』張三』 and 價格>5000
如果一個表達式不能滿足SARG的形式,那它就無法限制搜索的范圍了,也就是SQL SERVER必須對每一行都判斷它是否滿足WHERE子句中的所有條件。所以一個索引對於不滿足SARG形式的表達式來說是無用的。
介紹完SARG後,我們來總結一下使用SARG以及在實踐中遇到的和某些資料上結論不同的經驗:
1、Like語句是否屬於SARG取決於所使用的通配符的類型
如:name like 『張%』 ,這就屬於SARG
而:name like 『%張』 ,就不屬於SARG。
原因是通配符%在字元串的開通使得索引無法使用。
2、or 會引起全表掃描
Name=』張三』 and 價格>5000 符號SARG,而:Name=』張三』 or 價格>5000 則不符合SARG。使用or會引起全表掃描。
3、非操作符、函數引起的不滿足SARG形式的語句
不滿足SARG形式的語句最典型的情況就是包括非操作符的語句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外還有函數。下面就是幾個不滿足SARG形式的例子:
ABS(價格)<5000
Name like 『%三』
有些表達式,如:
WHERE 價格*2>5000
SQL SERVER也會認為是SARG,SQL SERVER會將此式轉化為:
WHERE 價格>2500/2
但我們不推薦這樣使用,因為有時SQL SERVER不能保證這種轉化與原始表達式是完全等價的。
4、IN 的作用相當與OR
語句:
Select * from table1 where tid in (2,3)
和
Select * from table1 where tid=2 or tid=3
是一樣的,都會引起全表掃描,如果tid上有索引,其索引也會失效。
5、盡量少用NOT
6、exists 和 in 的執行效率是一樣的
很多資料上都顯示說,exists要比in的執行效率要高,同時應盡可能的用not exists來代替not in。但事實上,我試驗了一下,發現二者無論是前面帶不帶not,二者之間的執行效率都是一樣的。因為涉及子查詢,我們試驗這次用SQL SERVER自帶的pubs資料庫。運行前我們可以把SQL SERVER的statistics I/O狀態打開。
(1)select title,price from titles where title_id in (select title_id from sales where qty>30)
該句的執行結果為:
表 'sales'。掃描計數 18,邏輯讀 56 次,物理讀 0 次,預讀 0 次。
表 'titles'。掃描計數 1,邏輯讀 2 次,物理讀 0 次,預讀 0 次。
(2)select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)
第二句的執行結果為:
表 'sales'。掃描計數 18,邏輯讀 56 次,物理讀 0 次,預讀 0 次。
表 'titles'。掃描計數 1,邏輯讀 2 次,物理讀 0 次,預讀 0 次。
我們從此可以看到用exists和用in的執行效率是一樣的。
7、用函數charindex()和前面加通配符%的LIKE執行效率一樣
前面,我們談到,如果在LIKE前面加上通配符%,那麼將會引起全表掃描,所以其執行效率是低下的。但有的資料介紹說,用函數charindex()來代替LIKE速度會有大的提升,經我試驗,發現這種說明也是錯誤的:
select gid,title,fariqi,reader from tgongwen where charindex('刑偵支隊',reader)>0 and fariqi>'2004-5-5'
用時:7秒,另外:掃描計數 4,邏輯讀 7155 次,物理讀 0 次,預讀 0 次。
select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑偵支隊' + '%' and fariqi>'2004-5-5'
用時:7秒,另外:掃描計數 4,邏輯讀 7155 次,物理讀 0 次,預讀 0 次。
8、union並不絕對比or的執行效率高
我們前面已經談到了在where子句中使用or會引起全表掃描,一般的,我所見過的資料都是推薦這里用union來代替or。事實證明,這種說法對於大部分都是適用的。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid>9990000
用時:68秒。掃描計數 1,邏輯讀 404008 次,物理讀 283 次,預讀 392163 次。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000
用時:9秒。掃描計數 8,邏輯讀 67489 次,物理讀 216 次,預讀 7499 次。
看來,用union在通常情況下比用or的效率要高的多。
但經過試驗,筆者發現如果or兩邊的查詢列是一樣的話,那麼用union則反倒和用or的執行速度差很多,雖然這里union掃描的是索引,而or掃描的是全表。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'
用時:6423毫秒。掃描計數 2,邏輯讀 14726 次,物理讀 1 次,預讀 7176 次。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-2-5'
用時:11640毫秒。掃描計數 8,邏輯讀 14806 次,物理讀 108 次,預讀 1144 次。
9、欄位提取要按照「需多少、提多少」的原則,避免「select *」
我們來做一個試驗:
select top 10000 gid,fariqi,reader,title from tgongwen ord
⑺ 初學SQL資料庫新手入門急急急!!!
先建表
create table table_name
(列名1 字元串類型 約束,
列名2 字元串類型 約束,
列名3 字元串類型 約束)
字元串類型一般為 number()、varchar()、date、int、、、
約束常見的:
主鍵約束Primary Key,非空約束 not null,唯一約束unique,檢查約束check
插入數據
insert table table_name values(列1數值,列2數值,.....)
例:
create table WYB(
times date,
age varchar2(2),
act varchar2(4000),
address varchar2(1000),
MTP varchar2(1000),
song varchar2(1000) )
insert into WYB(times,age,address,act) values(to_date('1997/08/05','yyyy/mm/dd'),1,'洛陽','出生啦')
insert into WYB(times,age,act) values(to_date('2011','yyyy'),13,'參加了全國IBD頂尖街舞大賽,Hiphop組進入16強,從而被樂華娛樂發掘成為練習生')
insert into WYB(times,age,act) values(to_date('2014/10/16','yyyy/mm/dd'),17,'組合登陸韓國節目《M!Countdown》作為首次放送舞台,正式開始韓國的宣傳活動')
insert into WYB(times,age,act) values(to_date('2014/10/20','yyyy/mm/dd'),17,'組合首支單曲《Falling In Love》中韓雙版公開')
insert into WYB(times,age,act,song) values(to_date('2014/10/20','yyyy/mm/dd'),17,'組合首支單曲《Falling In Love》中韓雙版公開','《Falling In Love》')
insert into WYB(times,age,act,song) values(to_date('2014/11/7','yyyy/mm/dd'),17,'組合為美國動畫電影《馬達加斯加的企鵝》演唱中文主題曲《Celebrate》','《Celebrate》')
⑻ 自動化 sql注入 工具怎麼寫
Sql注入測試一定要使用工具。原因一:工作效率;原因二:人工很難構造出覆蓋面廣的盲注入的sql語句。例如當一個查詢的where字句包含了多個參數,or and的關系比較多時,簡單的or 1=1, and 1=2是很難發現注入點的。
Sql注入的工具很多(Top 15 free SQL Injection Scanners),我最近使用的有Sqlmap,SqliX,JbroFuzz,Sql Power Injector, 網站啄木鳥.現將他們的使用方法和比較結果貼於此:
Sqlmap是python開發的SQL注入漏洞測試工具。沒有UI界面的命令行工具。雖說是命令行工具,可他的使用比網站啄木鳥,Sql Power injector 容易多了,並且有很詳細的幫助文檔。從下面2個地址獲得相關程序包: