2012-09-21 140 views
0

假設我已經得到下面的SQLSQL優化:內部連接

如何優化查詢的性能?

select product, address, quantity, 
    price, create_date, sum(no_of_photo) as no_of_photo 
from 
(
    SELECT customer.PROJECT_ID as project_id , 
     customer.ORDER_TYPE as order_type, 
     customer.product_name as product, 
     customer.address_name as address ,  
     customer.quantity_name as quantity, 
     user.first_name || ' ' || user.last_name AS price, 
     customer.create_date, customer.no_of_photo 
    FROM customer 
    INNER JOIN user 
     ON customer.creation_userid = user.userid 
) master_list 
group by project_id, order_type , 
    product, address, quantity, price, 
    create_date 
having project_id = 123456 
order by product, address, quantity, price, create_date 
+1

向我們展示執行計劃。 –

+1

**再次**,爲什麼它需要優化?查詢優化器說什麼?這些表中是否有索引(如果是這樣的話,還有哪些列)? ** Think。** – 2012-09-21 10:17:40

+0

什麼是查詢優化器? –

回答

4

一對夫婦的事情,我會嘗試:

  1. 把你的HAVING子句爲WHERE在內部查詢
  2. SELECT名字,並在內部查詢
  3. 集團通過自己的姓氏first_name,last_name在外部查詢中(爲什麼叫做價格?)
  4. 是否連接first_name || ''||姓氏在外部查詢

也能確保有指標上:

  • customer.project_id
  • customer.creation_userid
  • user.userid
+0

我認爲他應該只是將用戶表的聯接移動到外部查詢,並將該組移動到內部查詢中。如果他沒有過濾first_name ||' '|| last_name,那麼他應該將其更改爲子選擇 –

1

最好的增加通常通過自帶創建一個索引。你詢問內部連接。沒有內部連接,它快嗎?那麼你可能需要user.userid上的索引。

+0

可能,但不知道更多關於OP的數據,最好很難確定查詢優化器是否會利用這樣的索引。 – 2012-09-21 10:33:53

+2

我同意但那是我開始的地方。這是一個有教養的猜測。對我來說,整個問題有點兒:我不太瞭解,請現在告訴我這是'SELECT'。我的經驗告訴我,缺少的索引幾乎總是問題所在。可能吧,既然你挑戰了它,一個更好的想法就是嘗試孤立的子查詢。如果緩慢,則嘗試不加入連接。如果速度很快,試試索引。然後,一旦子查詢快速嘗試整個查詢,然後如果慢查明問題。解釋會讓故事更容易。 – hol