2011-10-13 112 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根据您按顺序排列的表进行处理。它看起来连接到您的目的地,客户端和呼叫费率表将分别在其连接键上有相应的索引...如果不创建它们。