當前位置:編程學習大全網 - 編程語言 - 如何在ao2011軟件中使用sq語句查詢分析被審計單位的財務數據?

如何在ao2011軟件中使用sq語句查詢分析被審計單位的財務數據?

1.為了優化查詢,我們應該盡可能避免掃描整個表。首先,我們應該考慮在where和order by中涉及的列上建立索引。

2.盡量避免在where子句中使用!=或者

3.盡量避免判斷where子句中字段的空值,否則引擎會放棄使用索引並掃描整個表,比如:

從t中選擇id,其中num為空

您可以將num的默認值設置為0,以確保表中的num列沒有空值,然後像這樣查詢它:

從t中選擇id,其中num=0

4.盡量避免在where子句中使用or連接條件,否則會導致引擎放棄使用索引並掃描整個表,例如:

從t中選擇id,其中num=10或num=20

您可以像這樣查詢:

select id from t where num=10

聯合所有

從t中選擇id,其中num=20

5.以下查詢也將導致全表掃描:

從t中選擇id,其中名稱如“%abc%”

為了提高效率,可以考慮全文檢索。

6.in和not in也要慎用,否則會導致全表掃描,比如:

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

對於連續值,可以使用between而不是in:

從t中選擇id,其中num介於1和3之間

7.如果在where子句中使用參數,也會導致全表掃描。因為SQL只在運行時解析局部變量,所以優化器不能將訪問計劃的選擇推遲到運行時;必須在編譯時選擇它。但是,如果訪問計劃是在編譯時建立的,那麽變量的值仍然是未知的,因此它不能作為索引選擇的輸入項。以下語句將掃描整個表:

select id from t where num=@num

您可以強制查詢使用索引:

Select id from t with(index)其中num=@num。

8.盡量避免對where子句中的字段進行表達式操作,這將導致引擎放棄使用索引並掃描整個表。比如:

select id from t其中num/2=100

應改為:

select id from t where num = 100 * 2

9.應盡可能避免where子句中對字段的函數操作,這將導致引擎放棄使用索引並掃描整個表。比如:

select id from where substring(name,1,3)= ' abc '-以ABC開頭的名稱ID。

由select Id from where datediff(日,創建日期,' 2005-11-30 ')= 0-' 2005-11-30 '生成的ID

應改為:

從t中選擇id,其中名稱如“abc%”

select id from t where create date & gt;='2005-11-30 '並創建日期& lt'2005-12-1'

10.不要在where子句中的“=”左側執行函數、算術運算或其他表達式運算,否則系統可能無法正確使用索引。

11.使用索引字段作為條件時,如果索引是復合索引,則必須將索引中的第壹個字段作為條件,以保證系統使用該索引,否則不會使用該索引,並且字段順序應盡可能與索引順序壹致。

12.不要寫壹些無意義的查詢。如果需要生成空表結構:

select col1,col2 into #t from t其中1=0

這種代碼不會返回任何結果集,但是會消耗系統資源。應該改成這樣:

創建表#t(...)

13.在很多時候用exists代替是壹個不錯的選擇:

從a中選擇編號,其中編號在(從b中選擇編號)

替換為以下語句:

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

14.並非所有索引都對查詢有效。SQL根據表中的數據優化查詢。當索引列中有大量重復數據時,SQL查詢可能不會使用索引。舉個例子,如果壹個表中有差不多壹半的字段,男性和女性,那麽即使索引建立在性別上,也不會對查詢效率起到作用。

15.索引越多越好。雖然索引可以提高相應選擇的效率,但也會降低插入和更新的效率。因為索引可能會在插入或更新期間重建,所以如何建立索引需要根據具體情況仔細考慮。壹個表中的索引數不應超過6。如果索引太多,就要考慮是否有必要在壹些不常用的列上建立索引。

16.應盡可能避免更新聚集索引數據列,因為聚集索引數據列的順序就是表記錄的物理存儲順序。壹旦列值發生變化,整個表記錄的順序都會進行調整,這將消耗相當大的資源。如果應用程序系統需要頻繁更新聚集索引數據列,則有必要考慮是否應該將索引構建為聚集索引。

17.嘗試使用數值字段。如果字段只包含數值信息,盡量不要設計成字符,這樣會降低查詢和連接的性能,增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中的每個字符,但是對於number類型只比較壹次就夠了。

18.盡可能用varchar/nvarchar代替char/nchar,因為首先變長字段的存儲空間小,可以節省存儲空間,其次對於查詢來說,在相對較小的字段中搜索效率明顯更高。

19.不要在任何地方使用select * from t,用特定的字段列表替換“*”,不要返回任何不需要的字段。

20.盡量使用表變量,而不是臨時表。如果表變量包含大量數據,請註意索引非常有限(只有主鍵索引)。

21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

22.臨時表並非不可用。正確使用它們可以使壹些例程更加有效,例如,當需要重復引用大型表或公共表中的數據集時。但是,對於壹次性事件,最好使用導出表。

23.創建臨時表時,如果壹次插入大量數據,可以用select into代替create table,避免創建大量日誌,提高速度;如果數據量不大,為了減輕系統表的資源,應該先創建表,然後插入。

24.如果使用臨時表,壹定要在存儲過程的末尾顯式刪除所有臨時表,先truncate table table,然後drop table table,以免長時間鎖定系統表。

25.盡量避免使用遊標,因為遊標的效率很差。如果遊標操作的數據超過654.38+0百萬行,那麽就要考慮重寫了。

26.在使用基於遊標的方法或臨時表方法之前,首先要找到壹個基於集合的方法來解決問題,基於集合的方法通常更有效。

27.與臨時表壹樣,遊標也不是不可用的。對小數據集使用FAST_FORWARD遊標通常優於其他逐行處理方法,尤其是在必須引用多個表來獲取所需數據時。在結果集中包含“Total”的例程通常比使用遊標更快。如果開發時間允許,基於光標的方法和基於集合的方法都可以嘗試,看哪種方法效果更好。

28.在所有存儲過程和觸發器的開頭設置SET NOCOUNT ON,在結尾設置set SET NOCOUNT OFF。在執行完存儲過程和觸發器的每壹條語句後,不需要向客戶端發送DONE_IN_PROC消息。

29.盡量避免向客戶端返回大量數據。如果數據量過大,就要考慮相應的要求是否合理。

30.盡量避免大事務操作,提高系統並發性。

  • 上一篇:Toma編程
  • 下一篇:真心求計算機網絡中各種英文縮寫所代表的更多含義,或者其相關詞典的地址。
  • copyright 2024編程學習大全網