国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL優化技巧指南

2020-07-25 12:55:45
字體:
來源:轉載
供稿:網友

對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

select id from t where num is null

最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫。

備注、描述、評論之類的可以設置為 NULL,其他的,最好不要使用NULL。

不要以為 NULL 不需要空間,比如:char(100) 型,在字段建立時,空間就固定了, 不管是否插入值(NULL也包含在內),都是占用 100個字符的空間的,如果是varchar這樣的變長字段, null 不占用空間。

可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:

select id from t where num = 0

應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。
應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描

select id from t where num=10 or Name = 'admin'
可以這樣查詢:

select id from t where num = 10union allselect id from t where Name = 'admin'

in 和 not in 也要慎用,否則會導致全表掃描

select id from t where num in(1,2,3)

對于連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(select num from b)

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

下面的查詢也將導致全表掃描

select id from t where name like ‘%abc%'

若要提高效率,可以考慮全文檢索。

如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

select id from t where num = @num

可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num = @num

應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2 = 100

應改為:

select id from t where num = 100*2

應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3) = 'abc'       --name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30′) = 0    -

主站蜘蛛池模板: 治多县| 兖州市| 扎赉特旗| 政和县| 留坝县| 宁陕县| 萍乡市| 赤峰市| 吴忠市| 南陵县| 五指山市| 高邑县| 绥阳县| 东乡族自治县| 砀山县| 陆丰市| 新源县| 汽车| 安岳县| 林芝县| 石屏县| 龙里县| 汕尾市| 闻喜县| 承德县| 延庆县| 武汉市| 长武县| 金昌市| 苏尼特左旗| 溆浦县| 久治县| 黄山市| 南康市| 隆昌县| 宜宾市| 涡阳县| 金昌市| 聊城市| 朔州市| 大英县|