2011-10-13 107 views
0
SELECT 
    a.cdrID as cdrID, 
    a.userName as userName, 
    a.callingStationID as callingStationID, 
    a.orgClientAccountID as orgClientAccountID, 
    a.terClientAccountID as terClientAccountID, 
    a.calledStationID as calledStationID, 
    a.setupTime as setupTime, 
    a.connectTime as connectTime, 
    a.disconnectTime as disconnectTime, 
    a.orgDestCode as orgDestCode, 
    a.orgBilledDuration as orgBilledDuration, 
    a.orgBilledAmount as orgBilledAmount, 
    a.terDestCode as terDestCode, 
    a.terBilledDuration as terBilledDuration, 
    a.terBilledAmount as terBilledAmount, 
    a.orgRateID as orgRateID, 
    a.terRateID as terRateID, 
    b.dtDestName as orgDestName, 
    c.dtDestName as terDestName, 
    d.clCustomerID as terClientName, 
    1 as cdrwsid, 
    cast((e.crFlatRate*a.orgBilledAmount)as decimal(10,4)) as cdrsale, 
    cast((f.crFlatRate*a.terBilledAmount)as decimal(10,4)) as cdrpurchase, 
    cast(((e.crFlatRate*a.orgBilledAmount)-(f.crFlatRate*a.terBilledAmount))as decimal(10,4)) as cdrprofit 
FROM Successful.vbSuccessfulCDR_508 a 
inner join iTelBilling.vbDestination b on a.orgDestCode=b.dtDestCode 
inner join iTelBilling.vbDestination c on a.terDestCode=c.dtDestCode 
inner join iTelBilling.vbClient d on a.terClientAccountID=d.clAccountID 
inner join iTelBilling.vbCallRate e on a.orgRateID=e.crCallRateID 
inner join iTelBilling.vbCallRate f on a.terRateID=f.crCallRateID 
where setupTime between '1317761709564' and '1317804909564' and a.terBilledDuration!=0 

我有問題,這個查詢一段時間,該查詢精運行一段時間,它被認爲是上吊死的服務器和一段時間它通過錯誤一對多連接。任何人都可以告訴我該怎麼做。內連接在MySQL(一對多連接)

+1

不可能閱讀或理解這種格式 – rahularyansharma

+1

「任何人都可以告訴我該怎麼做。」-------我可以告訴你請格式化這個問題 – rahularyansharma

+0

這不是問很多,但嘗試格式化SQL代碼下次。未格式化的代碼通常會使人們迴避問題。 –

回答

2

問題聽起來像這個查詢運行很長;這可能是由於這樣一個事實,即您需要查看查詢使用的索引。爲了得到一個概述(也許優化您的索引和PKS)使用命令:

> EXPLAIN SELECT 
a.cdrID as cdrID, 
a.userName as userName, 
... 

另一個原因可能是,有死鎖情況或情況,其中查詢很長,因爲一個表被鎖定運行。如果發生這種情況,執行該查詢的其他用戶(我假設您在web服務器上下文中使用它)正在建立一個「等待行」。執行此查詢的每個用戶(正在等待)都需要自己的連接。如果發生這種情況,您的服務器在短時間內沒有併發連接。

這可以通過兩種方式解決:

1)確保您的查詢具有更高的性能(檢查PKS和索引)

2)在SQL增加您的併發連接數設置-server:

這可以通過在你的my.cnf設置以下值爲200個連接(例如)完成

max_connections = 200 

3)Optimize your mySQL。確保你的querycache,key-buffer,...被設置爲一個合適的值。有關mySQL性能調優的更多信息,您會發現here

1

可能是因爲引擎正在嘗試使用您的SMALLER查找表來執行連接,而不是您的CRD(呼叫數據記錄)PRIMARY表,如電話系統計費。您正在嘗試獲取正確的始發/目的帳單代碼和費率。有時MySQL會嘗試通過首先使用較小的表來爲您思考。

確保您在「setupTime」的成功表上有一個索引。另外,將「STRAIGHT_JOIN」子句添加到頂部

SELECT STRAIGHT_JOIN ...查詢的其餘部分。

這告訴MySQL根據您按順序排列的表進行處理。它看起來連接到您的目的地,客戶端和呼叫費率表將分別在其連接鍵上有相應的索引...如果不創建它們。