我正在嘗試改善此查詢的性能。我可以做些什麼來優化它?試圖改進此查詢
SELECT * FROM bldng
WHERE bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%'
OR bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500
我正在嘗試改善此查詢的性能。我可以做些什麼來優化它?試圖改進此查詢
SELECT * FROM bldng
WHERE bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%'
OR bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500
如果您使用SQL Server,則可以使用Table Hints (MSDN link)。 NOLOCK很常見。
由於通配符前綴,您將要對bldng
進行全面掃描。如果您可以刪除通配符前綴並在bldng_type
上添加索引,則您的性能應該會大大提高。有%text%
很慢
由於您使用'%搜索字符串%'兩端的百分號會破壞這些列上的索引。改用全文索引會更好。如果你想要真正的性能和準確性,你可以使用Lucene或Sphinx全文搜索引擎。
索引area_sqf
並指定只需要的列而不是使用*
可能會有所幫助。
它看起來像你試圖選擇不同類別的建築物。我會建議在bldng表上放一個'bldng_category'列。這樣,您就可以使用簡單的查詢是這樣的:
SELECT * FROM bldng WHERE bldng_category在( 'PTR', 'FACILITY_B', '設施-B')和area_sqf> 500
如果你不需要每一列你都可以用你需要的列表替換你的'*'。 – JKirchartz 2012-03-27 15:29:48
你可以做的事情非常少,不依賴數據。您的查詢取決於檢查'bldng.bldng_type'中每個值的全部內容;如果「bldng」很大,那麼速度會很慢。相反,您應該考慮改進您的表格設計,以便不需要這種查詢。 – ruakh 2012-03-27 15:30:17
可以在'bldng_type'列中輸入的字符串的完整列表需要多長時間? – dasblinkenlight 2012-03-27 15:33:37