我一直在使用Windows-Native sqlcmd在我本地的SQL Server数据库上运行脚本.我有一组脚本文件,将创建数据库,添加表格和索引,填充域数据,添加存储过程等.运行脚本是完成执行单个sqlcmd -i <file>.sql每个文件.这样做效果很好,而且速度足够快. 在切换到新的GO实现sqlcmd之后,数据库构建时间慢了好几倍.

我找不到任何方法从sqlcmd获取计时类型的统计信息,以确定是连接问题、连接池问题还是其他问题.如果我将多个文件作为额外的-i <file.sql>个选项传递,我可以看到什么看起来像是改进,这对我来说是GO命令的启动或初始数据库连接建立的问题.

我做了一个测试,我把我的10个SQL文件,我运行他们作为10个单独的sqlcmd次执行,也作为一个sqlcmd次执行,10个文件作为单独的-i个输入文件.单独的命令花了20秒,多功能一体机花了4秒.因此,这似乎是一个启动开销或连接开销的问题.

正如@siggeannen所建议的,我使用我的AD凭据和一个直接数据库用户测试了连接.AD凭据比直接数据库连接慢得多,这意味着这是我在场景中看到的慢的根源.

我正在寻找任何建议或 idea ,无论是解决问题还是进一步排除故障.是否可以采取任何措施来加快AD身份验证?

推荐答案

Go sqlcmd并不比原生版本慢.使用Windows/AD凭据来建立连接会增加建立连接时所需的启动时间,并且当用例每sqlcmd个实例运行一个SQL文件时,额外的开销也会增加.

我们可以修改构建脚本, for each sqlcmd运行多个SQL文件,这将恢复我们所需的性能.但是,我们可以使用的另一种方法是使用在创建数据库时创建的SQL Server-level principal sa进行连接,而无需进行任何修改.这将恢复与使用AD登录的本机sqlcmd相当的性能.

Go相关问答推荐

如果添加构建标签,gopls将停止工作

Go GORM创建表,但不创建列

切换选项卡时,Goland IDE中的光标自动转移

golang regex基于关键字拆分字符串

Cypher 查找(多个)最低 node

Go test "-run -" 标志执行测试更快

通过多阶段构建复制到 Docker 容器中时找不到文件

io.Reader 无限循环与 fmt.Fscan

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

如何在 gocql 中设置最大池大小?

读取非UTF8编码的文件内容并正确打印出来

使用 `didip/tollbooth` 限制每小时最大请求数

go 是否对 struct 使用空间填充之类的东西?

具有近似约束的函数值导致的实例化失败

Unescape 在 rss 中两次逃脱了标题

如何使用带有Electron 表格 ID、Electron 表格名称、表格 ID 和值的 golang 在 googlesheet 中插入数据

空接口与泛型接口有何不同?

Golang 将类型 [N]byte 转换为 []byte