如何在查询中查找valuelist时更快地进行查询?

时间:2014-09-28 03:16:22

标签: sql sql-server-2008 coldfusion

我有两个表位于两个不同的服务器中。          两个表都很大,他们有超过10万条记录。          我试图获得所有的帐号          不在bitdisclosure表中,而是在member_flags = 1的成员表中          问题是,我怎么能让它更快?

 <cfquery datasource="#v_DATASOURCE_2#" name="GetMember" result="tmpResult2">
 SELECT [Account] FROM [BITDisclosure]  
  </cfquery>  
  <cfquery datasource="#v_DATASOURCE#" name="GetPositiveCOSAccounts" result="tmpResult"> 
    SELECT        member_account       ,member_flags      
    FROM [member]   where member_flags=1   and   member_account not IN (#ValueList(GetMember.account)#)
     </cfquery> 

当我尝试使用前1000条记录时,它可以快速提供结果,还有另一种方法可以加快这个过程吗?

3 个答案:

答案 0 :(得分:4)

这需要一些阅读和实验,但我已经处理了多个数据源超过十年。链接服务器听起来是个好主意,但在实践中,您正在处理网络限制和其他瓶颈问题。以XML格式传递数据变得越容易。您会发现以这种方式使用结构化XML比处理列表容易得多。随着列表变大,您最终会在SQL Server中达到大小限制,然后就会卡住。

将您的第一个查询更改为

SELECT [Account] FROM [BITDisclosure] AS XML

这将直接从SQL Server返回完整的记录集XML,从而消除了使用CF将记录集转换为XML的开销。

现在,您可以将此结果作为参数(变量)传递给第二个查询。 SQL Server中内置了许多XML查询函数。举几个例子,看看this answer on SO。该答案链接到this article,其中涵盖了许多基础知识。

例如:

create table #demo (field1 xml)
insert into #demo (field1) 
values ('<document>
<header>Alphabet
<items>
<item id="a">a is for apple
<item id="b">b is for balloon
</items>
</document>')

然后,您可以运行此SQL语句以获取<header>节点的内容。

select field1.query('/document/header') from #demo

在您的情况下,您可以将第二个查询更改为存储过程,您可以在其中将XML数据作为参数@accountXML传递。然后,您可以直接查询@accountXML,而不是将数据放入临时表中,如示例所示。

答案 1 :(得分:0)

为什么不使用queryNew将所有数据推入临时查询中的一个查询? http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f94.html

答案 2 :(得分:0)

如果member_flags = 1是您查询的条件,我们不确定您为什么需要member_flags,但这里有一些加快查询速度的建议:

SELECT member_account, member_flags
FROM member
LEFT OUTER JOIN BITDisclosure
ON member.member_account = BITDisclosure.account
WHERE member.member_flags=1

OR(如果BITDisclosure中有多个记录,帐户字段的值相同)

SELECT member_account, member_flags
FROM member
LEFT OUTER JOIN (SELECT distinct BITDisclosure.account from BITDisclosure) as BD
ON member.member_account = BD.account
WHERE member.member_flags=1

最后一个子句(其中member.member_flags = 1)将减少它必须与连接表(BITDisclosure)进行匹配的次数。在第二个版本中,它还会减少用于比较的记录数量。