-
優化SQL查詢:如何編寫高效能的SQL語句
1、首先要了解什麼是實施方案?
如果使用 SQL 語句從有 100,000 條記錄的表中查詢 1 條記錄,查詢優化器會選擇“索引查詢”模式,如果表存檔,只剩下 5000 條記錄,則查詢優化器會改變方案,採用“全表掃瞄”方式。
可以看出,執行計畫不是固定的,而是“個性化”的。 要制定正確的“執行計畫”,有兩件重要的事情很重要:優化SQL查詢:如何編寫高效能的SQL語句。
1、首先要了解什麼是實施方案?
如果使用 SQL 語句從有 100,000 條記錄的表中查詢 1 條記錄,查詢優化器會選擇“索引查詢”模式,如果表存檔,只剩下 5000 條記錄,則查詢優化器會改變方案,採用“全表掃瞄”方式。
可以看出,執行計畫不是固定的,而是“個性化”的。 制定正確的“執行計畫”有兩個要點:
-
優化SQL查詢:如何編寫高效能的SQL語句
1、首先要了解什麼是實施方案?
如果使用 SQL 語句從有 100,000 條記錄的表中查詢 1 條記錄,查詢優化器會選擇“索引查詢”模式,如果表存檔,只剩下 5000 條記錄,則查詢優化器會改變方案,採用“全表掃瞄”方式。
可以看出,執行計畫不是固定的,而是“個性化”的。 制定正確的“執行計畫”有兩個要點:
1) SQL 語句是否清楚地告訴查詢優化器它想要做什麼?
2) 來自查詢優化器的資料庫統計資訊是否最新且正確?
2.統一SQL語句的編寫。
對於以下兩個 SQL 語句,程式設計師認為它們是相同的,而資料庫查詢優化器則認為它們是不同的。
select * from dual
select * from dual
其實情況不同,查詢分析器認為是兩個不同的SQL語句,必須解析兩次。 生成 2 個執行計畫。
因此,作為程式設計師,您應該確保相同的查詢語句在任何地方都是一致的,而不是多乙個空格!
3.不要把SQL語句寫得太複雜。
我經常看到從資料庫中捕獲的單個 SQL 語句列印出長達 2 張 A4 紙。 一般來說,這種複雜的陳述通常是有問題的。 我把兩頁的SQL語句拿給原作者,但他說太長了,一時看不懂。
可想而知,就算是原作者,看SQL語句也會一頭霧水,資料庫也會一頭霧水。
通常,將 select 語句的結果作為子集,然後從該子集進行查詢是比較常見的,但根據經驗,超過三層巢狀,查詢優化器很容易給出錯誤的執行計畫。 因為頭暈。 像這種人工智慧的東西,畢竟比人類的解像度還要差,如果人頭暈目眩,我可以保證資料庫也會頭暈目眩。
此外,執行計畫可以復用,SQL語句越簡單,復用的可能性就越大。 複雜的SQL語句,只要乙個字元變了,就要解析,然後把這一大堆垃圾塞進記憶體裡。 可以想象資料庫的效率有多低。
4.使用“臨時表”臨時儲存中間結果。
簡化SQL語句的乙個重要方法是使用臨時表來臨時儲存中間結果,但是,臨時表的好處遠不止這些,臨時結果臨時儲存在臨時表中,後續查詢在tempdb中,可以避免程式中對主表的多次掃瞄, 並且也大大減少了程式執行中的“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了併發效能。
-
簡潔高效的SQL語句對於大型資料庫或大型資料庫非常有用,SQL的冗餘會造成系統和資源的占用以及時間的增加。
1.什麼樣的 SQL 被認為是高效的 SQL? 為什麼不去索引呢?
如何讓SQL去索引,即改變SQL 3的執行計畫有哪些不同型別的索引? 4、何時使用索引,何時用整張表掃瞄Oracle優化器的表統計資訊,評估表的最佳連線順序、表的連線方式、執行路徑; 最後,生成乙個執行計畫,Oracle 根據該計畫執行 SQL 1
什麼樣的SQL才是高效的SQL? 答:最本質的答案是實現時間最短,如何做到最短,就是用最少的資源做事,不做無用的工作; 即使 SQL 的 io 最少,它怎麼可能是最少的呢?
即盡量使用索引,不要掃瞄整個表; 鏈結多個表時,為什麼不遵循索引型別與 b 不匹配。 條件列包含乙個函式,但不建立相應的函式索引 c。
在不使用復合索引中的前導列作為查詢條件的模式下,選擇的行數較大,優化器選擇全表掃瞄模式,長時間未分析表,優化器選擇全表掃瞄3索引型別和建立方法在 tablename(columnname) 上建立索引 indexName; b.在 TableName(ColumnName) 反向上建立索引 IndexName; c.
在 tableName(columnname desc) 上建立索引 indexName; d.在 TableName(ColumnName) 上建立位圖索引 IndexName; e。在 tableName(FunctionName(columnName)) 上建立索引 IndexName; 4. 何時使用索引,何時使用全表掃瞄?
答:當你想使用索引時,首先需要弄清楚一些基本資訊表中有多少行。 查詢返回多少行?
表的哪些列有索引? 它們是什麼樣的索引? 當我有多個條件列時,我應該選擇哪種索引?
a.當有序表中查詢的記錄數少於40%時,最好使用索引。 否則,請使用完整表掃瞄 b.當查詢的記錄數小於無序表的7%時,最好使用索引。 否則,請使用完整表掃瞄 C.
當表中有大量鍵鎖時(此表上的 DML 操作很頻繁)。
-
這不是乙個簡單的SQL,而是乙個觸發器(觸發器內部是乙個PLSQL塊,帶有判斷力)。
觸發條件是在插入 b 之後,即輸入 b 表之後。
為方便起見,建議在新建立的表中新增總成本字段,以便於計算。
1)需要查詢表A是否已經輸入,(我不知道你輸入的順序,如果能確定A早於B,那麼就不需要查詢表A是否已經輸入。 這比較簡單,只要跟蹤號存在,如果存在,那就繼續執行。
2) 在此表中找到相應的學生編號,如果沒有,則插入。
3)判斷金額,也就是你說的1000、2000、10000,如果是,那就更新。判斷的方式也很簡單,如果原來的學號不存在,那就直接判斷,如果存在,那就用原來的加這個時間。 評審條件如下:
原成本<1000,原成本+這個成本1000,其他兩個判斷也與此類似。 如果判斷成功,則更新,否則不要更改。
就我個人而言,這個方法我能想到,但具體需要一些實驗,我還沒能直接寫出來,必須修改,這裡沒有環境,只能自己改一下。