如何在 Firebird 2.1 中优化此查询?

     2023-02-16     85

关键词:

【中文标题】如何在 Firebird 2.1 中优化此查询?【英文标题】:How can I optimize this query in Firebird 2.1? 【发布时间】:2012-03-01 03:47:12 【问题描述】:

我正在使用 Firebird 2.1,我需要一些帮助来优化此查询:(可能通过将 IN-s 替换为 JOINS 或其他方式来加快速度,因为它非常慢)

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
    );

谢谢!

【问题讨论】:

您是否已经为要查询的字段添加了索引以加快整个过程? 我不能代表火鸟,但我知道在某些实现中,使用 EXISTS 而不是 IN 更快。 我知道在 SQL Server 中,优化器在使用 AND 谓词时通常比 OR 表现更好,有时可以通过将 OR 转换为逻辑上等效的 AND 来提高性能跨度> 【参考方案1】:
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)
);

【讨论】:

【参考方案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)
        )
    ) 

【讨论】:

【参考方案3】:
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)
       )

【讨论】:

【参考方案4】:

在我看来,这样会更整洁、更快:

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))) 

【讨论】:

如何在 Firebird 2.1 中临时禁用表中的所有约束?

】如何在Firebird2.1中临时禁用表中的所有约束?【英文标题】:HowcanItemporarilydisableallconstraintsinaTableinFirebird2.1?【发布时间】:2010-11-0700:14:15【问题描述】:我想禁用所有外键约束并在之后重新启用它们,有什么方法可以做到吗?... 查看详情

如何在 Postgres 中优化此查询

】如何在Postgres中优化此查询【英文标题】:HowcanIoptimizethisqueryinPostgres【发布时间】:2021-02-1214:19:23【问题描述】:以下查询需要更多时间来运行。如何优化以下查询以运行更多记录?我已经为这个查询运行了ExplainAnalyze。附上... 查看详情

如何在 MySQL 中优化此查询

