我有一个表,它可能会存储数十万个整数
desc id_key_table;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| id_key | int(16) | NO | PRI | NULL | |
+----------------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
从程序中,我有一大组整数。我想看看这些整数中哪些不在上面的 id_key 列中。
到目前为止,我提出了以下方法:
1) 遍历每个整数并执行:
select count(*) count from id_key_table where id_key = :id_key
Run Code Online (Sandbox Code Playgroud)
当 count 为 0 时,表中缺少 id_key。
这似乎是一种可怕的、可怕的方式来做到这一点。
2) 创建一个临时表,将每个值插入临时表中,并对两个表执行JOIN。
create temporary table id_key_table_temp (id_key int(16) primary key );
insert into id_key_table_temp values (1),(2),(3),...,(500),(501);
select temp.id_key
from id_key_table_temp temp left join id_key_table as main
on …Run Code Online (Sandbox Code Playgroud) 可能的重复:
将大量数据发送到存储过程的技术
我经常遇到我想将一组 Id 作为参数传递给存储过程的情况。
例如,对于 GetCustomerAccounts 存储过程,客户端从列表中选择 20 个客户。然后我想将这 20 个客户 ID 传递给程序以返回他们的帐户。
目前我通过有一个参数表来解决这个问题。我用我的客户 ID 和单个 Guid ID 填充它。然后将此单个 Guid ID 传递给过程,然后该过程再次连接参数表。我不喜欢这样,因为它涉及多次访问数据库。
另一种可能性是在逗号分隔的 Varchar 参数中传递 Id。然后,存储过程可以将此字符串解析为临时表,然后针对该表进行联接。再次感觉非常讨厌。
有一个更好的方法吗?
可能的重复:将
数组参数传递给存储过程
假设您想通过唯一标识符列表过滤结果,以便您的 SQL 语句读取:
WHERE CustomerID in (@CustomerIDs)
Run Code Online (Sandbox Code Playgroud)
这可能吗?
编辑:
为了澄清和回答尼克的问题,我想将值列表从 C# 传递到 SQL Server,并且能够执行类似于我上面发布的 SQL 的选择。由于存在大量数据,因此这比获取比需要的更多的数据并不得不搜索它更可取。
我有一个包含 3000 个字符串的列表,我将它们(一次 20 个)传递到参数化的 IN 子句中。它绝对没有得到我希望每次执行 500 毫秒的结果。
该列是一个索引。你知道比这更好的方法吗:
SELECT * FROM [ohb].[dbo].[MasterUrls] WITH (NOLOCK) WHERE Hash
IN(@p0,@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18,@p19)
Run Code Online (Sandbox Code Playgroud)
3000 个列表需要 3 到 5 分钟。我真的需要把它缩短到大约 30 秒。这可能吗?
我在具有 24 gigs RAM 的服务器上使用 MSSQL 2008 R2,并在 6HDD (@15k/rpm) RAID 10 ISCSI 上运行双 8 核 NUMA Xeons @2.4Ghz。
该表有 140 万行,索引为非聚集索引。
执行计划将索引扫描显示为总执行的 90%。