簡體   English   中英

如何在Firebird 2.1中優化此查詢?

[英]How can I optimize this query in Firebird 2.1?

我正在使用Firebird 2.1,我需要一些幫助來優化這個查詢:(可能用JOINS代替IN-s或其他東西來加速它,因為它非常慢)

SELECT ClientID, ClientType, ClientName 
FROM Clients 
WHERE 
    (
        AccessRights = 0 OR 
        OwnerUserID = :uid OR 
        (
            AccessRights = 2 AND 
            ClientID IN (SELECT ClientID 
                            FROM ClientRights 
                            WHERE UserID = :uid)
        )
    ) 
    AND ClientID IN (SELECT CC.ClientID 
                    FROM CaseClients CC 
                    WHERE CC.CaseID IN (SELECT DISTINCT CaseID 
                                        FROM TimeSheet 
                                        WHERE IsBilled = 0) 
                        AND CC.ClientToBill = 1 
                        AND (SELECT BillingType 
                                FROM Cases 
                                WHERE CaseID = CC.CaseID) = 2
    );

謝謝!

SELECT ClientID, ClientType, ClientName FROM Clients 
WHERE 
(
    AccessRights = 0 OR 
    OwnerUserID = :uid OR 
    (
        AccessRights = 2 AND 
        EXISTS(SELECT * FROM ClientRights r WHERE r.UserID = :uid and r.ClientId=Clients.ClientID)
    )
) 
AND EXISTS(SELECT * 
                FROM CaseClients CC 
                WHERE 
                CC.ClientID=Clients.ClientID and
                   EXISTS(SELECT * FROM TimeSheet 
                          WHERE IsBilled = 0 and TimeSheet.CaseID=CC.CaseID) 
                    AND CC.ClientToBill = 1 
                    AND EXISTS(SELECT BillingType 
                            FROM Cases 
                            WHERE CaseID = CC.CaseID and BillingType=2)
);

這可能會加快一點,但確保索引正確也將有所幫助..

SELECT C.ClientID, C.ClientType, C.ClientName 
FROM Clients C
INNER JOIN CaseClients CC ON C.ClientID = CC.ClientID AND CC.ClientToBill = 1
INNER JOIN TimeSheet TS ON CC.CaseID = TS.CaseID AND TS.IsBilled = 0
INNER JOIN Cases CS ON CC.CaseID = CS.CaseId AND CS.BillingType = 2 
WHERE AccessRights = 0 
     OR OwnerUserID = :uid 
     OR 
        (
            AccessRights = 2 AND 
            ClientID IN (SELECT ClientID 
                            FROM ClientRights 
                            WHERE UserID = :uid)
        )
    ) 
SELECT DISTINCT
        c.ClientID
       ,c.ClientType
       ,c.ClientName
  FROM Clients c
 INNER JOIN CaseClients cc
    ON c.ClientID = cc.ClientID
 INNER JOIN TimeSheet ts
    ON cc.CaseID = ts.CaseID
 INNER JOIN Cases ca
    ON cc.CaseID = ca.CaseID
 WHERE ts.IsBilled = 0
   AND cc.ClientToBill = 1
   AND ca.BillingType = 2
   AND (c.AccessRights = 0 OR
        c.OwnerUserID = :uid OR
        c.AccessRights = 2 AND c.ClientID IN (SELECT cr.ClientID
                                                FROM ClientRights cr
                                               WHERE cr.UserID = :uid)
       )

在我看來,這將更整潔,更快:

SELECT  ClientID, ClientType, ClientName 
FROM    Clients C, CaseClients CC, TimeSheet TS, Cases CA
WHERE   C.ClientID = CC.ClientID 
AND CC.CaseID = TS.CaseID 
AND CC.CaseID = CA.CaseID 
AND TS.IsBilled = 0
AND     CC.ClientToBill = 1 
AND     CA.BillingType = 2 
AND     (C.AccessRights = 0 OR C.OwnerUserID = :uid OR (C.AccessRights = 2 AND     C.ClientID IN 
(SELECT ClientID FROM ClientRights WHERE UserID = :uid))) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM