可能重复:
SQL Server查询的最大大小是多少?(字符数)
IN子句的最大大小?我想我看到了一些关于甲骨文有1000个项目的限制,但你可以一起使用ANDing 2英寸来绕过这个问题。SQL Server中是否存在类似的问题?
更新如果我需要从另一个系统(非关系数据库)获取1000个GUID并对SQL Server执行“连接代码”,那么最好的方法是什么?是将1000个GUID的列表提交给in子句吗?还是有其他更有效的技术?
我还没有对此进行测试,但我想知道是否可以将GUID作为XML文档提交。例如
<guids>
<guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
<guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>然后对文档和表执行某种XQuery连接。比1000个item IN子句效率低?
发布于 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是另一个可行的解决方案:
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;发布于 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不会发现统计信息太有用。)
发布于 2009-12-09 04:56:46
每批的65536 * Network Packet Size为4k,因此为256 MB
然而,IN将在此之前停止,但它不是精确的。
你最终会出现内存错误,但我记不起确切的错误。一个巨大的IN无论如何都是低效的。
编辑: Remus提醒我:错误是关于“栈大小”的
https://stackoverflow.com/questions/1869753
复制相似问题