婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQLSERVER SQL性能優化技巧

SQLSERVER SQL性能優化技巧

熱門標簽:樂昌電話機器人 地圖標注跑線下市場 疫情時期電話機器人 南京怎么申請400這種電話 濮陽清豐400開頭的電話申請 地圖標注可以編輯地名嗎 臺灣外呼系統軟件 南通智能外呼系統怎么樣 真3地圖標注

1.選擇最有效率的表名順序(只在基于規則的優化器中有效)

SQLSERVER的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表driving table)將被最先處理,在FROM子句中包含多個表的情況下,必須選擇記錄條數最少的表作為基礎表,當SQLSERVER處理多個表時,會運用排序及合并的方式連接它們,

首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進行排序;然后掃描第二個表(FROM子句中最后第二個表);最后將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并
例如: 表 TAB1 16,384 條記錄表 TAB2 5 條記錄,選擇TAB2作為基礎表 (最好的方法) select count(*) from tab1,tab2 執行時間0.96秒,選擇TAB2作為基礎表 (不佳的方法) select count(*) from tab2,tab1 執行時間26.09秒;

如果有3個以上的表連接查詢,那就需要選擇交叉表(intersection table)作為基礎表,交叉表是指那個被其他表所引用的表

例如:

EMP表描述了LOCATION表和CATEGORY表的交集

SELECT * 
FROM LOCATION L, 
CATEGORY C, 
EMP E 
WHERE E.EMP_NO BETWEEN 1000 AND 2000 
AND E.CAT_NO = C.CAT_NO 
AND E.LOCN = L.LOCN 

將比下列SQL更有效率

SELECT * 
FROM EMP E , 
LOCATION L , 
CATEGORY C 
WHERE E.CAT_NO = C.CAT_NO 
AND E.LOCN = L.LOCN 
AND E.EMP_NO BETWEEN 1000 AND 2000 

2.WHERE子句中的連接順序

SQLSERVER采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾
例如:
(低效,執行時間156.3秒)

SELECT * 
FROM EMP E 
WHERE SAL > 50000 
AND JOB = 'MANAGER' 
AND 25  (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO); 
(高效,執行時間10.6秒) 
SELECT * 
FROM EMP E 
WHERE 25  (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) 
AND SAL > 50000 
AND JOB = 'MANAGER'; 

3.SELECT子句中避免使用'*'。當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用'*'是一個方便的方法,不幸的是,這是一個非常低效的方法。實際上,SQLSERVER在解析的過程中,會將'*'依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味著將耗費更多的時間


4.減少訪問數據庫的次數。當執行每條SQL語句時,SQLSERVER在內部執行了許多工作:解析SQL語句,估算索引的利用率,綁定變量,讀數據塊等等
由此可見,減少訪問數據庫的次數,就能實際上減少SQLSERVER的工作量,例如:
以下有三種方法可以檢索出雇員號等于0342或0291的職員
方法1 (最低效)

SELECT EMP_NAME, SALARY, GRADE 
FROM EMP 
WHERE EMP_NO = 342;  
SELECT EMP_NAME, SALARY, GRADE 
FROM EMP 
WHERE EMP_NO = 291; 

方法2 (次低效)

DECLARE 
CURSOR C1 (E_NO NUMBER) IS 
SELECT EMP_NAME,SALARY,GRADE 
FROM EMP 
WHERE EMP_NO = E_NO; 
BEGIN 
OPEN C1(342); 
FETCH C1 INTO …,…,…; 
… 
OPEN C1(291); 
FETCH C1 INTO …,…,…; 
… 
CLOSE C1; 
END; 

方法2 (高效)

SELECT A.EMP_NAME, A.SALARY, A.GRADE, 
B.EMP_NAME, B.SALARY, B.GRADE 
FROM EMP A, EMP B 
WHERE A.EMP_NO = 342 
AND B.EMP_NO = 291; 

5.使用DECODE函數來減少處理時間

使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表

例如:

SELECT COUNT(*), SUM(SAL) 
FROM EMP 
WHERE DEPT_NO = '0020' 
AND ENAME LIKE 'SMITH%'; 
 
SELECT COUNT(*), SUM(SAL) 
FROM EMP 
WHERE DEPT_NO = '0030' 
AND ENAME LIKE 'SMITH%'; 

你可以用DECODE函數高效地得到相同結果

SELECT COUNT(DECODE(DEPT_NO, '0020', 'X', NULL)) D0020_COUNT, 
COUNT(DECODE(DEPT_NO, '0030', 'X', NULL)) D0030_COUNT, 
SUM(DECODE(DEPT_NO, '0020', SAL, NULL)) D0020_SAL, 
SUM(DECODE(DEPT_NO, 0030, SAL, NULL)) D0030_SAL 
FROM EMP 
WHERE ENAME LIKE 'SMITH%'; 

'X'表示任何一個字段
類似的,DECODE函數也可以運用于GROUP BY和ORDER BY子句中

6.用Where子句替換HAVING子句

避免使用HAVING子句,HAVING只會在檢索出所有記錄之后才對結果集進行過濾,這個處理需要排序、統計等操作

如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷

例如:
低效

SELECT REGION, AVG(LOG_SIZE) 
FROM LOCATION 
GROUP BY REGION 
HAVING REGION REGION != 'SYDNEY' 
AND REGION != 'PERTH' 
 
高效 
SELECT REGION, AVG(LOG_SIZE) 
FROM LOCATION 
WHERE REGION REGION != 'SYDNEY' 
AND REGION != 'PERTH' 
GROUP BY REGION 

7.減少對表的查詢

在含有子查詢的SQL語句中,要特別注意減少對表的查詢
例如:

低效 
SELECT TAB_NAME 
FROM TABLES 
WHERE TAB_NAME = (SELECT TAB_NAME 
FROM TAB_COLUMNS 
WHERE VERSION = 604) 
AND DB_VER = (SELECT DB_VER 
FROM TAB_COLUMNS 
WHERE VERSION = 604) 
 
高效 
SELECT TAB_NAME 
FROM TABLES 
WHERE (TAB_NAME, DB_VER) = (SELECT TAB_NAME, DB_VER 
FROM TAB_COLUMNS 
WHERE VERSION = 604) 

Update多個Column例子:

低效 
UPDATE EMP 
SET EMP_CAT = (SELECT MAX(CATEGORY) 
FROM EMP_CATEGORIES), 
SAL_RANGE = (SELECT MAX(SAL_RANGE) 
FROM EMP_CATEGORIES) 
WHERE EMP_DEPT = 0020; 
 
高效 
UPDATE EMP 
SET (EMP_CAT, SAL_RANGE) = (SELECT MAX(CATEGORY), MAX(SAL_RANGE) 
FROM EMP_CATEGORIES) 
WHERE EMP_DEPT = 0020; 

8.使用表的別名(Alias),當在SQL語句中連接多個表時,請使用表的別名并把別名前綴于每個Column上,這樣可以減少解析的時間并減少那些由Column歧義引起的語法錯誤

9.用EXISTS替代IN

在許多基于基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接

在這種情況下,使用EXISTS(或NOT EXISTS)通常將提高查詢的效率

低效 
SELECT * 
FROM EMP (基礎表) 
WHERE EMPNO > 0 
AND DEPTNO IN (SELECT DEPTNO 
FROM DEPT 
WHERE LOC = 'MELB') 
 
高效 
SELECT * 
FROM EMP (基礎表) 
WHERE EMPNO > 0 
AND EXISTS (SELECT 'X' 
FROM DEPT 
WHERE DEPT.DEPTNO = EMP.DEPTNO 
AND LOC = 'MELB') 

10.用NOT EXISTS替代NOT IN

在子查詢中,NOT IN子句將執行一個內部的排序和合并

無論在哪種情況下,NOT IN都是最低效的,因為它對子查詢中的表執行了一個全表遍歷

為了避免使用NOT IN,我們可以把它改寫成外連接(Outer Joins)或NOT EXISTS

例如:

SELECT … 
FROM EMP 
WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
FROM DEPT 
WHERE DEPT_CAT = 'A'); 

為了提高效率改寫為

高效 
SELECT … 
FROM EMP A, DEPT B 
WHERE A.DEPT_NO = B.DEPT(+) 
AND B.DEPT_NO IS NULL 
AND B.DEPT_CAT(+) = 'A' 
 
最高效 
SELECT … 
FROM EMP E 
WHERE NOT EXISTS (SELECT 'X' 
FROM DEPT D 
WHERE D.DEPT_NO = E.DEPT_NO 
AND DEPT_CAT = 'A'); 

11.用表連接替換EXISTS

通常來說,采用表連接的方式比EXISTS更有效率

例如:

