項目在開發新功能,涉及到一張表,裏面數據有一百多W的條,表字段居然有一百多個。。實在是無法再往下新增長字段了,因而就新增了一張表,用作擴展吧,經過表key來關聯。後來涉及到以擴展表中某個字段做爲查詢條件進行檢索,因而很天然就會想到經過left join新建個視圖,而後進行檢索這個視圖。但是很不幸...慢的要死,查一下要三十幾秒...sql
SELECT * FROM LANDREG.TDDJ_TDDJDA T LEFT JOIN LANDREG.TDDJ_TDDJDA_EXT E ON T.TDDJID = E.TDDJID
而後 explain plan一下語句,看到對兩個表都進行了全表掃描。優化
解釋一下left join大概意思: 首先取出左邊表中全部數據,而後再加上與左右兩個表匹配的的數據。 這樣一來速度天然就慢了code
因而只能拋棄這種方法。開發
優化視圖io
先找出主表中擴展表沒有的數據,而後再關聯主表與擴展表,最後經過union all將兩個查詢結果聯合起來造成一個視圖。class
SELECT T.TDDJID, '' AS FILEBARCODE FROM TDDJ_TDDJDA T WHERE NOT EXISTS (SELECT 1 FROM LANDREG.TDDJ_TDDJDA_EXT E WHERE E.TDDJID = T.TDDJID) UNION ALL SELECT T.TDDJID, E.FILEBARCODE FROM LANDREG.TDDJ_TDDJDA T, LANDREG.TDDJ_TDDJDA_EXT E WHERE T.TDDJID = E.TDDJID
這樣就避免了對主表進行了全表掃描。擴展