У меня есть таблица с именем «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