После перемещения сервера запрос больше не работает - PullRequest
0 голосов
/ 05 марта 2012

Мне нужна помощь для решения проблемы, которая сводит меня с ума!

Я переместил приложение ASP + SQL Server со старого сервера на новый.

Старый сервер Windows 2000 с MSDE, а новый - Windows 2008 с SQL Server 2008 Express.

Все в порядке, даже немного быстрее, за исключением одной проклятой функции, чья страница asp дает время ожидания.

Я пытался выполнить запрос на этой странице в окнах запросов управления, и он никогда не завершается, в то время как на старом сервере его выполнение занимало около 1 минуты.

Запрос такой:

SELECT DISTINCT 
    TBL1.TBL1_ID, 
    REPLACE(TBL1_TITOLO, CHAR(13) + CHAR(10), ’ ’), 
    COALESCE(TBL1_DURATA, 0), TBL1_NUMERO, 
    FLAG_AUDIO 
FROM 
    SPOT AS TBL1 
INNER JOIN 
    CROSS_SPOT AS CRS ON CRS.TBL1_ID = TBL1.TBL1_ID 
INNER JOIN 
    DESTINATARI_SPOT AS DSP ON DSP.TBL1_ID = TBL1.TBL1_ID 
WHERE 
    DSP.PTD_ID_PUNTO = 1044 
    AND DSP.DSP_FLAG_OK = 1 
    AND TBL1.FLAG_AUDIO_TESTO = 1 
    AND TBL1.FLAG_AUDIO_GRAFICO = ’A’ 
    AND CRS.CRS_STATO > 2 
    OR TBL1.TBL1_ID IN (SELECT ID 
                        FROM V_VIEW1 
                        WHERE ID IS NOT NULL AND V_VIEW1.ID_MODULO = 403721) 
    OR TBL1.TBL1_ID IN (SELECT TBL1_ID 
                        FROM V_VIEW2 
                        WHERE V_VIEW2.ID_PUNTO = 1044)  
ORDER BY 
    TBL1_NUMERO 

Я пытался преобразовать 2 представления в последних строках в таблицы, и запрос работает, даже если он немного медленнее, чем раньше.

Я перенес базу данных с помощью функции резервного копирования / восстановления. Может ли это быть и проблема индекса? Есть предложения?

Заранее спасибо!

Alessandro

1 Ответ

2 голосов
/ 05 марта 2012

Пробег:

--Defrag all indexes
sp_msForEachTable 'DBCC DBREINDEX (''?'')'

--Update all statistics
sp_msForEachTable 'UPDATE STATISTICS ? WITH FULLSCAN'

Если это не «просто исправит», то произойдет небольшое «улучшение» в оптимизаторе SQL Server, которое ухудшит ситуацию.

Попробуйте мастер настройки индекса (или его аналог SSMS2008).

После этого вам придется начинать выделять запрос, удаляя его до тех пор, пока он не запустится быстро. Поскольку у вас есть 2 OR предложений, вы в основном имеете 3 отдельных запроса:

SELECT ... FROM ...
WHERE DSP.PTD_ID_PUNTO = 1044 
AND DSP.DSP_FLAG_OK = 1 
AND TBL1.FLAG_AUDIO_TESTO=1 
AND TBL1.FLAG_AUDIO_GRAFICO=’A’ 
AND CRS.CRS_STATO>2 

--UNION

SELECT ... FROM ...
WHERE TBL1.TBL1_ID IN (
   SELECT ID 
   FROM V_VIEW1 
   WHERE ID IS NOT NULL 
   AND V_VIEW1.ID_MODULO = 403721
) 

--UNION 

SELECT ... FROM ...
WHERE TBL1.TBL1_ID IN (
   SELECT TBL1_ID 
   FROM V_VIEW2 
   WHERE V_VIEW2.ID_PUNTO = 1044
)  

Посмотрите, какой из них самый медленный.

p.s. Запрос, занимающий минуту, довольно плох. Мое мнение таково, что запросы должны возвращаться мгновенно (в рамках человеческого наблюдения)

...