2011-01-27 88 views
0

注 - db中有大約2-3百萬條記錄。爲什麼我的查詢需要2分鐘才能運行?

SELECT  
    route_date, stop_exception_code, unique_id_no, 
    customer_reference, stop_name, stop_comment, 
    branch_id, customer_no, stop_expected_pieces, 
    datetime_updated, updated_by, route_code 
FROM 
    cops_reporting.distribution_stop_information distribution_stop_information 
WHERE  
    (stop_exception_code <> 'null') AND 
    (datetime_updated >= { ts '2011-01-25 00:00:01' }) 
ORDER BY datetime_updated DESC 
+2

什麼數據庫引擎? – Blorgbeard 2011-01-27 16:59:55

+0

您需要添加更多關於模式和相關索引的信息。例如 - datetime_updated上有一個索引,它是什麼類型的索引?連接列上是否有索引? – iain 2011-01-27 17:01:22

回答

4

如果你發佈你已經在這個表上,或者一個查詢執行計劃的指標,它會更容易瞭解。事實上,如果您創建包含stop_exception_codedatetime_updated的組合索引,我會猜測您可以提高性能。我不能保證這實際上可行,但它可能值得一試。我不能說遠不止這些,沒有任何其他信息...

1

一些經驗法則:對連接列

  • 指數。
  • WHERE子句中使用的列的索引。
  • '不等於'總是比'等於'條件慢。考慮將表拆分爲那些爲空和那些不屬於這些的表,或者將表拆分爲聯接表作爲索引。
  • 使用正確的JOIN語法即是明確在哪裏連接是通過寫INNER JOIN速度東西在某些數據庫(我見過一個10分鐘+查詢只是單是這種變化踏踏實實地在MySQL 30秒)
  • 使用別名每個表和前綴,每列
  • 店作爲一個函數/過程,它會預編譯,並得到更快
1
stop_exception_code <> 'null' 

請告訴我,「空」是不是引入你的數據庫。標準SQL將

stop_exception_code IS NOT NULL 

stop_exception_code is NULL 

我不知道什麼是NULL stop_exception_code可能對你意味着什麼。但是如果它的意思是「我不知道」,那麼爲「我不知道」使用特定值可能會讓您的服務器在該列上使用索引,並將它索引爲可能無法用於NULL 。 (或者,也許你已經通過使用字符串'null'來做到這一點)。

沒有看到你的DDL,實際查詢和執行計劃,這些都是我可以告訴你的。

相關問題