SELECT ENAME 
FROM EMP E 
WHERE EXISTS (SELECT 'X' 
FROM DEPT 
WHERE DEPT_NO = E.DEPT_NO 
AND DEPT_CAT = 'A'); 
 
更高效 
SELECT ENAME 
FROM DEPT D, EMP E 
WHERE E.DEPT_NO = D.DEPT_NO 
AND DEPT_CAT = 'A'; 

12.用EXISTS替換DISTINCT

當提交一個包含多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT,一般可以考慮用EXIST替換

例如:

低效 
SELECT DISTINCT DEPT_NO, DEPT_NAME 
FROM DEPT D, EMP E 
WHERE D.DEPT_NO = E.DEPT_NO 
 
高效 
SELECT DEPT_NO, DEPT_NAME 
FROM DEPT D 
WHERE EXISTS (SELECT 'X' 
FROM EMP E 
WHERE E.DEPT_NO = D.DEPT_NO); 

EXISTS使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足后,立刻返回結果

13.用索引提高效率

索引是表的一個概念部分,用來提高檢索數據的效率。實際上,SQLSERVER使用了一個復雜的自平衡B-tree結構

通常,通過索引查詢數據比全表掃描要快。當SQLSERVER找出執行查詢和Update語句的最佳路徑時,SQLSERVER優化器將使用索引

同樣,在聯結多個表時使用索引也可以提高效率。另一個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證

除了那些LONG或LONG RAW數據類型,你可以索引幾乎所有的列

通常在大型表中使用索引特別有效,當然,在掃描小表時,使用索引同樣能提高效率

雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價

索引需要空間來存儲,也需要定期維護,每當有記錄在表中增減或索引列被修改時,索引本身也會被修改

這意味著每條記錄的INSERT、DELETE、UPDATE將為此多付出4、5次的磁盤I/O

因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢

SQLSERVER對索引有兩種訪問模式:

1).索引唯一掃描(INDEX UNIQUE SCAN)

大多數情況下, 優化器通過WHERE子句訪問INDEX

例如:
表LODGING有兩個索引:建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER
SELECT *
FROM LODGING
WHERE LODGING = 'ROSE HILL';

在內部,上述SQL將被分成兩步執行:

首先,LODGING_PK索引將通過索引唯一掃描的方式被訪問,獲得相對應的ROWID;然后通過ROWID訪問表的方式執行下一步檢索

如果被檢索返回的列包括在INDEX列中,SQLSERVER將不執行第二步的處理(通過ROWID訪問表)

因為檢索數據保存在索引中,單單訪問索引就可以完全滿足查詢結果

2).索引范圍查詢(INDEX RANGE SCAN)

適用于兩種情況:

1>.基于唯一性索引的一個范圍的檢索

2>.基于非唯一性索引的檢索

例1
SELECT LODGING
FROM LODGING
WHERE LODGING LIKE 'M%';

WHERE子句條件包括一系列值,SQLSERVER將通過索引范圍查詢的方式查詢LODGING_PK

由于索引范圍查詢將返回一組值,它的效率就要比索引唯一掃描低一些

例2
SELECT LODGING
FROM LODGING
WHERE MANAGER = 'BILL GATES';

這個SQL的執行分兩步,LODGING$MANAGER的索引范圍查詢(得到所有符合條件記錄的ROWID),通過ROWID訪問表得到LODGING列的值

由于LODGING$MANAGER是一個非唯一性的索引,數據庫不能對它執行索引唯一掃描

WHERE子句中,如果索引列所對應的值的第一個字符由通配符(WILDCARD)開始,索引將不被采用
SELECT LODGING
FROM LODGING
WHERE MANAGER LIKE '%HANMAN';

在這種情況下,SQLSERVER將使用全表掃描

14.避免在索引列上使用計算

WHERE子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描

例如:

低效
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;

高效
SELECT …
FROM DEPT
WHERE SAL > 25000/12;

請務必注意,檢索中不要對索引列進行處理,如:TRIM,TO_DATE,類型轉換等操作,破壞索引,使用全表掃描,影響SQL執行效率

15.避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以為空的列,SQLSERVER將無法使用該索引

對于單列索引,如果列包含空值,索引中將不存在此記錄;

對于復合索引,如果每個列都為空,索引中同樣不存在此記錄。如果至少有一個列不為空,則記錄存在于索引中

如果唯一性索引建立在表的A列和B列上,并且表中存在一條記錄的A,B值為(123,null),

