首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server查询的最大大小?IN子句?有没有更好的方法

SQL Server查询的最大大小?IN子句?有没有更好的方法
EN

Stack Overflow用户
提问于 2009-12-09 04:52:11
回答 4查看 202.2K关注 0票数 99

可能重复:

T-SQL WHERE col IN (…)

SQL Server查询的最大大小是多少?(字符数)

IN子句的最大大小?我想我看到了一些关于甲骨文有1000个项目的限制,但你可以一起使用ANDing 2英寸来绕过这个问题。SQL Server中是否存在类似的问题?

更新如果我需要从另一个系统(非关系数据库)获取1000个GUID并对SQL Server执行“连接代码”,那么最好的方法是什么?是将1000个GUID的列表提交给in子句吗?还是有其他更有效的技术?

我还没有对此进行测试,但我想知道是否可以将GUID作为XML文档提交。例如

代码语言:javascript
复制
<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

然后对文档和表执行某种XQuery连接。比1000个item IN子句效率低?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-09 05:01:48

每个SQL批处理都必须符合Batch Size Limit:65,536 *网络数据包大小。

除此之外,您的查询还受到运行时条件的限制。它通常会用完堆栈大小,因为x IN (a,b,c)只是x=a OR x=b OR x=c,这会创建一个类似于x=a OR (x=b OR (x=c))的表达式树,所以它会随着大量的OR变得非常深。SQL7可能会遇到一个非常深的at about 10k values in the IN,但是现在的堆栈要深得多(因为有了x64),所以它可以走得相当深。

更新

您已经找到了Erland关于将列表/数组传递到SQL Server主题的文章。在SQL2008中,您还可以使用Table Valued Parameters,它允许您将整个DataTable作为单个表类型参数传递并在其上进行连接。

XML和XPath是另一个可行的解决方案:

代码语言:javascript
复制
SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;
票数 85
EN

Stack Overflow用户

发布于 2009-12-09 04:58:35

http://msdn.microsoft.com/en-us/library/ms143432.aspx中披露了SQL Server的最大值(这是2008版)

SQL查询可以是varchar(max),但显示为限制为65,536 *网络数据包大小,但即使这样,最有可能使您出错的是每个查询的2100个参数。如果SQL选择参数化in子句中的文字值,我认为您会首先达到该限制,但我还没有对其进行测试。

编辑:测试它,即使在强制参数化的情况下,它也能存活下来--我做了一个快速测试,让它在In子句中使用30k项执行。(SQL Server 2005)

在100k项的情况下,它需要一些时间,然后丢弃:

消息8623,级别16,状态1,行1查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于极其复杂的查询或引用了大量表或分区的查询。请简化查询。如果您认为收到此消息有误,请与客户支持服务部门联系以了解详细信息。

所以30k是可能的,但仅仅因为你可以做到这一点-并不意味着你应该:)

编辑:由于其他问题,请继续。

50k起作用了,但60k退出了,所以在我的测试设备btw上的某个地方。

至于如何在不使用大型In子句情况下对值进行连接,我个人会创建一个临时表,将值插入到该临时表中,对其进行索引,然后在连接中使用它,从而为其提供优化连接的最佳机会。(在临时表上生成索引将为其创建统计信息,这将有助于优化器的一般规则,尽管1000个GUID不会发现统计信息太有用。)

票数 40
EN

Stack Overflow用户

发布于 2009-12-09 04:56:46

每批的65536 * Network Packet Size为4k,因此为256 MB

然而,IN将在此之前停止,但它不是精确的。

你最终会出现内存错误,但我记不起确切的错误。一个巨大的IN无论如何都是低效的。

编辑: Remus提醒我:错误是关于“栈大小”的

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1869753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档