2014-04-07 38 views
1

摘要高效的方式

是否有(SQL Server 2005上)運行大量的動態SQL語句的有效途徑?

詳細

我們的系統允許用戶創建「郵件提醒」訂閱 - 在系統上的新的比賽是通過電子郵件發送給他們每天的基礎上。

訂閱允許多個選項,包括使用搜索關鍵字。我自己編寫的解析器輸出適當的SQL代碼,考慮到and,or和括號()解析器不允許通過可用於SQL注入的任何東西。

例如,關鍵字可能會根據用戶的輸入this (that or other),所得查詢將大致爲最終...

SELECT * 
FROM [VW_EMAIL_ALERT] 
WHERE ([SEARCH] LIKE '%this%' AND ([SEARCH] LIKE '%that%' OR [SEARCH] LIKE '%other%')) 

每天晚上,所有的預訂都單獨處理,因爲每一個是潛在的獨特。結果是批處理必須在每個訂閱上運行遊標,並通過sp_executesql運行SQL。

顯然這是非常低效的,並可能導致嚴重的重載 - 在某些情況下導致超時。運行此處理的存儲過程被編碼爲將訂閱拆分爲塊,因此它們不會一次全部被調用。

有沒有更好/更有效的方法來做到這一點?

注:不幸的是,我們目前堅持支撐最低的SQL Server 2005,我們的一些客戶仍然使用該技術

+0

也許一個愚蠢的問題,但你不能改變它使用靜態SQL更有效的關鍵字通配符? (是的,我知道可以花費很多努力來改變你的模式)。順便說一句你使用「純」的動態或參數動態? – jean

+1

你知道%不是a =的通配符嗎?正如所寫的那樣,永遠不可能是真的。 – Paparazzi

+0

這可能是一些幫助:http://stackoverflow.com/questions/13259850/dynamic-sql-and-stored-procedure-optimization –

回答

1

如果你正在尋找的關鍵詞是,你可以做到這一點
一個像「%什麼都不使用索引

使用全文搜索索引的話效率最低的方式

或寫你自己的解析器索引唯一字
你將建立一個關鍵字表格
和索引關鍵字
這是一個非常有效的闕RY

select id 
    from keywords 
where keyword = 'this' 
intersect 
select id 
    from keywords 
where keyword in ('that','other') 

即使在它仍然比搜索整個文本

+0

感謝Blam,我認爲你是對的,FullText搜索對於這種情況非常理想 - 不幸的是,我們沒有在所有客戶端服務器上提供FullText。 – freefaller

+0

然後寫你自己的。只需將文本解析爲關鍵字表格即可。 – Paparazzi

+0

@Blam,這真不是個壞主意,我真的很喜歡:-)謝謝! (編輯:啊,但不幸的是它不會處理'和',''或'或括號。)該死的) – freefaller

0

我希望這將有助於。在我的工作中,我們用這種實現來替換遊標。

DECLARE 
    @strSQL NVARCHAR(MAX) = '' 

CREATE TABLE #tmp 
(
    Result_Query VARCHAR(MAX) 
) 

INSERT INTO 
    #tmp 
SELECT 
    'SELECT * FROM [VW_EMAIL_ALERT] WHERE ([SEARCH] = ''%this%'' AND ([SEARCH] = ''%that%'' OR [SEARCH] = ''%other%''))' 

UNION 

SELECT 
    'SELECT * FROM [VW_EMAIL_ALERT] WHERE ([SEARCH] = ''%this1%'' AND ([SEARCH] = ''%that1%'' OR [SEARCH] = ''%other1%''))' 

SELECT 
    @strSQL = @strSQL + Result_Query + ';' 
FROM 
    #tmp 

SET 
    @strSQL = LEFT(@strSQL, LEN(@strSQL) - 1) 

PRINT @strSQL 
EXEC(@strSQL) 
+0

感謝您的建議,但我真的不知道如何能夠稍微提高效率。 – freefaller