簡體   English   中英

將記錄插入數據庫的更快方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM