使用大小一致的批次进行批量选择

发布于 2024-10-17 12:39:55 字数 471 浏览 1 评论 0原文

我想要实现的是:

  • 提供一种批量选择的机制(select * from users where user_id in (?, ?, ?, ?, ?))。例如,批量大小为 5
  • 使用绑定变量并保持一致大小的批量

因此,如果应用程序需要用户提供 8 个不同的 user_id,那么我将调用上述 SQL 两次,每次调用中有 5 个参数(而不是使用 5 个 user_id 进行一次调用,然后使用3)。

因此,如果输入大小小于批量大小,我需要填充 user_ids。我想知道就性能而言什么是好的填充方案:

  • 使用 null?
  • 使用第一个 user_id

当使用 null 时,如果列为 NULLABLE,性能是否会下降? 另外,当使用 null 时,数据库是否仍会提出一个查询计划,因为这就是我想要使用大小一致的批次来实现的目标?

What I want to achieve is:

  • Provide a mechanism for batch selects (select * from users where user_id in (?, ?, ?, ?, ?)). Batch size is 5 in this e.g.
  • Use bind variables and maintain consistent sized batches

So if the application requires Users for 8 different user_id then I would call the aforementioned SQL twice having 5 params in each call (rather than one call with 5 user_ids and then with 3).

So, I need to pad the user_ids if the input size is less than the batch size. I wanted to know what would be a good padding scheme in terms of performance:

  • Using null?
  • Using the first user_id

When using null would there be any performance degradation if the column is NULLABLE?
Also when using null would the DB still come up with one query plan, because that's what I want to achieve using consistent sized batches?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

静若繁花 2024-10-24 12:39:55

您的两个选择是等效的*。

* Using null?
* Using the first user_id

没有区别*。在 IN 子句中,NULL 被删除,因此不会降低性能,除非您使用的 RDBMS 具有可以设置为 OFF 的 ANSI_NULLS 选项(例如 SQL Server) - 请参阅下文。在子句中也是集合,因此具有 (1,2,3,1,1) 相当于仅具有 (1,2,3),但它确实使您的绑定更容易。

因此,如果您 (1) 使用允许 NULL 与 NULL 匹配的 RDBMS,并且 (2) 您计划使用该设置,则这 2 个设置是等效的。

另一方面,为了 100% 确定,只需使用第二个选项。


SQL Server code showing NULL picking out NULLs.

set ansi_nulls off
select *
from (select 1 a union all select 2 union all select null) x
where a in (1,2, null)

Both of your options are equivalent*.

* Using null?
* Using the first user_id

There is no difference*. In an IN clause, NULLs are removed, so there is no performance degradation, UNLESS the RDBMS you are using has an ANSI_NULLS option that you can set to OFF (e.g. SQL Server) - see far below. In CLAUSES are also SETs, so having (1,2,3,1,1) is equivalent to only having (1,2,3) but it does make your binding easier.

So if you are (1) using a RDBMS that allows for NULLs to match NULLs and (2) you plan to use that setting, the 2 are equivalent.

On the other hand, to be 100% certain, just use the 2nd option.


SQL Server code showing NULL picking out NULLs.

set ansi_nulls off
select *
from (select 1 a union all select 2 union all select null) x
where a in (1,2, null)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文