Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса с объединением таблиц! HELP  [new]
Rinatusss
Member

Откуда:
Сообщений: 6
Всем привет!
Имеется запрос, который объединяет 2 таблицы.
tab1 - 10 000 строк
tab2 - 2 000 строк

Объединение JOIN, где номер из таблицы tab1 сверяется с несколькими номерами из tab2

Такой запрос длится 45 мин, что оочень в напряг серверу и мне))

Подскажите, как можно оптимизировать?

Сам запрос:

DECLARE @datefrom as Datetime,
        @dateto   as Datetime
SET @datefrom = '2013-06-13'
SET @dateto   = '2013-06-13'
SELECT  f.id                    as 'id',
        f.date_modified + 0.25  as 'Дата, время',
        ss.OfferedTime          as 'Дата и время соединения с оператором',
FROM (
      SELECT * 
          FROM dbo.tab1 ss 
          WHERE ss.OfferedTim >= @datefrom 
            AND ss.OfferedTime <= @dateto 
            AND ss.CallOut=1) ss
cross apply(
      SELECT getPhoneNumber=dbo.getPhoneNumber(ss.ID, ss.OfferedTime, ss.TerminatedTime)) Calc1
JOIN (
      SELECT * 
          FROM database2.dbo.tab2 
          WHERE date_modified >= @datefrom 
            AND date_modified <= @dateto)) f
ON
    Calc1.getPhoneNumberOutAndPD IN (f.SOT_CLIENT,
                                     f.SOT_CLIENT2,
                                     f.SOT_CLIENT3,
                                     f.DT_CLIENT,
                                     f.RT_CLIENT,
                                     f.DOP_NUM1,
                                     f.DOP_NUM2,
                                     f.KT_1,
                                     f.KT_2,
                                     f.KT_3,
                                     f.KT_4)
ORDER BY f.id, ss.OfferedTime ASC
14 июн 13, 15:40    [14434464]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Rinatusss
Всем привет!
Имеется запрос, который объединяет 2 таблицы.
tab1 - 10 000 строк
tab2 - 2 000 строк

Объединение JOIN, где номер из таблицы tab1 сверяется с несколькими номерами из tab2

Такой запрос длится 45 мин, что оочень в напряг серверу и мне))

Подскажите, как можно оптимизировать?

Можно посмотреть на скрипты создания таблиц и индексы?
14 июн 13, 15:41    [14434472]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Glory
Member

Откуда:
Сообщений: 104760
вот это
JOIN (
      SELECT * 
          FROM database2.dbo.tab2 
          WHERE date_modified >= @datefrom 
            AND date_modified <= @dateto)) f

заменить на композицию UNION ALL для каждого поля из
IN (f.SOT_CLIENT,
                                     f.SOT_CLIENT2,
                                     f.SOT_CLIENT3,
                                     f.DT_CLIENT,
                                     f.RT_CLIENT,
                                     f.DOP_NUM1,
                                     f.DOP_NUM2,
                                     f.KT_1,
                                     f.KT_2,
                                     f.KT_3,
                                     f.KT_4)
14 июн 13, 15:44    [14434482]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
dbo.getPhoneNumber возвращает одно поле.
Откуда же берётся Calc1.getPhoneNumberOutAndPD ?

Последний ON относится к чему? К CROSS APPLY что ли?

И со скобками, кажется, что-то не то?
Этот запрос точно рабочий?
14 июн 13, 15:50    [14434511]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Чтобы JOINить и CROSS APPLYить, дополнительные SELECTы вовсе не нужны.
Только путают
14 июн 13, 15:52    [14434519]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Msg 156, Level 15, State 1, Line 8
Incorrect syntax near the keyword 'FROM'.
Msg 102, Level 15, State 1, Line 13
Incorrect syntax near 'ss'.
Msg 102, Level 15, State 1, Line 15
Incorrect syntax near 'Calc1'.
Msg 102, Level 15, State 1, Line 20
Incorrect syntax near ')'.

Это мне сказал Parse кода... Выкладывайте полностью:)
14 июн 13, 15:53    [14434523]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iap
dbo.getPhoneNumber возвращает одно поле.
Откуда же берётся Calc1.getPhoneNumberOutAndPD ?

Последний ON относится к чему? К CROSS APPLY что ли?

