2013-04-16 4 views
0

У меня проблема в программе, которая запускает запросы в базе данных mssql 2008. Я провел некоторое исследование в анализаторе запросов. Существует странная проблема со следующими двумя запросами:Производительность в SQL Server

SELECT BOLD_ID , 
     BOLD_TYPE 
FROM ZusatzKlasseBase 
WHERE (bold_id IN (SELECT usereintrag 
         FROM  zusatzfeld 
         WHERE metazusatzfeld = 5211309 
           AND wertobject = 1298369) 
      AND bold_id IN (SELECT usereintrag 
          FROM  zusatzfeld 
          WHERE metazusatzfeld = 5207783 
            AND wertdatum = '20130415') 
     ) 

выполнения VOR этот запрос о один второй

SELECT BOLD_ID , 
     BOLD_TYPE 
FROM ZusatzKlasseBase 
WHERE (BOLD_TYPE IN (336)) 
     AND (bold_id IN (SELECT usereintrag 
          FROM  zusatzfeld 
          WHERE metazusatzfeld = 5211309 
            AND wertobject = 1298369) 
       AND bold_id IN (SELECT usereintrag 
           FROM  zusatzfeld 
           WHERE metazusatzfeld = 5207783 
             AND wertdatum = '20130415') 
      ) 

Среда выполнения этого запроса является одна минута.

У меня нет объяснения этому, поле BOLD_TYPE индексируется. Может ли кто-нибудь догадаться, почему более конкретный запрос медленнее?

Спасибо за все ответы заранее.

+0

Просто из интерес, почему вы выполняете 'select usereintrag от zusatzfeld где ...' часть кода дважды? Почему бы просто не оптимизировать код с несколькими наборами логических критериев? – Paul

+2

Насколько отличаются планы выполнения? – Rob

+1

Ну, есть ли индекс BOLD_TYPE? Сколько строк в таблице? Сколько строк имеет значение 336? –

ответ

2

Я хотел бы изменить индекс на bold_id (я предполагаю, что есть индекс bold_id) к этому:

CREATE INDEX whatever ON dbo.ZusatzKlasseBase(bold_id, bold_type) 
    WITH (DROP_EXISTING = ON); 

Тогда я бы перезаписать этот запрос слегка:

SELECT BOLD_ID, 
     BOLD_TYPE 
FROM dbo.ZusatzKlasseBase AS b -- always use schema prefix 
WHERE 
    (BOLD_TYPE IN (336)) 
    AND EXISTS 
    (
     SELECT 1 FROM dbo.zusatzfeld 
     WHERE metazusatzfeld = 5211309 
       AND wertobject = 1298369 
       AND usereintrag = b.bold_id 
    ) 
    AND EXISTS 
    ( 
     SELECT 1 FROM dbo.zusatzfeld 
     WHERE metazusatzfeld = 5207783 
       AND wertdatum = '20130415' 
       AND usereintrag = b.bold_id 
    ); 
Смежные вопросы