【问题标题】:Best way of selecting 8k+ rows from a table从表中选择 8k+ 行的最佳方法
【发布时间】:2015-05-26 07:11:23
【问题描述】:

我有一个包含超过 8k 个 ID 的 Excel 表。我在 SQL Server 中有一个表,其中包含这些 ID 和相关条目。获得这些行的最佳方法是什么?我现在正在做的方式是使用查询的特定表使用export data 函数:

select * from table_name where uID in (ALL 8K IDs)

【问题讨论】:

  • 您需要表中的所有行还是表中的行数超过 8k 行?
  • 他有 8k 个 id 必须从表中检索,这 8k 个 id 在文件中,因此他必须以某种方式读取它们,我建议使用您读取的 id 创建一个临时表和然后加入该表以进行选择
  • “最佳”在这里是主观的。取决于您是只执行一次还是每分钟执行一次。
  • 你是如何从 excel 中获取 id 列表并进入 sql server 的?这是一次性的,还是需要多次执行?
  • 所以基本上你是在使用复制粘贴来获取 id 列表?如果是这样,那么 最简单 的方法就是像您一样使用 IN 运算符。但是,对大型集合使用 IN 运算符确实会遇到性能问题。这就是为什么每个人都想知道这是一次性的事情还是你必须每隔一段时间重复一次。

标签: sql sql-server database excel sql-server-2008


【解决方案1】:

由于必须多次执行此操作,我建议使用 csv 文件中的 bulk insert 到临时 sql 表,然后对该表使用内连接。
假设您的 csv 文件包含单行中的 id,(即 1,34,345,....),这样的事情应该可以解决问题:

-- create the temporary table
CREATE TABLE #CSVData 
(
    IdValue int
)
-- create a clustered index for this table (Note: this doesn't need to be unique)
CREATE CLUSTERED INDEX IX_CSVData on #CSVData (IdValue ) 

-- insert the csv data to the table
BULK INSERT #CSVData
FROM 'c:\csvData.txt'
WITH
(
    ROWTERMINATOR = ','
)

-- select the data 
SELECT T.* 
FROM table_name T
INNER JOIN #CSVData ON(T.uId = IdValue)

-- cleanup (the index will be dropped with the table)
DROP TABLE #CSVData

要查看的另一个链接是 This article,作者是 Pinal dave 在 sqlauthority 上。

【讨论】:

  • 哈!我刚刚对此发表了评论。
  • 我最终做了同样的事情。感谢您的时间和精力:)
  • 很高兴我能帮上忙 :-)
猜你喜欢
  • 2012-06-07
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2012-01-30
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多