И со скобками, кажется, что-то не то?
Этот запрос точно рабочий?
Или dbo.getPhoneNumber вообще скалярная? Тогда APPLY вообще не нужен.
14 июн 13, 15:54    [14434524]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Mikebond
Member

Откуда: Киев
Сообщений: 32
Rinatusss
...
ON
    Calc1.getPhoneNumberOutAndPD IN (f.SOT_CLIENT,
                                     f.SOT_CLIENT2,
                                     f.SOT_CLIENT3,
                                     f.DT_CLIENT,
                                     f.RT_CLIENT,
                                     f.DOP_NUM1,
                                     f.DOP_NUM2,
                                     f.KT_1,
                                     f.KT_2,
                                     f.KT_3,
                                     f.KT_4)


можно заменить например так:
 declare @dc char = '$'
....
                  (  SELECT tf.*,
                               @dc+tf.SOT_CLIENT+@dc+
                                     tf.SOT_CLIENT2+@dc+
                                     tf.SOT_CLIENT3+@dc+
                                     tf.DT_CLIENT+@dc+
                                     tf.RT_CLIENT+@dc+
                                     tf.DOP_NUM1+@dc+
                                     tf.DOP_NUM2+@dc+
                                     tf.KT_1+@dc+
                                     tf.KT_2+@dc+
                                     tf.KT_3+@dc+
                                     tf.KT_4+@dc as ph
                      FROM database2.dbo.tab2 
          WHERE date_modified >= @datefrom 
            AND date_modified <= @dateto)) f

ON f.ph Like '%'+@dc+Calc1.getPhoneNumberOutAndPD + @dc+'%' -- пользуясь терминами исходного запроса.


от "cross apply" тоже желательно избавиться.
14 июн 13, 20:22    [14435513]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Rinatusss
Member

Откуда:
Сообщений: 6
Спасибо всем за советы!
От cross apply избавился созданием временной таблицы и время просчета запроса сократилось в среднем до 20-40 сек.

Но теперь вопрос в следующем:
Просчет за день проходит нормально, но если выбрать диапазон от двух дней и выше, то записи, понятное дело, растут в геометрической прогрессии.
Как сделать чтобы расчет делался строго по дням поочередно, а не за весь промежуток сразу?

Собственно сам запрос:
DECLARE @datefrom as Datetime,
        @dateto    as Datetime
SET @datefrom = '2013-05-26'
SET @dateto   = '2013-05-26'

CREATE TABLE #zeta 
  ([Call_ID] [binary](8) NOT NULL,
  [OfferedTime] [datetime] NOT NULL,
  [TerminatedTime] [datetime] NULL,
  phonenumber [nvarchar](64))
  INSERT INTO #zeta
    ([Call_ID],
    [OfferedTime],
    [TerminatedTime],
    phonenumber)
  (SELECT 
    ss.[Call_ID],
    ss.[OfferedTime],
    ss.[TerminatedTime],
    dbo.getPhoneNumber(ss.Call_ID, ss.OfferedTime, ss.TerminatedTime)
   FROM (
       SELECT * 
       FROM dbo.tab1 ss 
       WHERE ss.OfferedTime >= @datefrom 
         AND ss.OfferedTime <= @dateto)) ss
         
--==========================================

 SELECT f.id as 'id',
        f.date_modified + 0.25  as 'Дата, время',
        ss.OfferedTime          as 'Дата и время соединения с оператором',
   FROM #zeta ss
   JOIN ( SELECT * 
          FROM database2.dbo.tab2
          WHERE date_modified >= @datefrom 
            AND date_modified <= @dateto) f
    ON
      ss.phonenumber IN (f.SOT_CLIENT,
                        f.SOT_CLIENT2,
                        f.SOT_CLIENT3,
                        f.DT_CLIENT,
                        f.RT_CLIENT,
                        f.DOP_NUM1,
                        f.DOP_NUM2,
                        f.KT_1,
                        f.KT_2,f.KT_3,
                        f.KT_4)
   ORDER BY f.id, ss.OfferedTime ASC
  DROP TABLE #zeta
16 июн 13, 16:24    [14438794]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с объединением таблиц! HELP  [new]
Glory
Member

Откуда:
Сообщений: 104760
Rinatusss
Как сделать чтобы расчет делался строго по дням поочередно, а не за весь промежуток сразу?

https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.6 и п.4
17 июн 13, 10:03    [14440325]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить