一个简单而无害的左连接如何使查询变得如此缓慢?

时间:2014-05-30 01:12:15

标签: postgresql postgresql-9.2

为什么对特定表格进行简单且“无害”的LEFT JOIN会对性能结果产生如此大的影响?我在查询中有一个主表“mposicao”,它在左连接上的两个表上相关,两个表中的一个相关,如果单独的话,查询只需要9.041毫秒来给出结果,在这种情况下我是谈论“mposicao_telemetria”,但是当我添加第二个表“mposicao_rastreador”时,它通过取68726.797 ms给出结果来扭曲整个查询,事实是两个相关的表都正确配置了外键并且都是索引外来的key,为什么查询的性能和计划执行的差异,两个表具有相同的行数,而第二个相关的表遇到麻烦的列比第一个工作正常的相关表的列少。 / p>

EXPLAIN ANALYSE VERBOSE
  SELECT *
    FROM mposicao mp
    LEFT JOIN mposicao_telemetria mt ON mp.id_posicao = mt.id_posicao
    LEFT JOIN mposicao_rastreador mpr ON mp.id_posicao = mpr.id_posicao
  WHERE
    mp.id_veiculo = 508
    AND mp.dt_gps >= TIMESTAMP '2014-05-29 00:00'
    AND mp.dt_gps <= TIMESTAMP '2014-05-29 09:03'
    AND mp.bl_ativo = true
  ORDER BY mp.dt_gps DESC, mp.dt_servidor DESC
  LIMIT 10;

上述查询的分析结果为68726.797 ms:http://explain.depesz.com/s/l7M

 Limit  (cost=760284.22..760284.24 rows=10 width=269) (actual time=68726.570..68726.572 rows=10 loops=1)
       Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo, mp.dt_gps, mp.dt_servidor
   ->  Sort  (cost=760284.22..760284.28 rows=26 width=269) (actual time=68726.568..68726.570 rows=10 loops=1)
         Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo, mp.dt_gps, mp.dt_servidor
         Sort Key: mp.dt_gps, mp.dt_servidor
         Sort Method: top-N heapsort  Memory: 27kB
         ->  Hash Right Join  (cost=378522.63..760283.65 rows=26 width=269) (actual time=40387.302..68725.334 rows=575 loops=1)
               Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo, mp.dt_gps, mp.dt_servidor
               Hash Cond: (mpr.id_posicao = mp.id_posicao)
               ->  Seq Scan on public.mposicao_rastreador mpr  (cost=0.00..320161.83 rows=16426383 width=41) (actual time=5.613..31091.401 rows=16417112 loops=1)
                     Output: mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo
               ->  Hash  (cost=378522.30..378522.30 rows=26 width=228) (actual time=35838.996..35838.996 rows=575 loops=1)
                     Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
                     Buckets: 1024  Batches: 1  Memory Usage: 97kB
                     ->  Hash Right Join  (cost=115.92..378522.30 rows=26 width=228) (actual time=13671.753..35835.286 rows=575 loops=1)
                           Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
                           Hash Cond: (mt.id_posicao = mp.id_posicao)
                           ->  Seq Scan on public.mposicao_telemetria mt  (cost=0.00..321570.01 rows=15156301 width=100) (actual time=4.370..33948.739 rows=15692493 loops=1)
                                 Output: mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
                           ->  Hash  (cost=115.60..115.60 rows=26 width=128) (actual time=1.186..1.186 rows=575 loops=1)
                                 Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9
                                 Buckets: 1024  Batches: 1  Memory Usage: 67kB
                                 ->  Index Scan using mposicao_veiculo_gps on public.mposicao mp  (cost=0.00..115.60 rows=26 width=128) (actual time=0.038..1.054 rows=575 loops=1)
                                       Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9
                                       Index Cond: ((mp.id_veiculo = 508) AND (mp.dt_gps >= '2014-05-29 00:00:00'::timestamp without time zone) AND (mp.dt_gps <= '2014-05-29 09:03:00'::timestamp without time zone))
                                       Filter: mp.bl_ativo
 Total runtime: 68726.797 ms

但是当我为“mposicao_rastreador”删除第二个左连接时,查询只需要9.041毫秒即可返回结果。为什么会有这么大的差异呢?

http://explain.depesz.com/s/9pBV

 Limit  (cost=1402.40..293088.75 rows=10 width=228) (actual time=0.304..8.918 rows=10 loops=1)
   Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mp.dt_gps, mp.dt_servidor
   ->  Nested Loop Left Join  (cost=1402.40..730618.27 rows=25 width=228) (actual time=0.304..8.914 rows=10 loops=1)
         Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mp.dt_gps, mp.dt_servidor
         ->  Index Scan using id_time_order on public.mposicao mp  (cost=0.00..71365.43 rows=25 width=128) (actual time=0.284..8.770 rows=10 loops=1)
               Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9
               Index Cond: ((mp.dt_gps >= '2014-05-29 00:00:00'::timestamp without time zone) AND (mp.dt_gps <= '2014-05-29 09:03:00'::timestamp without time zone))
               Filter: (mp.bl_ativo AND (mp.id_veiculo = 508))
               Rows Removed by Filter: 4671
         ->  Bitmap Heap Scan on public.mposicao_telemetria mt  (cost=1402.40..25612.29 rows=75782 width=100) (actual time=0.010..0.010 rows=1 loops=10)
               Output: mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
               Recheck Cond: (mp.id_posicao = mt.id_posicao)
               ->  Bitmap Index Scan on mposicao_telemetria_posicao  (cost=0.00..1383.46 rows=75782 width=0) (actual time=0.007..0.007 rows=1 loops=10)
                     Index Cond: (mp.id_posicao = mt.id_posicao)
 Total runtime: 9.041 ms

