2016-08-25 4 views
-1

У меня есть этот SELECT с помощью SQL Server 2012:Как сделать ВЫБРАТЬ быстрее

SELECT 
    dcodigo AS cuenta, 
    SUM(dvalordeb) AS sumadebitop, 
    SUM(dvalorcre) AS sumacreditop 
FROM 
    diario 
WHERE 
    diario.anulado = 0 
    AND LEN(diario.dcodigo) > 0 
    AND MONTH(diario.dfecha) <= 11 
    AND YEAR(diario.dfecha) = 2015 
    AND diario.tipo1 <> 'CI' 
GROUP BY 
    dcodigo 

но это занимает около 2,8 минут. Что я могу сделать для более быстрого выполнения?

Таблица diario индексируется: dcodigo, dfecha и tipo1, и имеет более чем 600 000 строк.

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

+3

У вас есть какие-либо индексы на вашем столе? В любом случае, вы должны по крайней мере изменить свои фильтры на 'dfecha':' AND dfecha> = '20150101' И dfecha <'20151201'' – Lamak

+2

Об этом почти невозможно сказать, не видя вашу структуру таблицы, индексы или даже план выполнения для этого запроса. – DavidG

+2

Вы не используете индексы на dfecha; когда вы разбираете дату, когда он больше не может использовать этот индекс. если у вас нет индекса функции len (diario.dcodigo), он также не сможет использовать этот индекс. – xQbert

ответ

1

попробовать это:

если dfecha только дата, то

SELECT dcodigo as cuenta, 
    sum(dvalordeb) sumadebitop, 
    sum(dvalorcre) sumacreditop 
FROM diario 
WHERE anulado = 0 
    AND dcodigo is not null 
    and dcodigo <> '' 
    AND dfecha between '20150101' and '20151031' 
    AND tipo1 <> 'CI' 
GROUP BY dcodigo 

если dfecha имеет дату и время, а затем

SELECT dcodigo as cuenta, 
    sum(dvalordeb) sumadebitop, 
    sum(dvalorcre) sumacreditop 
FROM diario 
WHERE anulado = 0 
    AND dcodigo is not null 
    and dcodigo <> '' 
    AND dfecha >='20150101' 
     and dfecha < '20151101' 
    AND tipo1 <> 'CI' 
GROUP BY dcodigo 
+3

'dcodigo like '%%'' это плохая идея, может также искать LEN' вместо – Lamak

+1

Ups, это не касается последнего дня октября, если у данного значения есть время ... [Плохая привычка пинать] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx) Лучше '> = StartDaten AND Shnugo

+0

Я пытался сделать его доступным (но если% в начале) ... и подумал, что это условие: «Лен()> 10' ... .... –

1

условия на основе вызовы функций не будут полезны EXEs.

Заменить LEN(diario.dcodigo)>0 по diario.dcodigo<>''. Но основной вопрос заключается в том, содержит ли этот столбец вообще пустые строки. Я полагаю, что пустые поля содержат только NULL. В этом случае вы должны проверить diario.dcodigo IS NOT NULL. Если это может быть как тест, как этот NOT (diario.dcodigo IS NULL OR diario.dcodigo = '') и не забудьте скобки.

Как прокомментировал Ламак, отмените функции МЕСЯЦА и ГОДА и вместо этого проверите против констант даты.

Смежные вопросы