【问题标题】:How to use set rowcount in select query如何在选择查询中使用设置行数
【发布时间】:2017-02-16 03:58:15
【问题描述】:

我有一个选择查询语句,它将产生 600k 行。当我使用 select 语句盲目地提取结果时,它会影响数据库性能。是否有使用 Set rowcount 获取数据的选项?我尝试了下面的代码,但它一直在生成前 50000 行并最终进入无限循环。

#!/bin/ksh -x
trap "" 1
updrowcount=50000
while [ $updrowcount -eq 50000 ]
do
QUERY="set rowcount 50000
select subject into tempdb..extract from tablename where fldr_id=8"

runisql <<EOF > db_restenter code here
$QUERY
goenter code here
quit
EOF
updrowcount=`grep "rows affected" db_rest |cut -c2- | cut -f1 -d ' '`
done
exit

【问题讨论】:

  • @a_horse_with_no_name Sybase
  • 您需要一些方法来记住您已经复制的最后一行,以便在下一次迭代中从该行开始。
  • 对于更新查询集行计数对我有用。假设说,例如,如果我要更新 23 万条记录,我可以使用上面的代码每次使用 set rowcount 更新 50000 行但是对于 SELECT 语句没有帮助。 @JimmyB
  • 我不得不谷歌:"lakh" refers to 100000 (10e5) units
  • 只有当你有一个 WHERE 条件来区分已经更新的行和尚未处理的行时,你的更新才有效。 - SELECT 也需要这样做。

标签: unix sybase


【解决方案1】:

如果您的subject 是唯一的,您可以尝试这样的操作:

set rowcount 50000

declare @subject varchar(...)
select @subject = max( subject ) from tempdb..extract

insert into tempdb..extract ( subject )
select subject 
from tablename
where fldr_id=8
and (subject > @subject OR @subject is null)
order by subject

否则,请使用唯一列,例如

set rowcount 50000

declare @maxId int
select @maxId = max( id ) from tempdb..extract

insert into tempdb..extract (id, subject )
select id, subject into tempdb..extract
from tablename
where fldr_id=8
and (id > @maxId OR @maxId is null)
order by id

(显然,您需要使用索引列。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-05
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多