sqlite_test.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. package sqlite_test
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. "math/rand"
  7. "reflect"
  8. "runtime"
  9. "strconv"
  10. "strings"
  11. "testing"
  12. "time"
  13. "github.com/spf13/cast"
  14. )
  15. func TestSQLiteBasic(t *testing.T) {
  16. // sqlite 内存表结构中字段类型只有 int64 float64 string, string没有长度限制
  17. // create table 中指定的类型没有意义,不影响数据插入
  18. // 实际数据类型是 由 第一次插入的数据的类型 决定的
  19. // 查询时,后续数据会强制转换为该类型,转不过去会报错,如将非数字字符串转换为数值
  20. mdb, err := sql.Open("sqlite", ":memory:")
  21. if err != nil {
  22. println("err", fmt.Sprint(err))
  23. return
  24. }
  25. stmt, err := mdb.Prepare(`CREATE TABLE TEST(
  26. ID INT PRIMARY KEY NOT NULL,
  27. NAME TEXT NOT NULL,
  28. VALUE REAL NOT NULL,
  29. INTVALUE INT NOT NULL,
  30. DESC CHAR(1)
  31. )`)
  32. if err != nil {
  33. println("err", fmt.Sprint(err))
  34. return
  35. }
  36. rslt, err := stmt.Exec()
  37. if err != nil {
  38. println("err", fmt.Sprint(err))
  39. return
  40. }
  41. println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  42. stmt, err = mdb.Prepare("insert into test(id,name,intvalue,value,desc) values(?,?,?,?,?)")
  43. if err != nil {
  44. println("err", fmt.Sprint(err))
  45. return
  46. }
  47. for i := 1; i < 10; i++ {
  48. id := string([]byte{})
  49. for n := 0; n < 16; n++ {
  50. id = id + string('a'+byte(n+i-1))
  51. }
  52. name := int64(30 + i)
  53. floatvalue := int64(12345)
  54. var intvalue interface{}
  55. intvalue = 1.2345 * float32(i)
  56. if i%3 == 0 {
  57. intvalue = "--12345--"
  58. } else if i%3 == 2 {
  59. intvalue = 123450 + i
  60. }
  61. desc := string("........................................................................................")
  62. rslt, err = stmt.Exec(id, name, intvalue, floatvalue, desc)
  63. if err != nil {
  64. println("err", fmt.Sprint(err))
  65. }
  66. println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  67. }
  68. stmt, err = mdb.Prepare("select * from test")
  69. if err != nil {
  70. println("err", fmt.Sprint(err))
  71. return
  72. }
  73. rows, err := stmt.Query()
  74. if err != nil {
  75. println("err", fmt.Sprint(err))
  76. return
  77. }
  78. defer func() { _ = rows.Close() }()
  79. cols, err := rows.Columns()
  80. if err != nil {
  81. println("err", fmt.Sprint(err))
  82. return
  83. }
  84. colTypes, err := rows.ColumnTypes()
  85. if err != nil {
  86. println("err", fmt.Sprint(err))
  87. return
  88. }
  89. types := make([]reflect.Type, len(colTypes))
  90. for i, tp := range colTypes {
  91. st := tp.ScanType()
  92. if st == nil {
  93. continue
  94. }
  95. types[i] = st
  96. }
  97. for rows.Next() {
  98. values := make([]interface{}, len(cols))
  99. for i := range values {
  100. values[i] = reflect.New(types[i]).Interface()
  101. }
  102. if err = rows.Scan(values...); err != nil {
  103. println("err", fmt.Sprint(err))
  104. return
  105. }
  106. m := make(map[string]interface{})
  107. for i, v := range values {
  108. if v == nil {
  109. //values[i] = nil
  110. m[colTypes[i].Name()] = nil
  111. } else {
  112. n, ok := colTypes[i].Length()
  113. m[colTypes[i].Name()] = fmt.Sprint(types[i], "[", n, "]", ok, ":", reflect.ValueOf(v).Elem().Interface())
  114. }
  115. }
  116. bs, _ := json.MarshalIndent(m, "", " ")
  117. println("values", string(bs))
  118. }
  119. }
  120. func TestSQLiteProfmance(t *testing.T) {
  121. runtime.GOMAXPROCS(1)
  122. println("GOMAXPROCS ", runtime.GOMAXPROCS(0))
  123. varfieldscount := 100
  124. println("Fields count ", varfieldscount+4)
  125. emptyfieldscount := 100
  126. println("Empty Fields count ", emptyfieldscount)
  127. vardatalength := 32
  128. println("VarFields data length ", vardatalength)
  129. datacount := 10000
  130. println("Data count ", datacount)
  131. st := time.Now()
  132. mdb, err := sql.Open("sqlite", ":memory:")
  133. // mdb, err := sql.Open("sqlite", "file::memory:?cache=shared")
  134. if err != nil {
  135. println("err", fmt.Sprint(err))
  136. }
  137. fields := "id,name,value,desc"
  138. askmarks := "?,?,?,?"
  139. for i := 1; i <= varfieldscount; i++ {
  140. fields += ",var" + strconv.Itoa(i)
  141. askmarks += ",?"
  142. }
  143. allfields := fields
  144. for i := varfieldscount + 1; i <= varfieldscount+emptyfieldscount; i++ {
  145. allfields += ",var" + strconv.Itoa(i)
  146. }
  147. stmt, err := mdb.Prepare("create table if not exists test(" + allfields + ")")
  148. if err != nil {
  149. println("err", fmt.Sprint(err))
  150. return
  151. }
  152. rslt, err := stmt.Exec()
  153. if err != nil {
  154. println("err", fmt.Sprint(err))
  155. return
  156. }
  157. if rslt == nil {
  158. println("sqlite init table return nil")
  159. } else {
  160. id, err := rslt.LastInsertId()
  161. if err != nil {
  162. println("err", fmt.Sprint(err))
  163. return
  164. }
  165. ra, err := rslt.RowsAffected()
  166. if err != nil {
  167. println("err", fmt.Sprint(err))
  168. return
  169. }
  170. if id != 0 || ra != 0 {
  171. println("sqlite init table return ", id, ra)
  172. }
  173. }
  174. println("sqlite create table use time ", time.Since(st).String())
  175. st = time.Now()
  176. stmt, err = mdb.Prepare("create index test_id_1 on test (id)")
  177. if err != nil {
  178. println("err", fmt.Sprint(err))
  179. return
  180. }
  181. rslt, err = stmt.Exec()
  182. if err != nil {
  183. println("err", fmt.Sprint(err))
  184. return
  185. }
  186. if rslt == nil {
  187. println("sqlite init table index return nil")
  188. } else {
  189. id, err := rslt.LastInsertId()
  190. if err != nil {
  191. println("err", fmt.Sprint(err))
  192. return
  193. }
  194. ra, err := rslt.RowsAffected()
  195. if err != nil {
  196. println("err", fmt.Sprint(err))
  197. return
  198. }
  199. if id != 0 || ra != 0 {
  200. println("sqlite init table index return ", id, ra)
  201. }
  202. }
  203. println("sqlite create index use time ", time.Since(st).String())
  204. st = time.Now()
  205. data := []map[string]interface{}{}
  206. for i := 1; i <= datacount; i++ {
  207. m := map[string]interface{}{}
  208. m["id"] = i
  209. m["name"] = fmt.Sprint("name", i)
  210. m["value"] = 1.23456789 * float64(i)
  211. m["desc"] = strings.Repeat(fmt.Sprint("desc", i, "."), 10)
  212. for vi := 1; vi <= varfieldscount; vi++ {
  213. bs := make([]byte, vardatalength+rand.Intn(10)-5)
  214. for bsi := 0; bsi < len(bs); bsi++ {
  215. bs[bsi] = byte(32 + rand.Intn(95))
  216. }
  217. m["var"+strconv.Itoa(vi)] = string(bs)
  218. }
  219. data = append(data, m)
  220. // if i%10000 == 0 {
  221. // println("generate maps ", i, " use time ", time.Since(st).String())
  222. // }
  223. }
  224. println("generate maps ", datacount, " use time ", time.Since(st).String())
  225. st = time.Now()
  226. {
  227. mdb.Exec("PRAGMA synchronous = OFF") // 这个跟写文件相关,内存模式没用
  228. mdb.Exec("begin")
  229. stmt, err = mdb.Prepare("insert into test(" + fields + ") values(" + askmarks + ")")
  230. if err != nil {
  231. println("err", fmt.Sprint(err))
  232. return
  233. }
  234. for _, d := range data {
  235. args := []interface{}{
  236. d["id"],
  237. d["name"],
  238. d["value"],
  239. d["desc"]}
  240. for vi := 1; vi <= varfieldscount; vi++ {
  241. args = append(args, d["var"+strconv.Itoa(vi)])
  242. }
  243. rslt, err = stmt.Exec(args...)
  244. if err != nil {
  245. println("err", fmt.Sprint(err))
  246. }
  247. // println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  248. // if (i+1)%10000 == 0 {
  249. // println("sqlite insert ", (i + 1), " use time ", time.Since(st).String())
  250. // }
  251. }
  252. mdb.Exec("commit")
  253. mdb.Exec("PRAGMA synchronous = NORMAL") // 这个跟写文件相关,内存模式没用
  254. println("sqlite insert with transaction ", len(data), " use time ", time.Since(st).String())
  255. }
  256. st = time.Now()
  257. tx, err := mdb.Begin()
  258. if err != nil {
  259. println("err", fmt.Sprint(err))
  260. return
  261. }
  262. stmt, err = tx.Prepare("insert into test(" + fields + ") values(" + askmarks + ")")
  263. if err != nil {
  264. println("err", fmt.Sprint(err))
  265. return
  266. }
  267. for _, d := range data {
  268. args := []interface{}{
  269. d["id"],
  270. d["name"],
  271. d["value"],
  272. d["desc"]}
  273. for vi := 1; vi <= varfieldscount; vi++ {
  274. args = append(args, d["var"+strconv.Itoa(vi)])
  275. }
  276. rslt, err = stmt.Exec(args...)
  277. if err != nil {
  278. println("err", fmt.Sprint(err))
  279. }
  280. // println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  281. // if (i+1)%10000 == 0 {
  282. // println("sqlite insert ", (i + 1), " use time ", time.Since(st).String())
  283. // }
  284. }
  285. tx.Commit()
  286. println("sqlite insert with transaction ", len(data), " use time ", time.Since(st).String())
  287. st = time.Now()
  288. stmt, err = mdb.Prepare("insert into test(" + fields + ") values(" + askmarks + ")")
  289. if err != nil {
  290. println("err", fmt.Sprint(err))
  291. return
  292. }
  293. for _, d := range data {
  294. args := []interface{}{
  295. d["id"],
  296. d["name"],
  297. d["value"],
  298. d["desc"]}
  299. for vi := 1; vi <= varfieldscount; vi++ {
  300. args = append(args, d["var"+strconv.Itoa(vi)])
  301. }
  302. rslt, err = stmt.Exec(args...)
  303. if err != nil {
  304. println("err", fmt.Sprint(err))
  305. }
  306. // println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  307. // if (i+1)%10000 == 0 {
  308. // println("sqlite insert ", (i + 1), " use time ", time.Since(st).String())
  309. // }
  310. }
  311. println("sqlite insert immediately prepare ", len(data), " use time ", time.Since(st).String())
  312. st = time.Now()
  313. for _, d := range data {
  314. args := []interface{}{
  315. d["id"],
  316. d["name"],
  317. d["value"],
  318. d["desc"]}
  319. for vi := 1; vi <= varfieldscount; vi++ {
  320. args = append(args, d["var"+strconv.Itoa(vi)])
  321. }
  322. sql := "insert into test(" + fields + ") values("
  323. for i, arg := range args {
  324. if i > 0 {
  325. sql += ","
  326. }
  327. switch a := arg.(type) {
  328. case string:
  329. sql += "'" + strings.ReplaceAll(a, "'", "''") + "'"
  330. default:
  331. sql += fmt.Sprint(arg)
  332. }
  333. }
  334. sql += ")"
  335. rslt, err = mdb.Exec(sql)
  336. if err != nil {
  337. println("err", fmt.Sprint(err))
  338. }
  339. // println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  340. // if (i+1)%10000 == 0 {
  341. // println("sqlite insert ", (i + 1), " use time ", time.Since(st).String())
  342. // }
  343. }
  344. println("sqlite insert immediately ", len(data), " use time ", time.Since(st).String())
  345. st = time.Now()
  346. stmt, err = mdb.Prepare("select * from test")
  347. if err != nil {
  348. println("err", fmt.Sprint(err))
  349. return
  350. }
  351. rows, err := stmt.Query()
  352. if err != nil {
  353. println("err", fmt.Sprint(err))
  354. return
  355. }
  356. println("sqlite select query all", " use time ", time.Since(st).String())
  357. defer func() { _ = rows.Close() }()
  358. cols, err := rows.Columns()
  359. if err != nil {
  360. println("err", fmt.Sprint(err))
  361. return
  362. }
  363. colTypes, err := rows.ColumnTypes()
  364. if err != nil {
  365. println("err", fmt.Sprint(err))
  366. return
  367. }
  368. types := make([]reflect.Type, len(colTypes))
  369. for i, tp := range colTypes {
  370. st := tp.ScanType()
  371. if st == nil {
  372. continue
  373. }
  374. types[i] = st
  375. }
  376. data = []map[string]interface{}{}
  377. for rows.Next() {
  378. values := make([]interface{}, len(cols))
  379. for i := range values {
  380. if types[i] == nil {
  381. values[i] = &[]byte{}
  382. } else {
  383. values[i] = reflect.New(types[i]).Interface()
  384. }
  385. }
  386. if err = rows.Scan(values...); err != nil {
  387. println("err", fmt.Sprint(err))
  388. return
  389. }
  390. m := make(map[string]interface{})
  391. for i, v := range values {
  392. if v == nil {
  393. //values[i] = nil
  394. m[colTypes[i].Name()] = nil
  395. } else {
  396. n, ok := colTypes[i].Length()
  397. m[colTypes[i].Name()] = fmt.Sprint(types[i], "[", n, "]", ok, ":", reflect.ValueOf(v).Elem().Interface())
  398. }
  399. }
  400. data = append(data, m)
  401. // if len(data)%10000 == 0 {
  402. // println("sqlite fetch data ", len(data), " use time ", time.Since(st).String())
  403. // }
  404. }
  405. println("sqlite fetch data ", len(data), " use time ", time.Since(st).String())
  406. st = time.Now()
  407. memdataset := map[string]map[string]interface{}{}
  408. for _, d := range data {
  409. id := cast.ToString(d["id"])
  410. memdataset[id] = d
  411. }
  412. println("put id-data maps ", len(memdataset), " use time ", time.Since(st).String())
  413. st = time.Now()
  414. ids := []string{}
  415. for id, d := range memdataset {
  416. if id == d["id"] {
  417. ids = append(ids, id)
  418. }
  419. }
  420. println("fetch maps data ids ", len(ids), " use time ", time.Since(st).String())
  421. st = time.Now()
  422. data = []map[string]interface{}{}
  423. for _, id := range ids {
  424. d := memdataset[id]
  425. data = append(data, d)
  426. }
  427. println("fetch maps data ", len(data), " use time ", time.Since(st).String())
  428. }
  429. func TestSQLiteJSON(t *testing.T) {
  430. // sqlite 内存表结构中字段类型只有 int64 float64 string, string没有长度限制
  431. // create table 中指定的类型没有意义,不影响数据插入
  432. // 实际数据类型是 由 第一次插入的数据的类型 决定的
  433. // 查询时,后续数据会强制转换为该类型,转不过去会报错,如将非数字字符串转换为数值
  434. mdb, err := sql.Open("sqlite", ":memory:")
  435. if err != nil {
  436. println("err", fmt.Sprint(err))
  437. return
  438. }
  439. stmt, err := mdb.Prepare(`CREATE TABLE TEST(
  440. ID INT PRIMARY KEY NOT NULL,
  441. NAME TEXT NOT NULL,
  442. VALUE REAL NOT NULL,
  443. INTVALUE INT NOT NULL,
  444. DESC CHAR(1)
  445. )`)
  446. if err != nil {
  447. println("err", fmt.Sprint(err))
  448. return
  449. }
  450. rslt, err := stmt.Exec()
  451. if err != nil {
  452. println("err", fmt.Sprint(err))
  453. return
  454. }
  455. println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  456. stmt, err = mdb.Prepare("insert into test(id,name,intvalue,value,desc) values(?,?,?,?,?)")
  457. if err != nil {
  458. println("err", fmt.Sprint(err))
  459. return
  460. }
  461. for i := 1; i < 10; i++ {
  462. id := string([]byte{})
  463. for n := 0; n < 16; n++ {
  464. id = id + string('a'+byte(n+i-1))
  465. }
  466. name := int64(30 + i)
  467. floatvalue := 12345 + (i-1)*10000
  468. var intvalue interface{}
  469. intvalue = 1.2345 * float32(i)
  470. if i%3 == 1 {
  471. intvalue = "--12345--"
  472. } else if i%3 == 2 {
  473. intvalue = 123450 + i
  474. }
  475. bs, _ := json.MarshalIndent(map[string]interface{}{
  476. "value": floatvalue,
  477. }, "", " ")
  478. desc := string(bs)
  479. rslt, err = stmt.Exec(id, name, intvalue, floatvalue, desc)
  480. if err != nil {
  481. println("err", fmt.Sprint(err))
  482. }
  483. println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  484. }
  485. {
  486. stmt, err = mdb.Prepare(`select * from test`)
  487. if err != nil {
  488. println("err", fmt.Sprint(err))
  489. return
  490. }
  491. rows, err := stmt.Query()
  492. if err != nil {
  493. println("err", fmt.Sprint(err))
  494. return
  495. }
  496. defer func() { _ = rows.Close() }()
  497. cols, err := rows.Columns()
  498. if err != nil {
  499. println("err", fmt.Sprint(err))
  500. return
  501. }
  502. colTypes, err := rows.ColumnTypes()
  503. if err != nil {
  504. println("err", fmt.Sprint(err))
  505. return
  506. }
  507. types := make([]reflect.Type, len(colTypes))
  508. for i, tp := range colTypes {
  509. st := tp.ScanType()
  510. if st == nil {
  511. continue
  512. }
  513. types[i] = st
  514. }
  515. for rows.Next() {
  516. values := make([]interface{}, len(cols))
  517. for i := range values {
  518. values[i] = reflect.New(types[i]).Interface()
  519. }
  520. if err = rows.Scan(values...); err != nil {
  521. println("err", fmt.Sprint(err))
  522. return
  523. }
  524. m := make(map[string]interface{})
  525. for i, v := range values {
  526. if v == nil {
  527. //values[i] = nil
  528. m[colTypes[i].Name()] = nil
  529. } else {
  530. n, ok := colTypes[i].Length()
  531. m[colTypes[i].Name()] = fmt.Sprint(types[i], "[", n, "]", ok, ":", reflect.ValueOf(v).Elem().Interface())
  532. }
  533. }
  534. bs, _ := json.MarshalIndent(m, "", " ")
  535. println("values", string(bs))
  536. }
  537. }
  538. stmt, err = mdb.Prepare(`select json_group_array(json_object(
  539. 'id', id,
  540. 'name', name,
  541. 'value', value)) as json
  542. from test
  543. where json_extract(desc, '$.value') > 20000 and json_extract(desc, '$.value') < 50000`)
  544. if err != nil {
  545. println("err", fmt.Sprint(err))
  546. return
  547. }
  548. rows, err := stmt.Query()
  549. if err != nil {
  550. println("err", fmt.Sprint(err))
  551. return
  552. }
  553. defer func() { _ = rows.Close() }()
  554. cols, err := rows.Columns()
  555. if err != nil {
  556. println("err", fmt.Sprint(err))
  557. return
  558. }
  559. colTypes, err := rows.ColumnTypes()
  560. if err != nil {
  561. println("err", fmt.Sprint(err))
  562. return
  563. }
  564. types := make([]reflect.Type, len(colTypes))
  565. for i, tp := range colTypes {
  566. st := tp.ScanType()
  567. if st == nil {
  568. continue
  569. }
  570. types[i] = st
  571. }
  572. for rows.Next() {
  573. values := make([]interface{}, len(cols))
  574. for i := range values {
  575. values[i] = reflect.New(types[i]).Interface()
  576. }
  577. if err = rows.Scan(values...); err != nil {
  578. println("err", fmt.Sprint(err))
  579. return
  580. }
  581. m := make(map[string]interface{})
  582. for i, v := range values {
  583. if v == nil {
  584. //values[i] = nil
  585. m[colTypes[i].Name()] = nil
  586. } else {
  587. n, ok := colTypes[i].Length()
  588. m[colTypes[i].Name()] = fmt.Sprint(types[i], "[", n, "]", ok, ":", reflect.ValueOf(v).Elem().Interface())
  589. }
  590. }
  591. bs, _ := json.MarshalIndent(m, "", " ")
  592. println("values", string(bs))
  593. }
  594. }
  595. func TestSQLiteProfmanceMultiTable(t *testing.T) {
  596. runtime.GOMAXPROCS(4)
  597. println("GOMAXPROCS ", runtime.GOMAXPROCS(0))
  598. tablecount := 10000
  599. println("Tables count ", tablecount)
  600. varfieldscount := 100
  601. println("VarFields count ", varfieldscount+4)
  602. emptyfieldscount := 100
  603. println("EmptyFields count ", emptyfieldscount)
  604. vardatalength := 32
  605. println("VarFields data length ", vardatalength)
  606. tableindexcount := 100
  607. println("TableIndex count ", tableindexcount)
  608. datacount := 10000
  609. println("Data count ", datacount)
  610. mdb, err := sql.Open("sqlite", ":memory:")
  611. // mdb, err := sql.Open("sqlite", "file::memory:?cache=shared")
  612. if err != nil {
  613. println("err", fmt.Sprint(err))
  614. }
  615. st := time.Now()
  616. for ti := 1; ti < tablecount; ti++ {
  617. tablename := fmt.Sprint("test", ti)
  618. fields := []string{"id", "name", "value", "desc"}
  619. varfields := strings.Join(fields, ",")
  620. askmarks := "?" + strings.Repeat(",?", len(fields)-1)
  621. for i := 1; i <= varfieldscount; i++ {
  622. fields = append(fields, "var"+strconv.Itoa(i))
  623. varfields += ",var" + strconv.Itoa(i)
  624. askmarks += ",?"
  625. }
  626. allfields := varfields
  627. for i := varfieldscount + 1; i <= varfieldscount+emptyfieldscount; i++ {
  628. fields = append(fields, "var"+strconv.Itoa(i))
  629. allfields += ",var" + strconv.Itoa(i)
  630. }
  631. st := time.Now()
  632. stmt, err := mdb.Prepare("create table if not exists " + tablename + "(" + allfields + ")")
  633. if err != nil {
  634. println("err", fmt.Sprint(err))
  635. return
  636. }
  637. rslt, err := stmt.Exec()
  638. if err != nil {
  639. println("err", fmt.Sprint(err))
  640. return
  641. }
  642. if rslt == nil {
  643. println("sqlite init table return nil")
  644. } else {
  645. id, err := rslt.LastInsertId()
  646. if err != nil {
  647. println("err", fmt.Sprint(err))
  648. return
  649. }
  650. ra, err := rslt.RowsAffected()
  651. if err != nil {
  652. println("err", fmt.Sprint(err))
  653. return
  654. }
  655. if id != 0 || ra != 0 {
  656. println("sqlite init table return ", id, ra)
  657. }
  658. }
  659. println("sqlite create table", tablename, "use time ", time.Since(st).String())
  660. }
  661. println("sqlite create table", tablecount, "done, use time ", time.Since(st).String())
  662. st = time.Now()
  663. for ti := 1; ti < tablecount; ti++ {
  664. tablename := fmt.Sprint("test", ti)
  665. fields := []string{"id", "name", "value", "desc"}
  666. varfields := strings.Join(fields, ",")
  667. askmarks := "?" + strings.Repeat(",?", len(fields)-1)
  668. for i := 1; i <= varfieldscount; i++ {
  669. fields = append(fields, "var"+strconv.Itoa(i))
  670. varfields += ",var" + strconv.Itoa(i)
  671. askmarks += ",?"
  672. }
  673. allfields := varfields
  674. for i := varfieldscount + 1; i <= varfieldscount+emptyfieldscount; i++ {
  675. fields = append(fields, "var"+strconv.Itoa(i))
  676. allfields += ",var" + strconv.Itoa(i)
  677. }
  678. st = time.Now()
  679. for i, field := range fields {
  680. if i > tableindexcount {
  681. break
  682. }
  683. stmt, err := mdb.Prepare("create index " + tablename + "_" + field + " on " + tablename + " (" + field + ")")
  684. if err != nil {
  685. println("err", fmt.Sprint(err))
  686. return
  687. }
  688. rslt, err := stmt.Exec()
  689. if err != nil {
  690. println("err", fmt.Sprint(err))
  691. return
  692. }
  693. if rslt == nil {
  694. println("sqlite init table index return nil")
  695. } else {
  696. id, err := rslt.LastInsertId()
  697. if err != nil {
  698. println("err", fmt.Sprint(err))
  699. return
  700. }
  701. ra, err := rslt.RowsAffected()
  702. if err != nil {
  703. println("err", fmt.Sprint(err))
  704. return
  705. }
  706. if id != 0 || ra != 0 {
  707. println("sqlite init table index return ", id, ra)
  708. }
  709. }
  710. }
  711. println("sqlite create index for table "+tablename+" use time ", time.Since(st).String())
  712. }
  713. println("sqlite create table index", tablecount, "done, use time ", time.Since(st).String())
  714. st = time.Now()
  715. data := []map[string]interface{}{}
  716. {
  717. st = time.Now()
  718. for i := 1; i <= datacount; i++ {
  719. m := map[string]interface{}{}
  720. m["id"] = i
  721. m["name"] = fmt.Sprint("name", i)
  722. m["value"] = 1.23456789 * float64(i)
  723. m["desc"] = strings.Repeat(fmt.Sprint("desc", i, "."), 10)
  724. for vi := 1; vi <= varfieldscount; vi++ {
  725. bs := make([]byte, vardatalength+rand.Intn(10)-5)
  726. for bsi := 0; bsi < len(bs); bsi++ {
  727. bs[bsi] = byte(32 + rand.Intn(95))
  728. }
  729. m["var"+strconv.Itoa(vi)] = string(bs)
  730. }
  731. data = append(data, m)
  732. if i%1000 == 0 {
  733. println("generate maps ", i, " use time ", time.Since(st).String())
  734. }
  735. }
  736. println("generate maps ", datacount, " use time ", time.Since(st).String())
  737. st = time.Now()
  738. memdataset := map[string]map[string]interface{}{}
  739. for _, d := range data {
  740. id := cast.ToString(d["id"])
  741. memdataset[id] = d
  742. }
  743. println("put id-data maps ", len(memdataset), " use time ", time.Since(st).String())
  744. st = time.Now()
  745. ids := []string{}
  746. for id, d := range memdataset {
  747. if id == cast.ToString(d["id"]) {
  748. ids = append(ids, id)
  749. }
  750. }
  751. println("fetch maps data ids ", len(ids), " use time ", time.Since(st).String())
  752. st = time.Now()
  753. data = []map[string]interface{}{}
  754. for _, id := range ids {
  755. d := memdataset[id]
  756. data = append(data, d)
  757. }
  758. println("fetch maps data ", len(data), " use time ", time.Since(st).String())
  759. }
  760. for ti := 1; ti < tablecount; ti++ {
  761. tablename := fmt.Sprint("test", ti)
  762. fields := []string{"id", "name", "value", "desc"}
  763. varfields := strings.Join(fields, ",")
  764. askmarks := "?" + strings.Repeat(",?", len(fields)-1)
  765. for i := 1; i <= varfieldscount; i++ {
  766. fields = append(fields, "var"+strconv.Itoa(i))
  767. varfields += ",var" + strconv.Itoa(i)
  768. askmarks += ",?"
  769. }
  770. allfields := varfields
  771. for i := varfieldscount + 1; i <= varfieldscount+emptyfieldscount; i++ {
  772. fields = append(fields, "var"+strconv.Itoa(i))
  773. allfields += ",var" + strconv.Itoa(i)
  774. }
  775. { // insert
  776. st = time.Now()
  777. stmt, err := mdb.Prepare("insert into " + tablename + "(" + varfields + ") values(" + askmarks + ")")
  778. if err != nil {
  779. println("err", fmt.Sprint(err))
  780. return
  781. }
  782. i := 0
  783. for _, d := range data {
  784. i = i + 1
  785. args := []interface{}{
  786. d["id"],
  787. d["name"],
  788. d["value"],
  789. d["desc"]}
  790. for vi := 1; vi <= varfieldscount; vi++ {
  791. args = append(args, d["var"+strconv.Itoa(vi)])
  792. }
  793. _, err := stmt.Exec(args...)
  794. if err != nil {
  795. println("err", fmt.Sprint(err))
  796. }
  797. // println("rslt", fmt.Sprint(rslt.LastInsertId()), fmt.Sprint(rslt.RowsAffected()))
  798. if i%1000 == 0 {
  799. println("sqlite insert ", i, " use time ", time.Since(st).String())
  800. }
  801. }
  802. println("sqlite insert ", tablename, len(data), " use time ", time.Since(st).String())
  803. }
  804. { // select
  805. st = time.Now()
  806. stmt, err := mdb.Prepare("select " + varfields + " from " + tablename)
  807. if err != nil {
  808. println("err", fmt.Sprint(err))
  809. return
  810. }
  811. rows, err := stmt.Query()
  812. if err != nil {
  813. println("err", fmt.Sprint(err))
  814. return
  815. }
  816. println("sqlite select query all", " use time ", time.Since(st).String())
  817. defer func() { _ = rows.Close() }()
  818. cols, err := rows.Columns()
  819. if err != nil {
  820. println("err", fmt.Sprint(err))
  821. return
  822. }
  823. colTypes, err := rows.ColumnTypes()
  824. if err != nil {
  825. println("err", fmt.Sprint(err))
  826. return
  827. }
  828. types := make([]reflect.Type, len(colTypes))
  829. for i, tp := range colTypes {
  830. st := tp.ScanType()
  831. if st == nil {
  832. continue
  833. }
  834. types[i] = st
  835. }
  836. data := []map[string]interface{}{}
  837. for rows.Next() {
  838. values := make([]interface{}, len(cols))
  839. for i := range values {
  840. if types[i] == nil {
  841. values[i] = &[]byte{}
  842. } else {
  843. values[i] = reflect.New(types[i]).Interface()
  844. }
  845. }
  846. if err = rows.Scan(values...); err != nil {
  847. println("err", fmt.Sprint(err))
  848. return
  849. }
  850. m := make(map[string]interface{})
  851. for i, v := range values {
  852. if v == nil {
  853. //values[i] = nil
  854. m[colTypes[i].Name()] = nil
  855. } else {
  856. n, ok := colTypes[i].Length()
  857. m[colTypes[i].Name()] = fmt.Sprint(types[i], "[", n, "]", ok, ":", reflect.ValueOf(v).Elem().Interface())
  858. }
  859. }
  860. data = append(data, m)
  861. // if len(data)%10000 == 0 {
  862. // println("sqlite fetch data ", len(data), " use time ", time.Since(st).String())
  863. // }
  864. }
  865. println("sqlite fetch data ", len(data), " use time ", time.Since(st).String())
  866. }
  867. }
  868. }