】如何在MySQL中优化此查询【英文标题】:HowtooptimizethisqueryinMySQL【发布时间】:2015-10-2718:08:21【问题描述】:我有这两张表(Moodle2.8):CREATETABLE`mdl_course`(`id`bigint(10)NOTNULLAUTO_INCREMENT,`category`bigint(10)NOTNULLDEFAULT\'0\',`sortorder`bigint(1 查看详情

如何在 MYSQL 中优化此查询?需要做啥

】如何在MYSQL中优化此查询?需要做啥【英文标题】:HowcanIoptimisethisqueryinMYSQL?Whatneedstobedone如何在MYSQL中优化此查询?需要做什么【发布时间】:2010-08-1900:40:40【问题描述】:请向下滚动到“25/08/2010更新”。我有一个已变成视图... 查看详情

如何使用 C# Firebird 对数据库执行选择查询并将其显示在 shell 中?

】如何使用C#Firebird对数据库执行选择查询并将其显示在shell中?【英文标题】:HowtoexecuteaselectqueryondatabaseusingC#Firebirdanddisplayitinshell?【发布时间】:2021-12-0110:45:31【问题描述】:我刚开始在VisualStudio中学习C#,我有一个任务要做... 查看详情

如何在 Firebird 2.5 中选择程序

】如何在Firebird2.5中选择程序【英文标题】:HowtoSELECTaPROCEDUREinFirebird2.5【发布时间】:2011-07-0721:04:01【问题描述】:我正在使用FirebirdEmbeddedv2.5。如何在查询(SELECT)中使用过程?我的程序:SETTERM^;CREATEPROCEDUREFN_TEST(YINTEGER)RETURNS(... 查看详情

Firebird 2.1 在某些数据库表中存储大量行是不是有效?

】Firebird2.1在某些数据库表中存储大量行是不是有效?【英文标题】:IsFirebird2.1efficienttostoreamassivenumberofrowsinsomeDB\'stable?Firebird2.1在某些数据库表中存储大量行是否有效?【发布时间】:2011-11-1710:21:28【问题描述】:我的应用程... 查看详情

如何优化此 SQL 查询

】如何优化此SQL查询【英文标题】:HowcanIoptimisethisSQLquery【发布时间】:2011-12-1313:06:25【问题描述】:我正在编写一个软件,用于识别已放在网络服务器(CMS)上但不再需要且应该/可以删除的文件。首先,我尝试手动重现所有必需... 查看详情

如何测量 Firebird 2.1 数据库上 blob 占用的空间量?

】如何测量Firebird2.1数据库上blob占用的空间量?【英文标题】:HowcanImeasuretheamountofspacetakenbyblobsonaFirebird2.1database?【发布时间】:2011-04-1115:00:05【问题描述】:我有一个使用Firebird2.1的生产数据库,我需要在其中找出每个表(包... 查看详情

SQL Server - 如何优化此查询?

】SQLServer-如何优化此查询?【英文标题】:SQLServer-howcanthisquerybeoptimized?【发布时间】:2013-07-2218:36:01【问题描述】:此查询平均需要4秒。它将成为存储过程中的子查询,我需要它花费一秒。这是查询:(selectcustomercampaignname+\'$\'... 查看详情

如何在 Firebird 中使用 For 循环?

】如何在Firebird中使用For循环?【英文标题】:HowdoIusetheForloopinFirebird?【发布时间】:2011-08-1812:14:50【问题描述】:有人可以向我解释一下Firebird中For循环的语法吗?这是我目前的代码:AsDeclarevariableVar1integer;beginInsertintotable1--Sele... 查看详情

如何优化慢 SQL 查询

】如何优化慢SQL查询【英文标题】:HowtooptimiseslowSQLquery【发布时间】:2013-11-2510:42:17【问题描述】:我需要帮助来优化此查询。在存储过程中,这部分执行1小时(所有过程需要2来执行)。过程适用于大量数据。查询适用于两个... 查看详情

如何使用 JOINS 和嵌套 SELECT 优化此 SQL 查询?

】如何使用JOINS和嵌套SELECT优化此SQL查询?【英文标题】:HowcanIoptimizethisSQLquerywithJOINSandnestedSELECT?【发布时间】:2016-10-0415:24:46【问题描述】:我的SQL查询需要大量时间来执行,因为事务表在某种程度上非常巨大。我正在寻找提... 查看详情

如何优化此查询

】如何优化此查询【英文标题】:HowdoIoptimizethisquery【发布时间】:2013-04-2623:41:29【问题描述】:Createtable#tmptble(RuleId,SubjectId,RID,Date)Insertinto#tmptble(RuleId,SubjectId,RID,Date)SelectRuleTable.RuleId,RuleTable.SubjectId,KeyTable.RID,Key 查看详情

如何针对 Oracle 优化此查询

】如何针对Oracle优化此查询【英文标题】:HowtooptimizethisqueryforOracle【发布时间】:2018-10-1314:41:59【问题描述】:我正在学习使用索引、索引簇、哈希簇等结构进行查询优化。我有一张桌子客户和预订。我需要优化2个查询查询1:... 查看详情

在 sql 查询中使用 not in 时优化此 SQL 语句的最佳方法是啥?

】在sql查询中使用notin时优化此SQL语句的最佳方法是啥?【英文标题】:IsitthebestwaytooptimizethisSQLstatementwhenusingnotininsqlquery?在sql查询中使用notin时优化此SQL语句的最佳方法是什么?【发布时间】:2020-06-1016:13:17【问题描述】:名为... 查看详情

Firebird 2.1 存储过程连接多行文本

】Firebird2.1存储过程连接多行文本【英文标题】:Firebird2.1storedproceduretoconcatenatetextonmultiplerows【发布时间】:2011-05-1519:36:00【问题描述】:我正在尝试编写一个存储过程来将多行文本连接在一起以将其作为单个字符串返回。例如... 查看详情

Firebird 2.1 TIMESTAMP 算术和民用间隔

】Firebird2.1TIMESTAMP算术和民用间隔【英文标题】:Firebird2.1TIMESTAMParithmeticandcivilintervals【发布时间】:2011-01-0809:01:20【问题描述】:我的理解是,为了与Interbasev6保持一致,Firebird2.5不支持SQL-92INTERVAL关键字。至少,建议thisreference... 查看详情