[英]Faster way to insert records into database
因此,我目前有大约70,000个名称的数据库表。 我要做的是从该数据库中提取3000条随机记录,并将它们插入到另一个表中,每个表中的所有其他名称都有一行。 换句话说,新表应如下所示:
John, jerry
john, alex
john, sam
jerry, alex
jerry, sam
alex, sam
这意味着我应该将总计n行添加到表中。 我当前的策略是使用两个嵌套的for循环一次添加这些行,然后从要添加的名称列表中删除名字,以确保我没有重复顺序的记录。
我的问题是:是否可以通过并行的for循环或PLINQ或我未提及的其他选项来实现此目的?
您将需要找出随机部分
select t1.name, t2.name
from table t1
join table t2
on t1.name < t2.name
order by t1.name, t2.name
您需要实现newid
declare @t table (name varchar(10) primary key);
insert into @t (name) values
('Adam')
, ('Bob')
, ('Charlie')
, ('Den')
, ('Eric')
, ('Fred');
declare @top table (name varchar(10) primary key);
insert into @top (name)
select top (4) name from @t order by NEWID();
select * from @top;
select a.name, b.name
from @top a
join @top b
on a.name < b.name
order by a.name, b.name;
给定一个表“ Names”,其数据包含nvarchar(50)列“ Name”:
Adam
Bob
Charlie
Den
Eric
Fred
该查询:
-- Work out the fraction we need
DECLARE @frac AS float;
SELECT @frac = CAST(35000 AS float) / 70000;
-- Get roughly that sample size
WITH ts AS (
SELECT Name FROM Names
WHERE @frac >= CAST(CHECKSUM(NEWID(), Name) & 0x7FFFFFFF AS float) / CAST (0X7FFFFFFF AS int)
)
-- Match each entry in the sample with all the other entries
SELECT x.Name + ', ' + y.Name
FROM ts AS X
CROSS JOIN
Names AS Y
WHERE x.Name <> y.Name
产生表格的结果
Adam, Bob
Adam, Charlie
Adam, Den
Adam, Eric
Adam, Fred
Charlie, Adam
Charlie, Bob
Charlie, Den
Charlie, Eric
Charlie, Fred
Den, Adam
Den, Bob
Den, Charlie
Den, Eric
Den, Fred
结果因运行而异; 70000个样本中的3000个样本将具有约 3000 * 70000个结果行。 我使用35000./70000,因为我使用的样本大小仅为6。
如果只希望使用样本中的名称,请将CROSS JOIN Names AS Y
更改为CROSS JOIN ts AS Y
,那么结果行将大约为3000 * 3000。
参考:随机样本方法来自使用TABLESAMPLE限制结果集中的“重要”部分。
使用数字表模拟名称。
单个查询,使用三角连接
WITH all_names
AS (SELECT n,
'NAME_' + Cast(n AS VARCHAR(20)) NAME
FROM number
WHERE n < 70000),
rand_names
AS (SELECT TOP 3000 *
FROM all_names
ORDER BY Newid()),
ordered_names
AS (SELECT Row_number()
OVER (
ORDER BY NAME) rw_num,
NAME
FROM rand_names)
SELECT n1.NAME,
n2.NAME
FROM ordered_names n1
INNER JOIN ordered_names n2
ON n2.rw_num > n1.rw_num
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.