我有一个小的查询将一些像这样的临时表连接在一起
select u.batch_uid, u.user_id, u.firstname, u.middlename, u.lastname, u.email, u.student_id, u.row_status, uff.batch_uid, uff.user_id, uff.firstname,uff.middlename,uff.lastname,uff.email, uff.student_id,uff.row_status
from users u full outer join users_feed_file uff on u.user_id = uff.user_id
where u.data_src_pk1 = 83
结果将是这样的:
(users as u) batch_uid user_name row_status (users_feed_file as uff) batch_uid user_name row_status
johndoe johndoe 2 johndoe johndoe 0
因为,前3列来自正在从实时表复制的源表。最后3列来自一个feed文件,它被处理并插入到临时表中,然后在运行时间完成后被删除(稍后用新数据重新加载)。
我想要完成的工作主要是查看行以执行各种操作。我要检查近25,000行。所以在这种情况下,我想做的就是检查
之类的东西if u.batch_uid, u.user_name, u.row_status is not null
and
uff.uid, uff.user_name, uff.row_status is not null
and u.row_status is equal to 2 and uff.row_status is equal to 0
add user to feed file to enable him
然而,这些(以及其他类型的条件和检查)需要对所有返回的25k行进行,然后逐行处理,以确定我的代码是否需要在文件中插入一行。 / p>
谢谢。
答案 0 :(得分:0)
您的问题中有几个不同的问题需要解决。
首先,在您的初始SELECT中,您正在使用FULL OUTER JOIN - 但是您明确地查找记录,其中(表)User中的三个字段与(table)UserFeed中的三个字段匹配。你会看到更好的性能 - 并且处理更少的记录 - 使用INNER JOIN,如下所示:
SELECT u.batch_uid, u.user_id, u.firstname,
u.middlename, u.lastname, u.email, u.student_id,
u.row_status, uff.batch_uid, uff.user_id, uff.firstname,
uff.middlename, uff.lastname, uff.email, uff.student_id,
uff.row_status
FROM users u
INNER JOIN users_feed_file uff
ON u.user_id = uff.user_id
WHERE u.data_src_pk1 = 83
AND u.row_status = 2
AND uff.row_status = 0;
这将为您提供与您的完整条件相匹配的行 - 它应该是一组相对较小的行。
但是 - 如果您只是从(表)用户检索记录以与(表)UserFeedFile进行比较,为什么要获取用户的姓名,地址等?不需要 - 只需获取您想要的数据:
SELECT u.user_id
FROM user U
INNER JOIN userfeedfile UFF
ON U.user_id = UFF.user_id
WHERE U.row_status = 2
AND UFF.row_status = 0
AND U.data_src_pkt1 = @PacketNumber; -- That's a parameter
接下来的问题是:你打算用这些行做什么?如果您要更新另一个表中的字段值(或者,可能在User Feed File表中),则可以使用INSERT或UPDATE语句来更新。要更新(表)UserFeedFile,请执行以下操作:
UPDATE userfeedfile
SET enabled = 1
FROM user U
INNER JOIN userfeedfile UFF
ON U.user_id = UFF.user_id
WHERE U.row_status = 2
AND UFF.row_status = 0
AND U.data_src_pkt1 = @PacketNumber;
(您可以使用SET语句更改第二行,以更新您选择的任何字段。)
作为一般规则,SQL数据库最适合数据集。如果您发现自己一次迭代一个数据集,并且特别是如果您要将数据显示到另一个进程(可能在差异机器上的网络上)以处理.Net代码中的行,请停止并想一想如何在SQL Server中使用集合来完成它。性能差异将是戏剧性的。