Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql JSON索引奇怪的查询时间_Sql_Postgresql_Jsonb - Fatal编程技术网

Postgresql JSON索引奇怪的查询时间

Postgresql JSON索引奇怪的查询时间,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,假设我们有这样的桌子: CREATE TABLE user_device_infos ( id integer NOT NULL DEFAULT nextval('user_device_infos_id_seq1'::regclass), user_id integer, data jsonb, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NO

假设我们有这样的桌子:

CREATE TABLE user_device_infos
(
  id integer NOT NULL DEFAULT nextval('user_device_infos_id_seq1'::regclass),
  user_id integer,
  data jsonb,
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL,
  CONSTRAINT user_device_infos_pkey PRIMARY KEY (id),
  CONSTRAINT fk_rails_e4001464ba FOREIGN KEY (user_id)
      REFERENCES public.users (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE INDEX index_user_device_infos_imei_user_id
  ON public.user_device_infos
  USING btree
  (((data -> 'Network'::text) ->> 'IMEI No'::text) COLLATE pg_catalog."default", user_id);

CREATE INDEX index_user_device_infos_on_user_id
  ON public.user_device_infos
  USING btree
  (user_id);
现在,我尝试从具有相同imei的第一个设备中选择用户\u id:

SELECT  user_id FROM user_device_infos WHERE (data->'Network'->>'IMEI No' = 'xxxx') order by id LIMIT 1
此查询在我的表上耗时5秒(152000个条目) 但是如果我写

SELECT  user_id FROM user_device_infos WHERE (data->'Network'->>'IMEI No' = 'xxxx') order by created_at asc LIMIT 1
SELECT  user_id FROM user_device_infos WHERE (data->'Network'->>'IMEI No' = 'xxxx') order by created_at desc LIMIT 1
查询时间少于1毫秒。 为什么这个查询比第一个变体快得多?在上没有创建索引,id是主键

Upd

正如评论中所建议的,我运行了explain-analyze,但仍然不理解“orderbyid”查询的错误。对不起,我不是sql开发人员

# explain analyze SELECT  user_id FROM user_device_infos WHERE (data->'Network'->>'IMEI No' = 'xxxx') order by id LIMIT 1;
                                                                         QUERY PLAN                                                                          
-------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.42..416.84 rows=1 width=8) (actual time=5289.784..5289.784 rows=0 loops=1)
   ->  Index Scan using user_device_infos_pkey on user_device_infos  (cost=0.42..316483.14 rows=760 width=8) (actual time=5289.782..5289.782 rows=0 loops=1)
         Filter: (((data -> 'Network'::text) ->> 'IMEI No'::text) = 'xxxx'::text)
         Rows Removed by Filter: 152437
 Planning time: 0.153 ms
 Execution time: 5289.817 ms
(6 rows)
# explain analyze SELECT  user_id FROM user_device_infos WHERE (data->'Network'->>'IMEI No' = 'xxxx') order by created_at LIMIT 1;
                                                                         QUERY PLAN                                                                         
------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=2823.73..2823.74 rows=1 width=12) (actual time=0.064..0.064 rows=0 loops=1)
   ->  Sort  (cost=2823.73..2825.63 rows=760 width=12) (actual time=0.062..0.062 rows=0 loops=1)
         Sort Key: created_at
         Sort Method: quicksort  Memory: 25kB
         ->  Bitmap Heap Scan on user_device_infos  (cost=22.31..2819.93 rows=760 width=12) (actual time=0.039..0.039 rows=0 loops=1)
               Recheck Cond: (((data -> 'Network'::text) ->> 'IMEI No'::text) = 'xxxx'::text)
               ->  Bitmap Index Scan on index_user_device_infos_imei_user_id  (cost=0.00..22.12 rows=760 width=0) (actual time=0.037..0.037 rows=0 loops=1)
                     Index Cond: (((data -> 'Network'::text) ->> 'IMEI No'::text) = 'xxxx'::text)
 Planning time: 0.144 ms
 Execution time: 0.092 ms
(10 rows)

EXPLAIN
或更好的
EXPLAIN analysis
命令应该告诉您更多请帮助我解释结果参见此处-第二次查询似乎使用了关于数据文件的更好算法
EXPLAIN
或更好的
EXPLAIN analysis
命令应该告诉您更多请帮助我解释结果参见此处-第二个查询似乎使用了关于数据文件的更好的算法