2014-10-29 64 views
0

我第一次遇到這個問題: 1)在生產數據庫上查詢需要永久完成 2)我需要備份數據庫,我的筆記本電腦調試:查詢工作正常,並在1秒內返回在數據庫上查詢失敗,但在恢復備份後工作正常

我的直覺是有些東西是損壞的(如索引),這從來沒有發生過我,所以我只是猜測。

您能否建議一種方法來檢查這種錯誤?

僅供參考我粘貼查詢,但它沒有多大意義。

在生產分貝,如果我完全刪除CROSS之後申請查詢的子查詢執行罰款:

SELECT 
    CA.ID_CESPITE, CASE WHEN child.count > 0 THEN 'Y' ELSE 'N' END AS HAVE_CHILD_PRG, 
    CA.ID_CESPITE_PADRE, 
     CA.ID_TIPO_CESPITE, 
     CA.COD_CESPITE, 
     CA.DESCR_CESPITE, 
     CA.ID_STATO_CESPITE, 
     CA.ID_REFERENTE, 
     VUD.ID_UTENTE AS ID_UTENTE_RESPONSABILE,VUD.ID_DIPENDENTE, 
     ISNULL(CP.V, 'N') AS V, 
     ISNULL(CP.O, 'N') AS O, 
     ISNULL(CP.I, 'N') AS I, 
     ISNULL(CP.A, 'N') AS A, 
     CTCS.ID_TIPO_CESPITE AS ID_TIPO_CES, 0 AS LEVELO, 
     CA.PROF_ID,CA.ISLOCKED,CTCS.DESCR_TIPO_CESPITE 
FROM 
    CES_ANAGRAFICA CA LEFT OUTER JOIN CES_PERMESSI CP ON ((CA.ID_CESPITE = CP.ID_CESPITE) AND (CP.ID_UTENTE = 4654)) 
LEFT JOIN CES_TIPI_CESPITE CTCS ON CA.ID_TIPO_CESPITE = CTCS.ID_TIPI_INFRSTR 
LEFT OUTER JOIN V_UTENTI_DIPENDENTI VUD ON CA.ID_RESPONSABILE = VUD.ID_DIPENDENTE 
CROSS APPLY ( SELECT [Count] = COUNT(*) FROM V_CESPITE_TREE VCA JOIN MAN_PRG_OPERAZIONI MPO 
    ON MPO.ID_CESPITE = VCA.ID_CHILD WHERE VCA.ID_PARENT = CA.ID_CESPITE AND MPO.ID_FATHER is not null) child 

我正準備找上我的筆記本電腦工作的問題,但我感到驚訝的是在還原備份後(到新的測試數據庫)都按預期工作。

我希望我表達自己。

+1

檢查它正在等待什麼以及是否被阻止。在查詢運行時,在另一個窗口中:SELECT session_id的status_type,status,blocking_session_id FROM sys.dm_exec_requests;'。 – 2014-10-29 21:15:57

+1

您的生產服務器的維護計劃是否包含更新統計信息? SQL可能會根據陳舊的啓發式方法優化您的查詢。 – Brandon 2014-10-29 22:05:11

+0

我感謝你的想法,但最終的決定是在新的安裝od sql server上恢復備份以快速解決問題。我很抱歉,因爲我無法理解發生了什麼。 – LaBracca 2014-10-30 07:36:24

回答

0

根據您提供的信息,其主要是查詢(執行)計劃的問題,通常稱爲參數嗅探。檢查這here

雖然執行計劃有加快查詢,但一些相同的計劃可能不適合2種不同的情況。當您在其他系統上恢復和執行時,該實例沒有查詢計劃,因此它正在創建新計劃並且執行很快。所以試着清除你的高速緩存並再次執行......如果它執行的很快,那肯定是參數嗅探的問題。但沒有人去解決這個問題......去上面的鏈接,你可能會找到一個合適的解決方案。

+0

感謝您的指點,在我的情況下,它是山和老鼠,而不是大象和老鼠。 – LaBracca 2014-10-30 07:35:15