2012-03-27 79 views
0

我正在嘗試改善此查詢的性能。我可以做些什麼來優化它?試圖改進此查詢

SELECT * FROM bldng 
WHERE bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500 
+1

如果你不需要每一列你都可以用你需要的列表替換你的'*'。 – JKirchartz 2012-03-27 15:29:48

+1

你可以做的事情非常少,不依賴數據。您的查詢取決於檢查'bldng.bldng_type'中每個值的全部內容;如果「bldng」很大,那麼速度會很慢。相反,您應該考慮改進您的表格設計,以便不需要這種查詢。 – ruakh 2012-03-27 15:30:17

+0

可以在'bldng_type'列中輸入的字符串的完整列表需要多長時間? – dasblinkenlight 2012-03-27 15:33:37

回答

1

由於通配符前綴,您將要對bldng進行全面掃描。如果您可以刪除通配符前綴並在bldng_type上添加索引,則您的性能應該會大大提高。有%text%很慢

1

由於您使用'%搜索字符串%'兩端的百分號會破壞這些列上的索引。改用全文索引會更好。如果你想要真正的性能和準確性,你可以使用Lucene或Sphinx全文搜索引擎。

+0

正是我要說的。我還會指出,很多人在不需要的時候使用這種結構,如果你不需要第一個字符作爲通配符,就可以將其消除。如果OP使用它,SQL Server也有自己的全文搜索。 – HLGEM 2012-03-27 15:33:33

+0

好的,CASE聲明也會有幫助嗎?我正在考慮......但不知道它會更有效 – dido 2012-03-27 15:46:42

+0

我不認爲你可以從數據庫中調用lucene或sphinx函數。但這是一個有趣的概念。 – Luke101 2012-03-27 18:33:56

0

索引area_sqf並指定只需要的列而不是使用*可能會有所幫助。

1

它看起來像你試圖選擇不同類別的建築物。我會建議在bldng表上放一個'bldng_category'列。這樣,您就可以使用簡單的查詢是這樣的:

SELECT * FROM bldng WHERE bldng_category在( 'PTR', 'FACILITY_B', '設施-B')和area_sqf> 500