Проблема производительности с простым запросом выбора (с использованием индексов) в SQLite3 - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица с именем «waveforms» с 525k строк. Каждая строка содержит 7 столбцов. Индексируются только первые 5 столбцов, поскольку я использую их в запросе.

У меня есть al oop, который вызывает запрос на выборку 152 905 раз с разными входами. Это занимает ~ 5 минут до конца sh, то есть ~ 2 мс на вызов или ~ 500 запросов в секунду (QPS).

Я думаю, что 500 QPS немного медленный для типа запроса, который я делаю. Что еще я могу сделать, чтобы улучшить производительность?

python и версия sqlite

Python 3.7.5

print(sqlite3.version): 2.6.0

машина

Процессор Intel® Core Core ™ (TM) i7-4650U @ 1,70 ГГц с 4 процессорами (ноутбук)

Диск: SK hynix SH920 mSATA 256 ГБ (средний 4K) -64Точка смешанной скорости ввода-вывода 108 МБ / с) c .f. бенчмарк

ОЗУ: 8 ГБ

Создать таблицу

CREATE TABLE "waveforms" (
    "sc_id" integer,
    "time"  REAL,
    "XYpos" TEXT NOT NULL,
    "NET"   TEXT NOT NULL,
    "simulator" TEXT NOT NULL,
    "CAT"   integer DEFAULT 9,
    "csv_file"  BLOB NOT NULL,
    FOREIGN KEY("sc_id") REFERENCES "scs"("id"),
    UNIQUE("sc_id","time","XYpos","NET","simulator")
)

Индекс

CREATE INDEX "index_waveform" ON "waveforms" (
    "sc_id",
    "time",
    "XYpos",
    "NET",
    "simulator"
)

объяснить план запроса

explain query plan SELECT sc_id, time, XYpos, NET, simulator  FROM waveforms INDEXED BY index_waveform WHERE XYpos="111.95_115.80" AND sc_id=1 AND time=3.98e-09 AND NET="NET_X" AND simulator="simX";
QUERY PLAN
`--SEARCH TABLE waveforms USING COVERING INDEX index_waveform (XYpos=? AND NET=? AND sc_id=? AND time=? AND simulator=?)

объясните

explain SELECT sc_id, time, XYpos, NET, simulator  FROM waveforms INDEXED BY index_waveform WHERE XYpos="111.95_115.80" AND sc_id=1 AND time=3.98e-09 AND NET="NET_X" AND simulator="simX";
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     18    0                    00  Start at 18  
1     OpenRead       1     61730  0     k(6,,,,,,)     02  root=61730 iDb=0; index_waveform
2     Integer        1     1     0                    00  r[1]=1       
3     Real           0     2     0     3.98e-09       00  r[2]=3.98e-09
4     String8        0     3     0     111.95_115.80  00  r[3]='111.95_115.80'
5     String8        0     4     0     NET_X  00  r[4]='NET_X'
6     String8        0     5     0     simX  00  r[5]='simX'
7     SeekGE         1     17    1     5              00  key=r[1..5]  
8       IdxGT          1     17    1     5              00  key=r[1..5]  
9       Column         1     0     6                    00  r[6]=waveforms.sc_id
10      Column         1     1     7                    00  r[7]=waveforms.time
11      RealAffinity   7     0     0                    00               
12      Column         1     2     8                    00  r[8]=waveforms.XYpos
13      Column         1     3     9                    00  r[9]=waveforms.NET
14      Column         1     4     10                   00  r[10]=waveforms.simulator
15      ResultRow      6     5     0                    00  output=r[6..10]
16    Next           1     8     1                    00               
17    Halt           0     0     0                    00               
18    Transaction    0     0     7     0              01  usesStmtJournal=0
19    Goto           0     1     0                    00               

Некоторые PRAGMAS:

Auto Vacuum: None
Automatic IndeX: yes
Foreign Keys: yes
Journal Mode: WAL
Journal Size Limit: -1
Locking Mode: Normal
Max Page Count: 1073741823
Page Size: 4096
Secure Delete: yes
Synchronous: Normal
Temp Store: Default
WAL Auto Checkpoint: 1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...