2015-06-15 188 views
1

我有這樣的MS Access查詢:(30秒)MS Access查詢很慢

SELECT t1.sb, suchbegriff2, menge 
FROM (SELECT artnr & '/' & [lfdnr-kal] AS sb, left(suchbegriff,7) & 
     val(right(suchbegriff,4)) AS suchbegriff2 
     FROM kvks 
     WHERE suchbegriff like '*/*') AS t1 
INNER JOIN (SELECT artnr & '/' & [lfdnr-kal] AS sb, 
       [artnr-hz] & '/' & val(lfdnr) AS hz, menge 
      FROM konf 
      WHERE [artnr-hz]<>'') AS t2 
     ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz); 

它運行真的很慢。我想通了,這是因爲inner join部分。如果我離開這個,速度是正確的。

也許是因爲事實緩慢,連接的字段是計算表達式?

編輯:

我修改的基礎上Smandoli的答案查詢:

SELECT kvks.artnr & '/' & kvks.[lfdnr-kal] AS sb, 
    left(suchbegriff,7) & val(right(suchbegriff,4)) AS suchbegriff2, 
    konf.menge 
FROM kvks, konf 
WHERE kvks.suchbegriff like '*/*' 
    and konf.[artnr-hz]<>'' 
    and kvks.artnr=konf.artnr 
    and kvks.[lfdnr-kal]=konf.[lfdnr-kal] 
    and left(suchbegriff,7) & val(right(suchbegriff,4))=[artnr-hz] & '/' & val(lfdnr) 

它運行現在是正確的。

感謝您的貢獻。

回答

3

你對這些計算的字段有一個複雜的混亂。爲什麼不直接加入?下面的這個查詢留下了一個'/'不明,但應該告訴你我在想什麼。

SELECT 
    t1.sb, 
    left(st1.uchbegriff,7) & val(right(t1.suchbegriff,4)) AS suchbegriff2, 
    t1.menge 

FROM kvks AS t1  
INNER JOIN konf AS t2 

WHERE (t1.suchbegriff like '*/*') 
    AND (t2.artnr-hz<>'') 
    AND (t1.artnr=t2.artnr) 
    AND (t1.lfdnr-kal=t2.lfdnr-kal) 
    AND (left(t1.suchbegriff,7)=t1.[artnr-hz]) 
    AND (val(right(t1.suchbegriff,4))=val(t2.hz)); 
0

由於「嵌套」和「加入」,您的查詢運行緩慢。您可以嘗試創建臨時表並在查詢中使用該表。創建臨時表是一種很好的做法,而不是使查詢變得複雜。

+1

如果您的意思是像SQL Server中的臨時表,我相信MS Access你必須使用真正的表。爲了使它們工作,你必須運行連續的例程,通常使用VBA;你不能像在你習慣的時候那樣只是在棧中啓動一組程序。 – Smandoli

+0

是的,您可以從原始表中創建臨時表,但需要運行VBA以刷新該數據。有關更多信息,請參閱https://accessexperts.com/blog/2011/07/20/use-temp-tables-in-your-code-for-quick-and-easy-analysis/ – Nandish

-1

99999 !!!我認爲你只是實施一些索引

(t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz); 

這些是非常可疑的。這4個索引?

1

對於內部聯接,可以嘗試使用保存的查詢(或臨時表),而不是在運行時編寫查詢。

所以,我會先嚐試抽象此查詢

SELECT artnr & '/' & [lfdnr-kal] AS sb, 
       [artnr-hz] & '/' & val(lfdnr) AS hz, menge 
      FROM konf 
      WHERE [artnr- 
      hz]<>'') AS t2 
     ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz) 

所有第二,如果可能的話,我會抽象一些在查詢的功能。你可以用VBA做這件事,或者在查詢之外操作數據。第三,你總是可以在你的桌子上創建一個字段,將你需要的兩個字段組合在一起。

E.x:在存儲的artnr & '/' & [lfdnr-kal]

值的konf表創建一個新的列,你需要做的是限制的功能/計算/場在運行時凝聚。這對查詢來說很重要,如果它運行緩慢,我會看到方向關聯,或者與索引/連接不正確。

如果您已將其識別爲連接問題,則可以使用VBA在查詢中創建臨時表,並將其用作記錄源而不是SQL。 另外,如果您不使用臨時表,至少保存查詢。這允許Access有運行查詢的計劃,而您的查詢是100%運行時間依賴的。

+0

已保存的查詢只改善可讀性,而不是性能。通常在編程的動態比賽中,他們會降低性能,因爲使用內置的即席查詢,您可以將篩選器置於每個子查詢級別。第二個數據庫誕生了,用於連接表。這是他們的工作。問題在於連接字段必須編入索引。時間的減少是以2爲底的對數。這意味着如果一個查詢需要30000個工廠來執行,如果您將連接字段索引到Log2(30000)= 14 mills ... ein augenblink。 – jurhas

+0

我會同意你的看法,但也不同意。 MS Access保存已保存查詢的執行計劃。只要數據更改時刷新執行計劃,就應該優化未保存的查詢。您還可以壓縮/修復數據庫以重新計算執行計劃 –