该方案首先运行昂贵的排序查询,并将第一个100,000主键(Int32)保存在.NET列表中。然后从大约十二个表中一次检索100行细节。详细查询的格式为:
select ... from DetailA where PK in (sorted list of 100 PK).
问题是返回没有按照in子句中的顺序排序。需要详细分类。不希望应用用于创建100,000主列表的排序,因为这是一种昂贵且混乱的排序。
我的想法是将100 PK加载到#tempSort表中并将其用于排序。有更好的方法吗?
目前使用SQLDataReader一次获取一行详细信息,大约需要2秒。测试使用具有多个DataTable的DataSet一次性获取所有数据,并且使用SQLDataReader一次比一行慢一个因子3.这些数据被加载到对象中,因此需要DataSet的高级功能。
我不想在#temp中保存100,000个主结果,因为这是一个很大的活动数据库,需要将负载移到客户端。
按照建议尝试表值参数 这是正确的语法吗?
CREATE TYPE sID100 AS TABLE
( sID INT, sortOrder INT );
GO
/* Declare a variable that references the type. */
DECLARE @sID100 AS sID100;
/* Add data to the table variable. */
INSERT INTO @sID100 (sID, sortOrder)
values (100, 1), (200,2), (50,3);
Select * from @sID100;
select docSVsys.sID, docSVsys.addDate
from docSVsys
join @sID100 as [sID100]
on [sID100].sID = docSVsys.sID
order by [sID100].sortOrder
GO
Drop TYPE sID100
以上不是最佳选择。我正在学习,但在C#中可以创建一个DataTable并使用Tabel-Value Parameters将其传递给存储过程。正如马丁在评论中所说的那样,但在我理解他的话之前,我们进行了一些研究。
答案 0 :(得分:1)
IN子句中PK的顺序无关紧要。
只有最外层的ORDER BY很重要:如果没有指定,任何订单都是任意的
select ...
from DetailA
where PK in (sorted list of 100 PK)
ORDER BY PK
在视图,内联函数,派生表或子查询的定义中使用ORDER BY时,该子句仅用于确定TOP子句返回的行。在查询这些结构时,ORDER BY子句不保证有序结果,除非在查询本身中也指定了ORDER BY。
编辑后,反馈并包括马丁史密斯的想法
select ...
from DetailA A
JOIN
TVPorTemptable T ON A.PK = T.PK
ORDER BY
T.OrderByCOlumn