我有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))
答案 0 :(得分:0)
不久前,我遇到了类似您的问题,因此,我将分享一些适用于您的情况的提示:
1)如果您不介意重复,则可以使用UNION ALL
代替UNION
。您可以了解为什么here
2)限制您使用的数据。这一点很重要;通过正确地从查询中删除不需要的数据(更具体的where子句,而不是选择无用的数据),我减少了大约90%的执行时间。
3)检查是否可以在表srok_tel
中添加索引。