2012-01-10 82 views
1

我發現在下面的SQL和動態SQL中使用了一個遊標。配置文件帶來了相當多的執行計劃,我認爲它必須處理這個遊標。這是SQL的糟糕選擇嗎?存儲過程中的光標性能問題

SET @SelectStmtSubHeader = 'SELECT DISTINCT 
     dbo.dsb_testID(sh.GPCustomerID) AScursor -- RIGHT HERE 
     PONumber, 
     sh.GPCustomerID, 
     ..... 

回答

4

一個很好的例子,這不是一個遊標的一個例子。

光標必須...

DECLARE this_is_a_cursor CURSOR 
FOR 
    SELECT 
    stuff 
    FROM 
    a_query 

還有你的文檔片斷代碼似乎使用標量函數來得到一個數值,它別名字cursor。但是有一個名爲cursor的字段不會使其成爲遊標。

+0

+1從我搞清楚它不是一個遊標大聲笑。我回答了這個問題,你證明了這個問題沒有意義:p – Jordan 2012-01-10 23:44:15

3

如果設置邏輯中存在替代方法,則光標幾乎總是一個不好的選擇。

SQL基於設置的邏輯。它們並不意味着像集合一樣迭代。

SQL優化器通常非常適合尋找聰明的方式來檢索數據。遊標是一個相對簡單的工具。 ANSI SQL確實需要它,所以它通常是存在的。

這裏是從Sybase

Cursor Performance Example

+0

像這樣的專制主義言論讓我發抖。 CURSOR總是有性能開銷,但有些情況下開銷小於替代值。例如,嘗試在SQL中運行總計。 *僅僅因爲它們經常被不經意的程序員不當使用,它並不會使它們普遍不好。* – MatBailie 2012-01-10 23:41:41

+0

不夠公平。請注意,儘管我給的鏈接來自Sybase。作爲數據庫的製造商,我會想象他們是一個很好的來源,他們基本上說,如果你有一個替代使用它。這就是說,我會編輯我的帖子;) – Jordan 2012-01-10 23:48:37

+0

+ 1的單詞'接近:) :) – MatBailie 2012-01-10 23:53:07