我在Oracle 11g和我們有這3個核心表:優化與Oracle數據庫的幫助搜索
Customer - CUSTOMERID|DOB
CustomerName - CUSTOMERNAMEID|CustomerID|FNAME|LNAME
Address - ADDRESSID|CUSTOMERID|STREET|CITY|STATE|POSTALCODE
我對每個表的數據和大約60萬行是美國和加拿大的混合人口。
我有一個調用Web服務的前端應用程序,他們做姓氏和部分zip搜索。所以我的查詢基本上有
where CUSTOMERNAME.LNAME = ? and ADDRESS.POSTALCODE LIKE '?%'
它們通常提供zip的前3位數字。
地址表在所有街道/城市/州/郵政編碼和另一個州和郵政編碼索引。
我曾嘗試添加專用於zip的索引,並強制oracle在我的查詢中使用該索引,但這沒有任何區別。
對於返回約100行(我有分頁,一次只返回100)大約需要30秒,這是不理想的。我能做些什麼來改善這一點?
您需要顯示您的查詢。我的猜測是這些表在CUSTOMERID上連接,所以CUSTOMERID s/b在每個表上編入索引。 –
問題是郵政編碼是全部數字(如果你正在談論美國),但它們存儲爲字符串(實際上沒有太多的選擇)。即使使用索引,沒有更多的幫助,Oracle不知道在099和100之間它不需要查找09A和09W。所以它的基數估計將會消失。一種幫助Oracle的方法是添加直方圖。 https://docs.oracle.com/database/121/TGSQL/tgsql_histo.htm#TGSQL366 – mathguy
然後:LNAME應該比POSTALCODE更有選擇性,但是您沒有提到LNAME上的索引。有一個嗎? – mathguy