相关疑难解决方法(0)

从一组值中,如何找到未存储在表列中的值?

我有一个表,它可能会存储数十万个整数

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)

mysql

12
推荐指数
2
解决办法
1万
查看次数

将数组参数传递给存储过程

可能的重复:
将大量数据发送到存储过程的技术

我经常遇到我想将一组 Id 作为参数传递给存储过程的情况。

例如,对于 GetCustomerAccounts 存储过程,客户端从列表中选择 20 个客户。然后我想将这 20 个客户 ID 传递给程序以返回他们的帐户。

目前我通过有一个参数表来解决这个问题。我用我的客户 ID 和单个 Guid ID 填充它。然后将此单个 Guid ID 传递给过程,然后该过程再次连接参数表。我不喜欢这样,因为它涉及多次访问数据库。

另一种可能性是在逗号分隔的 Varchar 参数中传递 Id。然后,存储过程可以将此字符串解析为临时表,然后针对该表进行联接。再次感觉非常讨厌。

有一个更好的方法吗?

sql-server stored-procedures

11
推荐指数
0
解决办法
1174
查看次数

如何向存储过程提交项目列表以限制结果?

可能的重复:将
数组参数传递给存储过程

假设您想通过唯一标识符列表过滤结果,以便您的 SQL 语句读取:

WHERE CustomerID in (@CustomerIDs)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:

为了澄清和回答尼克的问题,我想将值列表从 C# 传递到 SQL Server,并且能够执行类似于我上面发布的 SQL 的选择。由于存在大量数据,因此这比获取比需要的更多的数据并不得不搜索它更可取。

sql-server query stored-procedures

8
推荐指数
3
解决办法
1万
查看次数

SELECT * WHERE VarCharColumn IN (...) 优化

我有一个包含 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%。

index sql-server-2008 sql-server

6
推荐指数
2
解决办法
451
查看次数