2013-04-15 94 views
0

我正在查詢一個數千行的相當大的數據庫。它在5分鐘附近,而它應該需要約5秒鐘。緩慢的查詢時間SQL/Java

ResultSet rs = st.executeQuery("SELECT flights.airline, flights.flight_num," 
      + "origin_airport_code, destination_airport_code," 
      + "ticket.date, ticket.bought_date, ticket.price " 
      + "FROM flights JOIN flightinfo JOIN ticket"); 

我應該使用某種特定類型的連接JOIN語句嗎?

+1

你加入了哪些專欄? – Fergus

+0

請提供您的創建語句。它總是會幫助我們爲您在此處提到的性能問題找到更好的解決方案。我們不僅可以優化您的select語句,還可以優化涉及的表格。順便說一句,歡迎來到stackoverflow :) –

回答

3

目前,您的查詢所做的是獲取表格的笛卡爾積,因爲您尚未指定其連接條件或定義表格之間的相互關係。

您需要添加一個條件或ON條款每個連接的語句,如

SELECT flights.airline, 
     flights.flight_num, 
     origin_airport_code, 
     destination_airport_code, 
     ticket.date, 
     ticket.bought_date, 
     ticket.price 
FROM flights 
     INNER JOIN flightinfo 
      ON flights.colName = flightinfo.colname -- << 1 
     INNER JOIN ticket 
      ON table.ColName = ticket.colName  -- << 2 

WHERE:

1 >> Colname >> how the two tables:flights and flightinfo, are related 
2 >> table >> I don't know where the table ticket will be joined, it is 
       either flights or flightinfo. 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

0

你的問題是,在最後一行

FROM flights JOIN flightinfo JOIN ticket 

你應該INNER或LEFT加入他們的行列。

您應該注意的另一件事是,如果每個航班有很多票,您將獲得航班重複。

如果可能有沒有機票的票,那麼你會得到沒有航班,如果使用INNER加入。

我想flightinfo總是存在,它是1:1的航班。所以最終的解決辦法是(根據我的假設)

  • 內加入flightinfo
  • 左加入門票
  • 解析記住,航班將每每張票被複制時

如果門票是您的主表,並且您不需要沒有門票的航班,那麼請執行FROM ticket並內部連接其他表。