SQLSERVER將不接受下一條具有相同A,B值(123,null)的記錄插入

如果所有的索引列都為空,SQLSERVER將認為整個鍵值為空,而空不可能等于空,因此你可以插入1000條具有相同鍵值的記錄,當然它們都是空!

因為空值不存在于索引列中,所以WHERE子句中對索引列進行空值比較將使SQLSERVER停用該索引

低效(索引失效)
SELECT …
FROM DEPARTMENT
WHERE DEPT_CODE IS NOT NULL

16.使用UNION-ALL和UNION

當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合并,然后在輸出最終結果前進行排序

如果用UNION ALL替代UNION,這樣排序就不是必要了,效率就會因此得到提高

需要注意的是,UNION ALL將重復輸出兩個結果集合中相同記錄,因此還是要從業務需求分析使用UNION ALL的可行性

關于索引下列經驗請參考:

1).如果檢索數據量超過30%的表中記錄數,使用索引將沒有顯著的效率提高

2).在特定情況下,使用索引也許會比全表掃描慢,但這是同一個數量級上的差距;而通常情況下,使用索引比全表掃描要快幾倍乃至幾千倍!

您可能感興趣的文章:
  • 開啟SQLSERVER數據庫緩存依賴優化網站性能
  • SQL SERVER性能優化綜述(很好的總結,不要錯過哦)
  • SQL Server數據庫的高性能優化經驗總結
  • Sql Server 查詢性能優化之走出索引的誤區分析
  • Sql Server查詢性能優化之不可小覷的書簽查找介紹
  • SQL Server數據庫性能優化技術
  • SQLServer地址搜索性能優化

標簽:河北 廣安 陜西 阿里 福建 南京 通遼 馬鞍山

