简化对Interbase DB的SQL查询

时间:2018-07-24 19:31:11

标签: sql performance firebase-realtime-database interbase

我有WPF应用程序,其任务是从Interbase DB拖动数据。请注意,该数据库位于远程网络设备上。另外,使用Firebird ado.net数据提供程序。

我的一个查询如下:

SELECT 
    T1.ind_st, 
    T2.ttt, 
    T2.tdtdtd, 
    sumr 
FROM   ((SELECT ind_st, 
               Sum(r) AS sumR 
        FROM   (SELECT ind_st, 
                       rrr AS r 
                FROM   srok_tel 
                WHERE  date_ch = '23.07.2018 0:00:00' 
                       AND srok_ch = '18' 
                       AND ind_st >= 33049 
                       AND ind_st <= 34717 
                UNION 
                SELECT ind_st, 
                       -rrr AS r 
                FROM   srok_tel 
                WHERE  date_ch = '23.07.2018 0:00:00' 
                       AND srok_ch = '12' 
                       AND ind_st >= 33049 
                       AND ind_st <= 34717 
                UNION 
                SELECT ind_st, 
                       rrr AS r 
                FROM   srok_tel 
                WHERE  date_ch = '24.07.2018 0:00:00' 
                       AND srok_ch IN ( 6, 12 ) 
                       AND ind_st >= 33049 
                       AND ind_st <= 34717) 
        GROUP  BY ind_st) T1 
        JOIN (SELECT ind_st, 
                     ttt, 
                     tdtdtd 
              FROM   srok_tel 
              WHERE  date_ch = '24.07.2018 0:00:00' 
                     AND srok_ch = '12' 
                     AND ind_st >= 33049 
                     AND ind_st <= 34717) T2 
          ON T1.ind_st = T2.ind_st) 

是的,很沉重,乍一看很难读,可能写错了,但是我的任务是用一个查询拖动所有数据,而我不是sql pro。

目标表(SROK_TEL)从中选择数据,包含大约10 ^ 7行。查询运行时间大约为90秒,这比我希望看到的要长得多。

关于如何使此查询更快运行的任何建议?

UPDATE1:应luisarcher的要求,我添加了一个查询计划(希望这正是他的要求)

PLAN JOIN (SORT ((T1 SROK_TEL NATURAL)
PLAN (T1 SROK_TEL NATURAL)
PLAN (T1 SROK_TEL NATURAL)), T2 SROK_TEL INDEX (PK_SROK_TEL))

1 个答案:

答案 0 :(得分:0)

不久前,我遇到了类似您的问题,因此,我将分享一些适用于您的情况的提示:

1)如果您不介意重复,则可以使用UNION ALL代替UNION。您可以了解为什么here

2)限制您使用的数据。这一点很重要;通过正确地从查询中删除不需要的数据(更具体的where子句,而不是选择无用的数据),我减少了大约90%的执行时间。

3)检查是否可以在表srok_tel中添加索引。