2016-09-13 3 views
0

Я пытаюсь выполнить счет, отличный от SQL-сервера, двумя полями.Count, отличное от нескольких столбцов, занимает много времени

Я пробовал два разных способа. первый из них конкатенации:

select count (distinct CONCAT ([UCID],[CALLSEGMENT])) 
from IVR_LINES 
where UCID in (select UCID 
from [EPMTest].[dbo].[IVR_LINES] 
where MODULE = 'hozlap' and EVENT_NAME = 'A3' and EVENT_VALUE in ('1','2','3') and DATE> 20160911) 
and EVENT_NAME = 'A6' or EVENT_NAME = 'A7' 

В то время как второй является использование суб-запрос:

select COUNT(*) from(
select distinct UCID,CALLSEGMENT 
from IVR_LINES 
where UCID in (select UCID 
from [EPMTest].[dbo].[IVR_LINES] 
where MODULE = 'hozlap' and EVENT_NAME = 'A3' and EVENT_VALUE in ('1','2','3') and DATE> 20160911) 
and EVENT_NAME = 'A6' or EVENT_NAME = 'A7' 
)a 

Они берут примерно в то время же работает (более 10 секунд, вероятно, из-за самого внутреннего запроса). Однако я хотел бы знать, какой из них эффективнее? какой метод выбрать?

Благодаря

+0

Посмотрите на план выполнения – TheGameiswar

+0

Я бы сказал, что первый из них более рискован, если только домены 'UCID' и' CALLSEGMENT' не гарантируют, что конкатенация не может создавать ложные дубликаты. Например. если одна строка может содержать 'a, bc' и вторую строку' ab, c', тогда конкатенация этих двух столбцов будет относиться к ним как к равным. –

ответ

0

Я думаю, что что-то не так с вашими запросами

первый DATE > 20160911 должен дать ошибку, попытаться заменить его DATE > '20160911'

второй and EVENT_NAME = 'A6' or EVENT_NAME = 'A7'
является ОЧЕНЬ отличается от and (EVENT_NAME = 'A6' or EVENT_NAME = 'A7')

с вашей синтой х запросы будут рассчитывать многие больше записей, чем (я думаю), как ожидается, и это может быть проблема времени медленного выполнения

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

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

+0

Вы правы. Эта БД вообще не нормируется, я долго трачу время на то, как извлекать данные из нее. Что касается даты - это не строка, а число. –

+0

рад помочь, извините за недоразумение, я подумал, что это «DATETIME». – MtwStark

1

Пожалуйста, ваш план выполнения, чтобы найти, где именно это занимает много времени. Тем временем вы можете переписать свой запрос с помощью предложения where следующим образом.

SELECT COUNT(*) 
FROM (
    SELECT DISTINCT UCID 
     ,CALLSEGMENT 
    FROM IVR_LINES IL 
    WHERE EXISTS (
      SELECT 1 
      FROM [EPMTest].[dbo].[IVR_LINES] 
      WHERE MODULE = 'hozlap' 
       AND EVENT_NAME = 'A3' 
       AND EVENT_VALUE IN (
        '1' 
        ,'2' 
        ,'3' 
        ) 
       AND UCID = IL.UCID 
       AND DATE > 20160911 
      ) 
     AND EVENT_NAME IN (
      'A6' 
      ,'A7' 
      ) 
    ) A 
+1

Это не даст тот же результат, что и отправленный запрос из-за ** и EVENT_NAME IN ('A6', 'A7') **, заменяя ** и EVENT_NAME = 'A6' или EVENT_NAME = 'A7' **. Однако я бы подумал, что это даст намеренный результат –

+0

Можете ли вы уточнить? Когда я запускаю это, я получаю номер. Что это значит? –