sql問題整理

2021-09-02 15:58:04 字數 1531 閱讀 6455

問題1,是否值得在identity欄位上建立聚集索引。

答案取決於identity 字段如何在語句中使用。如果你經常根據該欄位搜尋返回很少的行,那麼在其上建立索引是值得的。

反之如果identity欄位根本很少在語句中使用,那麼就不應該對其建立任何索引。

問題2,乙個表應該建立多少索引合適。

如果表的80%以上的語句都是讀操作,那麼索引可以多些。但是不要太多。

特別是不要對那些更新頻繁的表其建立很多的索引。很少表有超過5個以上的索引。

過多的索引不但增加其占用的磁碟空間,也增加了sql server 維護索引的開銷。

問題3:為什麼sql server 在執行計畫中沒有使用你認為應該使用的索引?原因是多樣的。

一種原因是該語句返回的結果超過了表的20%資料,使得sql server 認為scan比seek更有效。 

另一種原因可能是表字段的statistics過期了,不能準確反映資料的分布情況。

你可以使用命令update statistics tablename with fullscan來更新它。

只有同步的準確的statistics才能保證sql server 產生正確的執行計畫。

過時的老的statistics常會導致sql server生成不夠優化的甚至愚蠢的執行計畫。

所以如果你的表頻繁更新,而你又覺得和之相關的sql語句執行緩慢,不妨試試update statistic with fullscan 語句。

問題4、什麼時候使用聚集索引,什麼時候使用非聚集索引?

在sql server 中索引有聚集索引和非聚集索引兩種。它們的主要差別是前者的索引葉子就是資料本身,而後者的葉子節點包含的是指向資料的書籤(即資料行號或聚集索引的key)。

對乙個表而言聚集索引只能有乙個,而非聚集索引可以有多個。

只是聚集索引沒有bookmark lookup操作。

什麼時候應該使用聚集索引?  什麼時候使用非聚集索引? 取決於應用程式的訪問模式。

我的建議是在那些關鍵的字段上使用聚集索引。乙個表一般都需要建立乙個聚集索引。

對於什麼時候使用聚集索引,sql server 2000聯機手冊中有如下描述:

在建立聚集索引之前,應先了解您的資料是如何被訪問的。可考慮將聚集索引用於:

包含大量非重複值的列。

使用下列運算子返回乙個範圍值的查詢:between、>、>=、< 和 <=。

被連續訪問的列。

返回大型結果集的查詢。

經常被使用聯接或 group by 子句的查詢訪問的列;一般來說,這些是外來鍵列。

對 order by 或 group by 子句中指定的列進行索引,可以使 sql server 不必對資料進行排序,因為這些行已經排序。這樣可以提高查詢效能。

oltp 型別的應用程式,這些程式要求進行非常快速的單行查詢(一般通過主鍵)。應在主鍵上建立聚集索引。

聚集索引不適用於:

頻繁更改的列

這將導致整行移動(因為 sql server 必須按物理順序保留行中的資料值)。這一點要特別注意,因為                     在大資料量事務處理系統中資料是易失的。

sql2000安裝問題整理

1.版本問題 windows xp,windows2000 professional 安裝sql2000只能安裝個人版 不能安裝企業版 2.掛起的檔案操作 regedit hkey local machine system currentcontrolset control session mana...

SQL 面試問題 資料整理

sql語句,問怎麼在sql層面做一些優化。我就說,sql優化基本就是一些常識性的東西,比如不能用selelct 少用distinct group by之類的命令。對面說,這些都是背一下就知道的,我希望你說一些你自己的理解。我一下子就急了!因為前面回答的並不好,現在的回答又沒在他的思路上,這是要悲劇的...

資料分析SQL問題整理

1.視窗函式 參考文章 2.各種連線方式的區別?inner join 內連線,只有兩個表共有的列值對應的行才能匹配出行資料。left join right join all join 左,右,全 外連線,以left join 為例,如果指定了需要匹配的列名,左表的資料都會提取出來,若右表有符合條件資...