2012-12-06 137 views
-1

我有表查詢很慢

table1的

epid  etid  id   EValue  reqdate 
----------- ----------- ----------- ------------ ---------- 
15   1   1   498925307069 2012-01-01 
185   1   2   A5973FC43CE3 2012-04-04 
186   1   2   44C6A4B776A2 2012-04-05 
205   1   2   7A0ED3F1DA13 2012-09-19 
206   1   2   77771D65F9C4 2012-09-19 
207   1   2   AD74A4AA41BD 2012-09-19 
208   1   2   9595ABE5A0C8 2012-09-19 
209   1   2   7611D2FB395B 2012-09-19 
210   1   2   04A510D6067A 2012-09-19 
211   1   2   24D43EC268F8 2012-09-19 

表2

PEId  Id   EPId 
----------- ----------- ----------- 
43   9   15 
44   10   15 
45   11   15 
46   12   15 
47   13   15 
48   14   15 
49   15   15 
50   16   15 
51   17   15 
52   18   15 

表3

PLId  PEId  Id   ToPayId 
----------- ----------- ----------- ----------- 
71   43   9   1 
72   43   9   2 
73   44   10   1 
74   44   10   2 
75   45   11   1 
76   45   11   2 
77   46   12   1 
78   46   12   2 
79   47   13   1 
80   47   13   2 

我想獲得一個ID,其計數小於8在表3中,並且通過表2中的peid命令

我已經寫查詢

SELECT Top 1 ToPayId FROM 
(
    SELECT Count(pl.ToPayId) C, pl.ToPayId 
    FROM table3 pl 
    INNER JOIN table2 pe ON pl.peid = pe.peid 
    INNER JOIN table1 e ON pe.epid = e.epid 
    WHERE e.EtId=1 GROUP BY pl.ToPayId 
) As T 
INNER JOIN table2 p ON T.ToPayId= p.Id 
WHERE C < 8 ORDER BY p.PEId ASC 

該查詢執行存儲過程超過1000次使用而條件依賴於用戶定義的表型中的條目。

但是它非常慢,因爲我們在每個表中有數百萬條記錄。

任何人都可以提出更好的查詢關於上述?

+0

有沒有索引?也許你可以向我們展示DDL的表格。 – AakashM

+0

爲了將來的參考,「十萬」是一個單位,意味着100,000。 –

+0

是的,我在etid(table1),topayid,peid(table3) –

回答

0

也許嘗試與having子句要想從選擇

select table2.id as due 
     from table3 inner join table2 on table2.PEId=table3.PEId... 
     group by ... 
     having count(due) <8 
     order by ... 

擺脫 - >你在表3冗餘ID列:似乎這對夫妻PEID相當無用和ID出現獨特因此將其刪除,並將表3的大小減少25%,從而提高分區的性能

+0

表結構按照業務邏輯是正確的,現在不能更改。 而我正在嘗試你的建議查詢(有),但它不包含table1。 table1需要檢查etid的值。 –

+1

這是一個例子,如果我做你的工作,我不如得到你的薪水!?無論如何,有是正確的路要走; NB:redondancy是昂貴的,沒有任何業務邏輯,我知道這種倡導浪費資源 – mikakun

+0

好吧,這很好,工作。謝謝 –

0

請問..因爲您沒有提供足夠的示例數據,我不確定您的業務邏輯是什麼。這樣我就可以在盲目地修改代碼。

SELECT ToPayId 
FROM (

    SELECT TOP 1 Count(pl.ToPayId) C, pl.ToPayId, pe.PEId 
    FROM table3 as pl 
     INNER JOIN table2 as pe ON pl.peid = pe.peid AND pl.ToPayId = pe.Id 
     INNER JOIN table1 e ON pe.epid = e.epid 
    WHERE e.EtId=1 
    GROUP BY pl.ToPayId, pe.PEId 
    HAVING Count(pl.ToPayId) < 8 
    ORDER BY pe.PEId ASC  

) AS T 
+0

無法找到原因,但查詢返回什麼。並且當您將PEId包含在group by中時,它將返回來自Db的第一條記錄(所有行,如果不是top 1) –

+0

我試過了您的代碼,它也不會返回任何內容。我認爲如果你能更清楚地解釋業務邏輯並提供更多的樣本數據可能會更有幫助。 –