表的索引配置为:

mposicao

Indexes:
    "mposicao_pkey" PRIMARY KEY, btree (id_posicao)
    "id_time_order" btree (dt_gps DESC, dt_servidor DESC)
    "mposicao_equip_gps" btree (id_equip, dt_gps)
    "mposicao_id_equip_idx" btree (id_equip)
    "mposicao_id_veiculo_idx" btree (id_veiculo)
    "mposicao_vec_pos" btree (id_veiculo, id_posicao)
    "mposicao_veiculo_gps" btree (id_veiculo, dt_gps)
    "mposicao_veiculo_gps_pos" btree (id_veiculo, dt_gps, id_posicao)
    "mposicao_veiculo_servidor" btree (id_veiculo, dt_servidor)
    "mpsoicao_vec_equip" btree (id_veiculo, id_equip)

mposicao_telemetria

Indexes:
    "mposicao_telemetria_pkey" PRIMARY KEY, btree (id_posicao_telemetria)
    "mposicao_telemetria_posicao" btree (id_posicao)
Foreign-key constraints:
    "cpesfk" FOREIGN KEY (id_pessoa) REFERENCES cpessoa_fisica(id)
    "mposfk" FOREIGN KEY (id_posicao) REFERENCES mposicao(id_posicao)

mposicao_rastreador

Indexes:
    "mposicao_rastreador_pkey" PRIMARY KEY, btree (id_posicao_rastreador)
    "mposicao_rastreador_posicao" btree (id_posicao)
Foreign-key constraints:
    "mposfk" FOREIGN KEY (id_posicao) REFERENCES mposicao(id_posicao)

我试图重新创建索引,扩展了work_mem甚至对表执行了真空,但没有真正起作用,我只是不知道我缺少什么,两个表如何以相同的方式配置相同的索引和相同的行数可以有不同的关联,问题只出现在第二个相关的表上,因为即使我只涉及第二个表,问题仍然存在。

我的PostgreSQL版本:

PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit

更新

我尝试过克雷格所说的,我将random_page_cost从4.0减少到1.0,现在只需要4.146毫秒的查询时间为68726.797毫秒,但这些设置对生产的影响是什么?

 Limit  (cost=0.00..547789.51 rows=10 width=269) (actual time=0.211..4.013 rows=10 loops=1)
   Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo, mp.dt_gps, mp.dt_servidor
   ->  Nested Loop Left Join  (cost=0.00..1259915.87 rows=23 width=269) (actual time=0.211..4.011 rows=10 loops=1)
         Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction, mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo, mp.dt_gps, mp.dt_servidor
         ->  Nested Loop Left Join  (cost=0.00..616585.46 rows=23 width=228) (actual time=0.204..3.968 rows=10 loops=1)
               Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9, mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
               ->  Index Scan using id_time_order on public.mposicao mp  (cost=0.00..17226.86 rows=23 width=128) (actual time=0.192..3.907 rows=10 loops=1)
                     Output: mp.id_posicao, mp.id_veiculo, mp.id_login, mp.id_equip, mp.dt_gps, mp.dt_servidor, mp.nr_lat, mp.nr_lon, mp.nr_direcao, mp.nr_velocidade, mp.nr_dpercorr, mp.nr_azimute, mp.nr_raio, mp.bl_poschave, mp.bl_porta, mp.bl_bloqueado, mp.bl_sirene, mp.bl_setas, mp.bl_panico, mp.bl_excesso_vel, mp.bl_cerca, mp.bl_desenergizado, mp.nr_evento, mp.bl_entrada_1, mp.bl_entrada_2, mp.bl_entrada_3, mp.bl_entrada_4, mp.bl_entrada_5, mp.bl_entrada_6, mp.bl_saida_1, mp.bl_saida_2, mp.bl_saida_3, mp.bl_saida_4, mp.bl_saida_5, mp.bl_saida_6, mp.nr_satelites, mp.bl_ativo, mp.bl_gprs, mp.bl_memory, mp.bl_excesso_rpm, mp.input1, mp.input2, mp.input3, mp.input4, mp.input5, mp.input6, mp.input7, mp.input8, mp.input9
                     Index Cond: ((mp.dt_gps >= '2014-05-29 00:00:00'::timestamp without time zone) AND (mp.dt_gps <= '2014-05-29 09:03:00'::timestamp without time zone))
                     Filter: (mp.bl_ativo AND (mp.id_veiculo = 508))
                     Rows Removed by Filter: 4734
               ->  Index Scan using mposicao_telemetria_posicao on public.mposicao_telemetria mt  (cost=0.00..25289.54 rows=76953 width=100) (actual time=0.005..0.005 rows=1 loops=10)
                     Output: mt.id_posicao_telemetria, mt.id_posicao, mt.nr_rpm, mt.nr_horimetro, mt.dt_last_update, mt.bl_ativo, mt.id_pessoa, mt.nr_temperatura1, mt.nr_temperatura2, mt.nr_temperatura3, mt.nr_vel_sensor, mt.nr_horimetro_revalidate, mt.nr_gprs_quality, mt.nr_direction
                     Index Cond: (mp.id_posicao = mt.id_posicao)
         ->  Index Scan using mposicao_rastreador_posicao on public.mposicao_rastreador mpr  (cost=0.00..27134.05 rows=83684 width=41) (actual time=0.003..0.003 rows=1 loops=10)
               Output: mpr.id_posicao_rastreador, mpr.id_posicao, mpr.nr_voltagem_main, mpr.nr_voltagem_backup, mpr.dt_last_update, mpr.bl_ativo
               Index Cond: (mp.id_posicao = mpr.id_posicao)
 Total runtime: 4.146 ms

0 个答案:

没有答案