sybase中的查询优化

时间:2011-07-18 05:58:30

标签: sybase

我需要从22个客户数据库中检索客户MSISDN(电话号码)。我已经为两种情况创建了一个视图:

  1. 首先,我们需要检查哪些MSISDNs profile_id 16240处于非活动状态。这可以通过查询非活动数据不为空的数据库来完成。

  2. 由于GPRS我们有两个配置文件25054和16240,它发生在MSISDN 25054(用于互联网目的)是活动的和16240(用于GPRS不活动) 所以我们需要为此目的创建脚本。

  3. 我准备了一个查询:

    CREATE VIEW SUBSCR_INFO_VIEW AS
    SELECT subscr_no,account_no FROM CUSTOMER_PROFILE_DEF WHERE subscr_no NOT IN
    (SELECT DISTINCT(subscr_no) FROM CUSTOMER_ID_EQUIP_MAP
    WHERE inactive_date Is NOT NULL)
     AND (profile_id IN (16240) AND cutoff_end_dt IS NOT NULL) OR (profile_id IN (25054) AND profile_id NOT IN (16240) AND cutoff_end_dt IS NULL)
    
    SET ROWCOUNT 100 
    
    SELECT DISTINCT(subscr_no) FROM SUBSCR_INFO_VIEW 
    

    这将在所有22个客户服务器中受到影响,并且从单个客户获取数据需要2.5分钟。我想减少那个时间。请告诉我您的反馈意见。

1 个答案:

答案 0 :(得分:0)

如果不了解有关数据库结构的更多信息,这有点难以回答。您在CUSTOMER_PROFILE_DEF和CUSTOMER_ID_EQUIP_MAP表中有多少条记录,以及您拥有哪些密钥?另外,你的SQL在原帖中很难理解,我在下面重新格式化并做了一些小改动:

    CREATE VIEW 
        SUBSCR_INFO_VIEW 
    AS SELECT 
        subscr_no,
        account_no 
    FROM 
        CUSTOMER_PROFILE_DEF 
    WHERE 
        subscr_no 
    NOT IN (
            SELECT DISTINCT
                subscr_no
            FROM 
                CUSTOMER_ID_EQUIP_MAP 
            WHERE
                inactive_date Is NOT NULL
        ) 
    AND ((profile_id = 16240 AND cutoff_end_dt IS NOT NULL) 
    OR   (profile_id = 25054 AND cutoff_end_dt IS NULL))

    SET ROWCOUNT 100 -- This is just for testing?

    SELECT DISTINCT(subscr_no) FROM SUBSCR_INFO_VIEW

sql大致相同,但我将profile_id in (12345)语句更改为profile_id = 12345,因为值列表中只有一个值。