Knex + SQL 服务器 whereIn 查询 8-12s -- 原始版本 returns 没有结果但是如果我直接输入 .toQuery() 结果我得到结果
Knex + SQL Server whereIn query 8-12s -- raw version returns NO results but if I input the .toQuery() result directly I get results
数据库在 Azure 云中,目前未在生产中使用。有 80.000 行,uprn 是 VARCHAR(100);
我已经在使用 JOI 来验证每个 UPRN;
我将 KNEX 与 SQL 服务器数据库一起使用,其中包含以下 whereIn 查询:
knex(LOCATIONS.table).whereIn(LOCATIONS.uprn, req.body.uprns)
但这需要 8-12 秒才能完成,有时会超时。如果我在同一件事上使用 .toQuery(),SSMS 将 return 结果在 1-2 内。
如果我执行原始查询,生成的 .toQuery() 或 toString() 在 SSMS 和 returns 结果中有效。但是如果我尝试直接使用 raw,它将 return 0 个结果。
我正在寻求解决导致 whereIn 如此缓慢的原因或让原始查询正常工作。
编辑 1:
经过多次调试和尝试 -- 似乎错误是由于 knex 如何处理数组,所以我做了一个 for-of 循环来添加 ? ? ?对于每个数组元素,然后输入所有参数的数组。
这让我意识到性能问题是由于 SQL 服务器参数化方式造成的。
我最终构建了一个包含所有参数的原始查询字符串,并使用 Joi string/regex 配置验证了输入:
Joi.string()
.min(1)
.max(35)
.regex(/^[a-z\d\-_\s]+$/i)
只允许字母数字、破折号和空格,这会阻止 sql 注入。
我将更深入地研究这个安全问题,并且可能会进行单独的登录,该登录只能 SELECT 来自 table 的数据,仅此而已 运行查询。
只需要原始处理并单独验证。
数据库在 Azure 云中,目前未在生产中使用。有 80.000 行,uprn 是 VARCHAR(100);
我已经在使用 JOI 来验证每个 UPRN;
我将 KNEX 与 SQL 服务器数据库一起使用,其中包含以下 whereIn 查询:
knex(LOCATIONS.table).whereIn(LOCATIONS.uprn, req.body.uprns)
但这需要 8-12 秒才能完成,有时会超时。如果我在同一件事上使用 .toQuery(),SSMS 将 return 结果在 1-2 内。
如果我执行原始查询,生成的 .toQuery() 或 toString() 在 SSMS 和 returns 结果中有效。但是如果我尝试直接使用 raw,它将 return 0 个结果。
我正在寻求解决导致 whereIn 如此缓慢的原因或让原始查询正常工作。
编辑 1:
经过多次调试和尝试 -- 似乎错误是由于 knex 如何处理数组,所以我做了一个 for-of 循环来添加 ? ? ?对于每个数组元素,然后输入所有参数的数组。
这让我意识到性能问题是由于 SQL 服务器参数化方式造成的。
我最终构建了一个包含所有参数的原始查询字符串,并使用 Joi string/regex 配置验证了输入:
Joi.string()
.min(1)
.max(35)
.regex(/^[a-z\d\-_\s]+$/i)
只允许字母数字、破折号和空格,这会阻止 sql 注入。
我将更深入地研究这个安全问题,并且可能会进行单独的登录,该登录只能 SELECT 来自 table 的数据,仅此而已 运行查询。
只需要原始处理并单独验证。