2008-11-28 28 views
0

我使用SQL語句刪除另一個數據庫上存在的記錄,但這需要很長時間。改善asp腳本性能,需要3分鐘以上運行

下面的代碼還有其他替代方法可以更快嗎?數據庫是Access。

email_DB.mdb是從哪兒我想刪除的電子郵件地址的其他數據庫(表Newsletter_Subscribers) customers.mdb是其他數據庫上存在(Customers表)

SQLRemoveDupes = "DELETE FROM Newsletter_Subscribers WHERE EXISTS (select * from [" & strDBPath & "Customers].Customers " _ 
     & "where Subscriber_Email = Email or Subscriber_Email = EmailO)" 

NewsletterConn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & strDBPath & "email_DB.mdb" 

Set MM_editCmd = Server.CreateObject("ADODB.Command") 
MM_editCmd.ActiveConnection = NewsletterConn 
MM_editCmd.CommandText = SQLRemoveDupes 
MM_editCmd.Execute 
MM_editCmd.ActiveConnection.Close 
Set MM_editCmd = Nothing 

編輯:試過下面SQL從其中一個答案,但我不斷收到錯誤運行時:

SQL:DELETE FROM Newsletter_Subscribers WHERE客戶ID IN(從選擇客戶ID [ 「& strDBPath &」 客戶] .Customers其中Subscriber_Email =電子郵件或Subscriber_Email =埃瑪ilO)

我得到一個「參數太少。預計1「的Execute行錯誤信息

+0

IIRC,該消息可能意味着你使用的是不存在的列名,因此它處理它像一個參數。 – dkretz 2008-11-29 18:06:48

+0

DELETE和FROM之間應該有* * – AnonJr 2009-03-09 07:20:07

回答

0

我會WHERE Subscriber_Email IN(電子郵件,Email0)作爲WHERE子句

SQLRemoveDupes = "DELETE FROM Newsletter_Subscribers WHERE EXISTS " & _ 
(select * from [" & strDBPath & "Customers].Customers where Subscriber_Email IN (Email, EmailO)" 

我從經驗中發現,使用或使用WHERE子句中的謂詞在性能方面可能是有害的,因爲SQL將不得不單獨評估每個子句,並且可能會決定忽略索引並使用表掃描。有時可以將它分成兩個單獨的語句。 (我不得不承認,我在這裏的SQL Server的角度思考,但也可以同樣適用於接入)

"DELETE FROM Newsletter_Subscribers WHERE EXISTS " & _ 
    (select * from [" & strDBPath & "Customers].Customers where Subscriber_Email = Email)" 

"DELETE FROM Newsletter_Subscribers WHERE EXISTS " & _ 
    (select * from [" & strDBPath & "Customers].Customers where Subscriber_Email = EmailO)" 
0

假設有存在於Customers表的ID列,在SQL以下變化應提供更好的性能:

」 DELETE FROM Newsletter_Subscribers WHERE ID IN(選擇從ID [」 & strDBPath &‘客戶] .Customers其中Subscriber_Email =電子郵件或Subscriber_Email = EmailO)’

PS。理想的解決方案(從列名判斷)。將重新設計插入電子郵件的表和代碼邏輯首先是DS

+0

是的,Customers表(customers.mdb)具有CustID和Newsletter_Subscribers表(email_DB.mdb)作爲Subscriber_ID。所以我應該用您的SQL中的CustID替換ID? – smartins 2008-11-28 14:58:20

0

嘗試添加一個Access Querydef並調用它。

0

聽起來好像你在subscriber_enail字段中沒有索引。這迫使表掃描(或幾個)。在此字段中添加索引,您應該看到顯着的改進。

我會編碼查詢

DELETE FROM Newsletter_Subscribers where (Subscriber_Email = Email or Subscriber_Email = EMail0) 
0

我會嘗試這種分裂與單獨的數據庫連接兩個獨立的語句。

首先,獲取第一個數據庫中的電子郵件地址或ID列表(以字符串形式)。

其次,構造一個WHERE NOT IN語句並在第二個數據庫上運行它。

我想這會更快,因爲它不必在兩個數據庫之間進行互操作。唯一可能的問題是,如果第一個數據庫中有成千上萬的記錄,並且您達到了一個sql查詢字符串的最大長度(不管是什麼)。

這裏有一些有用的功能是:

function GetDelimitedRecordString(sql, recordDelimiter) 
    dim rs, str 
    set rs = db.execute(sql) 
    if rs.eof then 
     str = "" 
    else 
     str = rs.GetString(,,,recordDelimiter) 
     str = mid(str, 1, len(str)-len(recordDelimiter)) 
    end if 
    rs.close 
    set rs = nothing 
    GetDelimitedRecordString = str 
end function 

function FmtSqlList(commaDelimitedStringOrArray) 
    ' converts a string of the format "red, yellow, blue" to "'red', 'yellow', 'blue'" 
    ' useful for taking input from an html form post (eg a multi-select box or checkbox group) and using it in a SQL WHERE IN clause 
    ' prevents sql injection 
    dim result:result = "" 
    dim arr, str 
    if isArray(commaDelimitedStringOrArray) then 
     arr = commaDelimitedStringOrArray 
    else 
     arr = split(commaDelimitedStringOrArray, ",") 
    end if 
    for each str in arr 
     if result<>"" then result = result & ", " 
     result = result & "'" & trim(replace(str&"","'","''")) & "'" 
    next 
    FmtSqlList = result 
end function 
相關問題