巨人網絡通訊聲明:本文標題《SQLSERVER SQL性能優化技巧》,本文關鍵詞  SQLSERVER,SQL,性能,優化,技巧,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQLSERVER SQL性能優化技巧》相關的同類信息!
  • 本頁收集關于SQLSERVER SQL性能優化技巧的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产一区二区在线电影| 亚洲视频网在线直播| 午夜精品久久久久久不卡8050| 久久超碰97人人做人人爱| 国产精品自拍毛片| 欧美精品一区二区三| 国产一区二区三区蝌蚪| 91丝袜美女网| 色美美综合视频| 欧美群妇大交群的观看方式| 欧美在线观看视频在线| 亚洲日本va午夜在线影院| 亚洲黄色小说网站| 欧美日韩在线电影| 欧美一级理论片| 国产精品亚洲一区二区三区妖精 | 精品久久99ma| 国产成人自拍网| 精品福利在线导航| 风间由美性色一区二区三区| 一个色在线综合| 2023国产精品视频| 调教+趴+乳夹+国产+精品| 国产很黄免费观看久久| 国产精品乱码一区二三区小蝌蚪| 日本成人在线视频网站| 久久久另类综合| 色先锋资源久久综合| 国产午夜精品一区二区三区四区| 97国产一区二区| 久久成人免费日本黄色| 日韩伦理免费电影| 成人免费视频免费观看| 亚洲综合网站在线观看| 在线观看不卡一区| 国内不卡的二区三区中文字幕| 91精品国产乱码久久蜜臀| 亚洲啪啪综合av一区二区三区| 欧美欧美午夜aⅴ在线观看| 国产99精品国产| 免费视频最近日韩| 欧美日韩精品三区| 成人理论电影网| 裸体歌舞表演一区二区| 欧美一级xxx| 日韩精品亚洲专区| 亚洲日本在线看| 欧美国产欧美综合| 丁香网亚洲国际| 日韩电影在线观看网站| 欧美一级生活片| 亚洲6080在线| 亚洲视频一区在线观看| 久久久久久久久久美女| 精品久久99ma| 欧美精品一区二区不卡| 国产麻豆9l精品三级站| 五月天激情综合| 日韩毛片精品高清免费| 国产欧美一区二区精品久导航 | 91精品国产91久久久久久一区二区| 一区二区三区在线视频免费| 26uuu色噜噜精品一区| 精品少妇一区二区| 成人免费视频一区| 国产白丝网站精品污在线入口| 国产高清成人在线| 一区二区成人在线| 亚洲精品国产精品乱码不99| 最新日韩在线视频| 亚洲一区二区欧美日韩| xnxx国产精品| 国产亚洲短视频| 2023国产精品视频| 在线免费观看日本欧美| 久久久精品国产免大香伊| 久久这里只有精品6| 亚洲国产综合在线| 91蜜桃婷婷狠狠久久综合9色| 2022国产精品视频| 蜜臀av一区二区在线免费观看| 美女mm1313爽爽久久久蜜臀| 日韩二区三区四区| 欧洲精品在线观看| 一区二区久久久久久| 91女厕偷拍女厕偷拍高清| 国产精品素人一区二区| 国产一区二区h| 一区二区三区在线视频免费观看| 欧美剧情电影在线观看完整版免费励志电影| 日韩精品免费专区| 精品写真视频在线观看| 色综合天天做天天爱| 91精品国产综合久久精品app | 日韩va亚洲va欧美va久久| 国产精品私房写真福利视频| 欧美影院一区二区三区| 日韩视频一区二区三区在线播放| 欧洲一区在线观看| 国产不卡视频一区二区三区| 水蜜桃久久夜色精品一区的特点| 青青草97国产精品免费观看 | 午夜成人免费视频| 国产精品毛片无遮挡高清| 亚洲视频一区在线观看| 欧美国产日韩在线观看| 3d动漫精品啪啪1区2区免费 | 欧美午夜视频网站| 国产一区二区毛片| 香蕉乱码成人久久天堂爱免费| 首页国产丝袜综合| 午夜免费久久看| 中文字幕一区二区三区在线播放| 亚州成人在线电影| 中国av一区二区三区| 久久久久久久av麻豆果冻| 一区二区中文字幕在线| 国产伦理精品不卡| 精品国产sm最大网站| 日韩电影网1区2区| 欧美性视频一区二区三区| 欧美综合在线视频| 国产午夜亚洲精品午夜鲁丝片| 久久伊人蜜桃av一区二区| 亚洲午夜视频在线| 石原莉奈一区二区三区在线观看| 激情综合网最新| 免费看欧美美女黄的网站| 国产一二三精品| 日韩免费观看高清完整版在线观看| 欧美性一二三区| 欧美精品一区男女天堂| 无吗不卡中文字幕| 欧美优质美女网站| 免费在线一区观看| 高清不卡一区二区在线| 极品少妇一区二区三区精品视频| 欧洲一区二区三区在线| 国产精品成人网| 国产精品国产三级国产aⅴ原创 | 99精品视频中文字幕| 欧美va在线播放| 久久国产乱子精品免费女| 狠狠色丁香九九婷婷综合五月| 欧美日韩精品三区| 亚洲成人精品在线观看| 91尤物视频在线观看| 成人欧美一区二区三区黑人麻豆| 92国产精品观看| 1024成人网| 色综合网色综合| 欧美日韩国产在线观看| 日韩欧美国产wwwww| 免费欧美日韩国产三级电影| 26uuu亚洲| 亚洲精品成人精品456| 亚洲一区二区三区精品在线| 国产午夜精品福利| 欧美视频一区二区在线观看| 欧洲生活片亚洲生活在线观看| 99麻豆久久久国产精品免费| 国产精品资源在线观看| gogo大胆日本视频一区| 中文字幕精品在线不卡| 成人一区二区三区视频| 亚洲视频中文字幕| 欧美在线观看视频一区二区| 青青草国产成人99久久| 国产资源在线一区| 欧美国产日韩精品免费观看| 一色屋精品亚洲香蕉网站| 色偷偷一区二区三区| 久久亚洲一区二区三区四区| 国产精品66部| 国产99久久久国产精品潘金| 亚洲视频你懂的| 精品国产91乱码一区二区三区 | 丝袜美腿一区二区三区| 国产成人欧美日韩在线电影| 最新热久久免费视频| 欧美日本在线观看| 日本一区二区三区四区在线视频| 国产免费观看久久| 午夜不卡av在线| 国产精品免费人成网站| 欧美性极品少妇| 久久蜜臀精品av| 一区二区三区不卡视频在线观看| 欧美日韩国产高清一区二区三区 | 欧美美女黄视频| 99视频一区二区三区| 久久精品国产精品青草| 国产91精品在线观看| 亚洲精品视频免费看| 国产91综合一区在线观看| 欧美一区二区三区视频| 成人激情动漫在线观看| 国产在线国偷精品产拍免费yy| 亚洲亚洲精品在线观看| 国产精品乱码妇女bbbb|