在T-SQL中循环查询的最快方法是什么。 1)游标或 2)带有Key的临时表或 别的什么。
答案 0 :(得分:5)
通过查询“循环”的最快方法就是不要这样做。在SQL中,您应该考虑基于集合而不是基于循环。您可能应该评估您的查询,询问为什么需要循环,并寻找方法将其作为一组来完成。
话虽如此,使用游标上的FAST_FORWARD选项将有助于加快速度。
答案 1 :(得分:3)
对于你声明的目标,这样的事情实际上是一个更好的选择 - 完全避免“循环”问题。
declare @table table
(
ID int
)
insert into @table select 1 union select 2 union select 3 union select 4 union select 5
declare @concat varchar(256)
-- Add comma if it is not the first item in the list
select @concat = isnull(@concat + ', ', '') + ltrim(rtrim(str(ID))) from @table order by ID desc
-- or do whatever you want with the concatenated value now...
print @concat
答案 2 :(得分:1)
取决于你想要做什么。有些任务更适合游标,有些则适用于临时表。这就是为什么它们都存在的原因。
答案 3 :(得分:0)
游标通常是资源占用,特别是随着您的表大小的增长。因此,如果您的表大小很小,我可以推荐一个游标,但是,对于外部或临时表,更大的表可能会做得更好。
答案 4 :(得分:0)
您想循环查看存储过程内的查询输出还是来自C#代码?
一般来说,您应该避免一次循环查询输出一行。 SQL适用于基于集合的操作,因此请查看是否可以使用基于集合的方法解决问题。
答案 5 :(得分:0)
根据结果集的大小 - 表变量在内存中并且不需要磁盘读取,可以像表(设置操作)一样处理,并且非常快,直到结果集对于内存变大(这需要交换文件写道。)
答案 6 :(得分:0)
这是从查询返回多个行的单个字段的逗号分隔字符串的快捷方式。与游标等的替代方法相比,它非常快,并且它可以是子查询的一部分(即,获取一些东西,在一列中,与其他表中的每个事物相关的所有事物的ID):
SELECT
COALESCE(
REPLACE(
REPLACE(
REPLACE(
(SELECT MyField AS 'c' FROM [mytable] FOR XML PATH('')),'</c><c>',','),
'<c>',''),
'</c>',''),
'')
AS MyFieldCSV
警告:如果你的列中包含FOR XML PATH将会转义的字符,它将不会很好。
答案 7 :(得分:0)
如果我明白你的目的,我认为你不需要光标(关于concat的评论)。 这是我的一个抓取一个联系人的所有电话号码并将它们放在一个字段中并将其返回。
DECLARE @numbers VARCHAR(255)
SELECT @numbers = COALESCE(@numbers + ' | ','') + PHONE_NUMB FROM my_table (NOLOCK)
WHERE CONTACT_ID=@contact_id RETURN @numbers
答案 8 :(得分:0)
光标不好避免光标并使用while循环代替光标 添加了密钥的临时表是使用循环的最佳方式。
我必须在表中操作超过1000000行 由于复杂的逻辑,光标需要2分钟。 但是当将光标转换为while循环时,它将需要 仅25秒。所以这在性能方面差异很大。