获取xorm.TableInfo效率太低 #2059
Labels
No Label
backport/done
backport/v1
blocked
db
oracle
db
sqlserver
duplicate
feature
cache
frontport/done
frontport/main
invalid
kind
breaking
kind
bug
kind
build
kind
dependencies
kind
docs
kind
driver
kind
enhancement
kind
feature
kind
performance
kind
proposal
kind
question
kind
refactor
kind
testing
need
feedback
need
test
proposal:accepted
RaspBerry Pi
regression
skip-changelog
upstream
wip
wontfix
No Milestone
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: xorm/xorm#2059
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
基于xorm定义的数据模型在初次被调用时触发的表结构查询出现多次且表现上是按模型字段分别查询的,程序启动后预加载数据时有大量的此类日志,此情况在使用cockroachdb集群的时候表现尤为明细,由于使用环境单个查询数据库响应慢,甚至出现了只预加载3轻量表数据花费5分钟的情况。
以下是使用sqlite数据库测试时其中一张表的表结构查询情况:
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT name FROM sqlite_master WHERE type='table' and name = ? [sys_user] - 8.993ms
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT name FROM sqlite_master WHERE type='table' and name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT * FROM sys_user LIMIT 0 []
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
[INFO] 2021/10/09 11:57:51 db.go:300: [SQL] SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ? [sys_user]
Could you paste your code and
TableInfo
is a method ofEngine
and it will retrieve information from a struct and will not read anything from database.This is a database schema detection and changes. If there are many records, it will spend much time.
A better method is to use
Sync
but not write it yourself.For a production delopyment, I think you should not check them once start the program. Just check once something changed, you can try use
xorm/migrate
to add some migrations, so that only migrations will be executed.Is that mean xorm.IsTableExist were not recommend in production deployment?
No. You should do that according your situation.