0

状態に非常に戸惑いました。「limit1」のインデックスなしの列のwhere条件でテーブルをクエリすると、非常に高速ですが、列にはインデックスがありません。次に例を示します。

--120000000データでテストテーブルを作成します

francs=> create table test_limit (id int4,name varchar(32));
CREATE TABLE

francs=> insert into test_limit select generate_series(1,20000000),generate_series(1,20000000) || 'a';
INSERT 0 20000000

francs=> \d test_limit;
         Table "francs.test_limit"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(32) | 

--2クエリテーブル

francs=> explain analyze select * from test_limit where id=1;
                                                 QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
 Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.028..3162.477 rows=1 loops=1)
   Filter: (id = 1)
 Total runtime: 3162.531 ms
(3 rows) 

予想どおり、非常に遅いのに約3162ミリ秒かかることに注意してください。</ p>

--「limit1」の原因を持つ3つのクエリテーブル

francs=> explain analyze select * from test_limit where id=1 limit 1;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.019..0.019 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.017..0.017 rows=1 loops=1)
         Filter: (id = 1)
 Total runtime: 0.047 ms
(4 rows)

約0.047ミリ秒しかかからないことに注意してください。非常に高速ですが、列IDにはインデックスがありません。誰でも説明できますか?どうもありがとう!

--4追加テスト

francs=> explain analyze select * from test_limit where id=2 limit 1;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.023..0.023 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.022..0.022 rows=1 loops=1)
         Filter: (id = 2)
 Total runtime: 0.066 ms
(4 rows)

francs=> explain analyze select * from test_limit where id=3 limit 1;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.022..0.022 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.021..0.021 rows=1 loops=1)
         Filter: (id = 3)
 Total runtime: 0.060 ms
(4 rows)

francs=> explain analyze select * from test_limit where id=101 limit 1;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.035..0.036 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.033..0.033 rows=1 loops=1)
         Filter: (id = 101)
 Total runtime: 0.075 ms
(4 rows)

francs=> explain analyze select * from test_limit where id=1001 limit 1;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.192..0.192 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=0.190..0.190 rows=1 loops=1)
         Filter: (id = 1001)
 Total runtime: 0.231 ms
(4 rows)

添加テストから、それも非常に速いことがわかります。

--5最終テスト

francs=> explain analyze select * from test_limit where id=9999999 limit 1;
                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=1379.153..1379.154 rows=1 loops=1)
   ->  Seq Scan on test_limit  (cost=0.00..358111.05 rows=1 width=13) (actual time=1379.151..1379.151 rows=1 loops=1)
         Filter: (id = 9999999)
 Total runtime: 1379.206 ms
(4 rows)

上記から、私は9999999である後のIDを使用します、それは今遅いです; 私は今理解しました、ありがとう!

4

1 に答える 1

3

「id=1」はテーブルの非常に早い段階にあるため、テーブルを順番に読み取ると、その行にすばやくヒットします。「limit = 1」と言ったので、最初の結果の後で停止できます。

または、キャッシュも含まれる可能性があります。

于 2012-09-11T07:51:03.910 に答える