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

可能重复:
T-SQL WHERE col IN(…)

什么是SQL Server查询的最大大小? (字符数)

IN子句的最大大小? 我认为我看到了一些关于Oracle有1000个项目的限制,但是你可以用ANDing 2 INs来解决这个问题。 SQL Server中的类似问题?

更新那么,如果我需要从另一个系统(非关系数据库)中说1000个GUID并对SQL Server执行“JOIN in code”,那么最好的方法是将1000个GUID列表提交给IN子句还是有另一种更高效的技术?

我没有testing过这个,但我不知道我是否可以提交作为XML文档的GUID。 例如

<guids> <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid> <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid> </guids> 

然后对Doc和Table做一些XQuery JOIN。 效率低于1000条IN子句?

每个SQL批处理必须符合批处理大小限制 :65,536 *networking数据包大小。

除此之外,您的查询受运行时条件的限制。 它通常会用完栈大小,因为x IN(a,b,c)只是x = a OR x = b OR x = c创build一个expression式树,类似于x = a OR(x = b OR(x = c)),所以它变得非常深,有大量的OR。 SQL 7 在IN中大约有10k的值 ,但是现在的堆栈要深得多(因为x64),所以它可能会很深。

更新

你已经find了Erland关于将列表/数组传递给SQL Server的文章。 在SQL 2008中,您还有表值参数 ,它允许您将整个DataTable作为单个表typesparameter passing并join其中。

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

 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; 

SQL Server最高限额披露http://msdn.microsoft.com/en-us/library/ms143432.aspx (这是2008年版本)

一个SQL查询可以是一个varchar(max),但是显示限制为65,536 *networking数据包的大小,但即使如此,最有可能发生意外的是每个查询2100个参数。 如果SQLselect参数化in子句中的文字值,我会认为你会首先达到这个限制,但是我没有testing它。

编辑:testing,即使在强制参数化下,它仍然存在 – 我敲了一个快速testing,并使用In子句中的30k项执行。 (SQL Server 2005)

在10万的项目,花了一些时间,然后下降:

消息8623,级别16,状态1,行1查询处理器耗尽内部资源,无法生成查询计划。 这是一个罕见的事件,只有在引用大量表或分区的极其复杂的查询或查询时才会出现。 请简化查询。 如果您认为您错误地收到了此消息,请联系客户支持服务以获取更多信息。

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

编辑:由于另外的问题继续。

50K的工作,但60K退出,所以在我的testing平台btw的某处。

关于如何在不使用大的in子句的情况下进行连接,我个人会创build一个临时表,将这些值插入到临时表中,然后将其编入索引,然后将其用于连接,从而为其提供最佳的机会优化连接。 (在临时表上生成索引将创build统计信息,这将有助于优化器作为一般规则,尽pipe1000个GUID不会完全find太有用的统计信息。

每批次, 65536 *networking数据包大小是4k,所以256 MB

然而,在这之前,IN会停下来,但这并不准确。

你最终有记忆错误,但我不记得确切的错误。 一个巨大的IN将无济于事。

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

你可以加载到临时表的GUID然后做一个

 ... WHERE var IN SELECT guid FROM #scratchtable