Улучшение результатов запроса между временными метками (эпоха) - PullRequest
0 голосов
/ 04 июля 2018

У меня есть таблица, в которой одно поле записывает timestamp во время эпохи, и у меня есть несколько запросов, которые должны возвращать результаты, используя «диапазон» времени.

Е.Г.

where timestamp >= 1512000000 and timestamp <=1513000000

У меня настроен индекс для timestamp, но результаты запроса занимают довольно много времени.

ОБЪЯСНИТЕ ПЛАН ЗАПРОСА:

SEARCH TABLE data USING INDEX timestamp_idx (timestamp>? AND timestamp<?)

Я немного читал о древовидных структурах, но совершенно не понимаю, как реализовать их в существующей системе.

Включая полный EXPLAIN (отредактированный) запрос. Это сложнее, чем хотелось бы

sqlite> explain select fielda , timestamp , fieldb from (select fielda , timestamp , fieldb from main.db ) where timestamp >= a and timestamp <= b and fieldb in (x , x , x , x , x , x ) limit 0, -1;
addr  opcode         p1    p2    p3    p4             p5  comment      
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     46    0                    00  Start at 46  
1     Integer        -1    1     0                    00  r[1]=-1; LIMIT counter
2     Integer        20    2     0                    00  r[2]=20      
3     MustBeInt      2     0     0                    00  OFFSET counter
4     OffsetLimit    1     3     2                    00  if r[1]>0 then r[3]=r[1]+max(0,r[2]) else r[3]=(-1); LIMIT+OFFSET
5     OpenRead       1     2     0     18             00  root=2 iDb=0; db
6     OpenRead       2     4     0     k(2,,)         02  root=4 iDb=0; fieldb_idx
7     Once           0     27    0                    00               
8     OpenEphemeral  4     1     0     k(1,B)         00  nColumn=1    
9     Integer        103   5     0                    00  r[5]=103     
10    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
11    IdxInsert      4     6     5     1              00  key=r[6]     
12    Integer        108   5     0                    00  r[5]=108     
13    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
14    IdxInsert      4     6     5     1              00  key=r[6]     
15    Integer        104   5     0                    00  r[5]=104     
16    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
17    IdxInsert      4     6     5     1              00  key=r[6]     
18    Integer        109   5     0                    00  r[5]=109     
19    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
20    IdxInsert      4     6     5     1              00  key=r[6]     
21    Integer        105   5     0                    00  r[5]=105     
22    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
23    IdxInsert      4     6     5     1              00  key=r[6]     
24    Integer        110   5     0                    00  r[5]=110     
25    MakeRecord     5     1     6     D              00  r[6]=mkrec(r[5])
26    IdxInsert      4     6     5     1              00  key=r[6]     
27    Rewind         4     45    0                    00               
28      Column         4     0     4                    00  r[4]=        
29      IsNull         4     44    0                    00  if r[4]==NULL goto 44
30      Affinity       4     1     0     D              00  affinity(r[4])
31      SeekGE         2     44    4     1              00  key=r[4]     
32        IdxGT          2     44    4     1              00  key=r[4]     
33        DeferredSeek   2     0     1                    00  Move 1 to 2.rowid if needed
34        Column         1     0     6                    00  r[6]=db.timestamp
35        Lt             7     43    6     (BINARY)       54  if r[6]<r[7] goto 43
36        Gt             8     43    6     (BINARY)       54  if r[6]>r[8] goto 43
37        IfPos          2     43    1                    00  if r[2]>0 then r[2]-=1, goto 43; OFFSET
38        Column         1     17    9                    00  r[9]=db.fielda
39        Copy           6     10    0                    00  r[10]=r[6]   
40        Column         2     0     11                   00  r[11]=db.fieldb
41        ResultRow      9     3     0                    00  output=r[9..11]
42        DecrJumpZero   1     45    0                    00  if (--r[1])==0 goto 45
43      Next           2     32    0                    00               
44    NextIfOpen     4     28    0                    00               
45    Halt           0     0     0                    00               
46    Transaction    0     0     3     0              01  usesStmtJournal=0
47    Integer        1519862400  7     0                    00  r[7]=1519862400
48    Integer        1522540800  8     0                    00  r[8]=1522540800
49    Goto           0     1     0                    00    
...