2014-09-28 55 views
2

我有兩個表在兩個不同的服務器。 這兩個表都很大,它們有超過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條記錄進行試驗時,它給出的結果很快,有沒有另一種方法可以加快這個過程?

+1

嘗試左連接而不是在,這兩個表上的搜索列上也有適當的索引 – radar 2014-09-28 03:28:05

+6

您可以設置鏈接的服務器嗎? – 2014-09-28 03:32:24

+0

如果您不能執行鏈接的服務器,請讓第一個查詢生成一個表示所有帳戶的XML字符串。第二個是它把這個xml分解成一個表變量,並做了一個選擇在那個 – 2014-09-28 21:55:10

回答

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,而不是將數據放入臨時表中,如示例中所示。

0

不知道爲什麼你需要member_flags如果member_flags = 1就是您的查詢的條件,但這裏有加快該查詢了幾個建議:

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)匹配的數目。而在第二個版本中,它也會減少用於比較的記錄數量。