Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
И снова здравствуйте.
У меня есть запрос содержащий табличные переменные. Если их исключить - селект пролетает за секунду. Если включить - 40-50 секунд. Пробовал заменить их на временные переменные (с кластерными и не кластерными индексами) - выигрыш не превышает 5-10 секунд..
Подскажите пжлст, чего можно сделать для ускорения?
  
  DECLARE @tbl_LastInBase TABLE(  ID_Unit INT,
                                  LastInBase DATETIME,
                                  P FLOAT,
                                  Q FLOAT)

  DECLARE @tbl_ConnectionHistory TABLE( ID_Unit INT,
                                        ExamStartDateTime DATETIME,
                                        ModemErrorCode INT,
                                        CounterError BIT)

  DECLARE @tbl_DuplicatedCounters TABLE(  ID_Unit INT,
                                          SerNom INT)

  
  DECLARE @tbl_LastExamInfo TABLE(  ID_Unit INT,
                                    LastExamDate DATETIME,
                                    ModemErrorDate DATETIME,
                                    ModemErrorCode INT,
                                    CounterError BIT) 

  DECLARE @tbl_SignalQuality TABLE( ID_Unit INT,
                                    Errors INT,
                                    Dials INT,
                                    SignalQuality INT)

  DECLARE @tbl_Dials TABLE( ID_Unit INT,
                            Dials INT)

  DECLARE @DaysForSignalQualityCount INT
        , @ID_RecordMax INT




        --поиск последней записи в базе
      SELECT @ID_RecordMax = count(ID_Record)
          FROM tbl_ArcDays

      INSERT INTO @tbl_LastInBase (ID_Unit
                                  , LastInBase
                                  , P
                                  , Q)
                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM (SELECT ID_Unit
                                  ,   (SELECT TOP 1 ID_Record
                                          FROM tbl_ArcDays n
                                          WHERE n.ID_Unit = o.ID_Unit
                                                AND n.ID_Record > @ID_RecordMax - 10000
                                          ORDER BY Date_Time DESC) AS ID_Record
                                FROM tbl_units o) m
                      LEFT OUTER JOIN   tbl_ArcDays r 
                                        ON r.ID_Record = m.ID_Record
 
      --Поиск дубликатов счетчиков
      INSERT INTO @tbl_DuplicatedCounters (ID_Unit
                                          , SerNom)
                  SELECT  a.ID_Unit
                          , b.SerialNumber
                      FROM tbl_Units a
                      LEFT JOIN tbl_Counters b 
                                ON a.ID_Counter = b.ID_Counter
      
      DELETE 
          FROM @tbl_DuplicatedCounters
          FROM @tbl_DuplicatedCounters h
      WHERE NOT EXISTS (SELECT ID_Unit
                           FROM @tbl_DuplicatedCounters
                            WHERE SerNom = h.SerNom
                                  AND ID_Unit < h.ID_Unit)
      
      ----------------------------
--	вычисления качества связи         


     SELECT @DaysForSignalQualityCount = -1 * ParamValue
          FROM tbl_ParamsLogConnections
          WHERE ID_Record = 2

      INSERT INTO @tbl_SignalQuality (ID_Unit
                                    , Errors)
                  SELECT  lc.ID_Unit
                          , count(lc.ID_Unit)
                      FROM tbl_LogConnections lc
                      WHERE lc.ExamStartDateTime >= dateadd(dd, @DaysForSignalQualityCount, getdate())
                            AND lc.ExamStartDateTime <= getdate()
                            AND (lc.ModemErrorCode <> 0
                                  OR lc.CounterError <> 0)
                      GROUP BY lc.ID_Unit
                      ORDER BY lc.ID_Unit

      INSERT INTO @tbl_Dials (ID_Unit
                              , Dials)
                  SELECT  lc.ID_Unit
                          , count(lc.ID_Unit)
                      FROM  tbl_LogConnections lc
                            , @tbl_SignalQuality sq
                      WHERE  lc.ExamStartDateTime >= dateadd(dd, @DaysForSignalQualityCount, getdate())
                            AND  lc.ExamStartDateTime <= getdate()
                            AND  sq.ID_Unit = lc.ID_Unit
                      GROUP BY  lc.ID_Unit
                      ORDER BY  lc.ID_Unit

      UPDATE  @tbl_SignalQuality
          SET Dials = b.Dials
          FROM  @tbl_SignalQuality a
                , @tbl_Dials b
          WHERE a.ID_Unit = b.ID_Unit

      UPDATE @tbl_SignalQuality
          SET SignalQuality = (Dials - Errors) * 100 / Dials
          FROM  @tbl_SignalQuality

 
    --	закончили вычисления качества связи

    --	статистика по последнему дозвону
    INSERT INTO @tbl_LastExamInfo (ID_Unit
                                   , LastExamDate
                                   , ModemErrorDate
                                   , ModemErrorCode
                                   , CounterError)

                SELECT m.ID_Unit
                       , r.ExamStartDateTime
                       , r.ModemErrorDateTime
                       , r.ModemErrorCode
                       , r.CounterError
                    FROM  (SELECT ID_Unit
                                  , (SELECT TOP 1 ID_Record
                                        FROM  tbl_LogConnections n
                                        WHERE n.ID_Unit = o.ID_Unit
                                              AND ExamStartDateTime >= dateadd(m, -1, getdate())
                                        ORDER BY  ExamStartDateTime DESC) AS ID_Record
                                FROM  tbl_units o) m
                    LEFT OUTER JOIN tbl_LogConnections r ON r.ID_Record = m.ID_Record
    -- закончили статистику по последнему довзовну			

и подскажите, где можно почитать (желательно на русском) про все эти планы выполнения, а то получить то его получил, а вот инфы полезной извлечь не могу:(
5 сен 13, 03:59    [14796900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
SET STATISTICS PROFILE ON делал, но там огромная абракадабра выходит, но если поможет - выложу. Вот скрин плана запроса

http://s018.radikal.ru/i511/1309/48/dc951b12773e.jpg
5 сен 13, 04:15    [14796941]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
KasKas
И снова здравствуйте.
У меня есть запрос
и какой из этих 10 запросов медленный?
5 сен 13, 04:55    [14797010]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
Да в общем-то все выполняются секунд по 5.. Но "статистика по последнему дозвону" - самая долгая, и до 20 доходит..
Единственно что "Поиск дубликатов счетчиков" наверное можно не смотреть уже.. А по остальным - по всем вопросы..
5 сен 13, 05:19    [14797018]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
aleks2
Guest
Я косею от этого зоопарка.
Любовь тредстартера к коррелированным подзапросам и тупое неумение применять табличные переменные - вот корень зла.
Кроме того, похоже он оперирует приличными объемами в табличных переменных, но считает создание индексов на них ниже свово достоинства.

      INSERT INTO @tbl_LastInBase (ID_Unit
                                  , LastInBase
                                  , P
                                  , Q)
                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM (SELECT ID_Unit
                                  ,   (SELECT TOP 1 ID_Record
                                          FROM tbl_ArcDays n
                                          WHERE n.ID_Unit = o.ID_Unit
                                                AND n.ID_Record > @ID_RecordMax - 10000
                                          ORDER BY Date_Time DESC) AS ID_Record
                                FROM tbl_units o) m
                      LEFT OUTER JOIN   tbl_ArcDays r 
                                        ON r.ID_Record = m.ID_Record

-- ведь тока больное  воображение может заставить ДВАЖДЫ выполнять соединение

                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM tbl_units m 
                           outer apply 
                           ( SELECT TOP(1) * FROM tbl_ArcDays n WHERE n.ID_Unit = n.ID_Unit AND n.ID_Record > @ID_RecordMax - 10000 ORDER BY n.Date_Time DESC ) r
                      
-- но настоящий джигит послал бы нафег эти новомодные выкрутасы

declare @tad table (ID_Unit INT primary key clustered, Date_Time DateTime);

insert @tad 
select ID_Unit, max(Date_Time) FROM tbl_ArcDays where ID_Record > @ID_RecordMax - 10000 group by ID_Unit;

                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM tbl_units m 
                           left outer join @tad tad on tad.ID_Unit = m.ID_Unit
                           left outer join tbl_ArcDays r on n.ID_Unit = tad.ID_Unit and n.Date_Time = tad.Date_Time
-- но должен честно предупредить: последний запрос НЕ является абсолютным эквивалентом исходного, если Date_Time может повторяться для ID_Unit.
5 сен 13, 06:35    [14797041]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
aleks2
Я косею от этого зоопарка.

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

ведь тока больное  воображение может заставить ДВАЖДЫ выполнять соединение

                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM tbl_units m 
                           outer apply 
                           ( SELECT TOP(1) * FROM tbl_ArcDays n WHERE n.ID_Unit = n.ID_Unit AND n.ID_Record > @ID_RecordMax - 10000 ORDER BY n.Date_Time DESC ) r

возвращает верное количество строк, но строки все одинаковые
Хотя выполняется мгновенно, да

В последнем селекте псевдонима n нет.. Так что я его переписал
declare @tad table (ID_Unit INT /*primary key clustered*/, Date_Time DateTime);

insert @tad 
select ID_Unit, max(Date_Time) FROM tbl_ArcDays where ID_Record > @ID_RecordMax - 10000 group by ID_Unit;

                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM tbl_units m 
                           left outer join @tad tad on m.ID_Unit = tad.ID_Unit
                           left outer join tbl_ArcDays r on tad.ID_Unit = r.ID_Unit and tad.Date_Time = r.Date_Time

за честное предупреждение спасибо, но твоя догадка оказалась верной - пара (Date_Time и ID_Unit) уникальны для каждой записи
индекс пока убрал потому что по непонятной причине в @tad появляется одна запись с ID_Unit равным NULL

ps:
Чем отличаются американский, еврейский и русский форумы:
На американском форуме ты задаёшь вопрос, потом тебе дают ответ.
На еврейском форуме ты задаёшь вопрос, потом тебе задают вопрос.
На русском форуме ты задаёшь вопрос и потом тебе долго объясняют, какой ты дебил .
5 сен 13, 08:18    [14797105]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
Да, выполняется последний вариант где-то 2-3 секунды (без индекса пока). Уже лучше, но хотелось бы ещё быстрее))
5 сен 13, 08:20    [14797107]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
Добавил в последний джоин r.ID_Record > @ID_RecordMax - 10000 и стало всего полсекунды=))


с остальными я так полагаю сделать надо аналогично?+)

и что насчет мануала по планам выполнения? не подскажете, где почитать можно?
5 сен 13, 08:24    [14797115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Гость333
Member

Откуда:
Сообщений: 3683
KasKas
Вот скрин плана запроса

http://s018.radikal.ru/i511/1309/48/dc951b12773e.jpg

Интересная картинка, ни разу подобных пиктограмм не видел, а в какой программе вы её получили?
5 сен 13, 08:45    [14797165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
SQL Studio for SQL Server\SQL Manager

и разве это пиктограмма? вот SET STATISTICS PROFILE ON - вот где пиктограмма так пиктограмма))
5 сен 13, 08:54    [14797193]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
aleks2
Guest
KasKas
ведь тока больное  воображение может заставить ДВАЖДЫ выполнять соединение

                  SELECT m.ID_Unit
                         , r.Date_Time
                         , r.P
                         , r.Q
                      FROM tbl_units m 
                           outer apply 
                           ( SELECT TOP(1) * FROM tbl_ArcDays n WHERE n.ID_Unit = n.ID_Unit AND n.ID_Record > @ID_RecordMax - 10000 ORDER BY n.Date_Time DESC ) r

возвращает верное количество строк, но строки все одинаковые
Хотя выполняется мгновенно, да


                           ( SELECT TOP(1) * FROM tbl_ArcDays n WHERE n.ID_Unit = n.ID_Unit AND n.ID_Record > @ID_RecordMax - 10000 
                           ( SELECT TOP(1) * FROM tbl_ArcDays n WHERE n.ID_Unit = M.ID_Unit AND n.ID_Record > @ID_RecordMax - 10000 

Мы заботимся о слепых.
5 сен 13, 08:55    [14797199]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6178
aleks2
Кроме того, похоже он оперирует приличными объемами в табличных переменных, но считает создание индексов на них ниже свово достоинства.

Была же не так давно тема про index scan при наличии PK по табличной переменной. Чтобы эти индексы суметь использовать нормальным образом, надо суметь их приготовить. Я сам недавно наступал на эти грабли - по времени выполнения index scan по PK практически не отличался от table scan. Спасла option (recompile).
5 сен 13, 09:47    [14797444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
KasKas,

При выборке из табличных переменных пользуйтесь подсказкой запроса option(recompile) это даст однозначный определенный эффект. Оптимизатор будет вести себя иначе - Estimated Number of Rows будет не 1 )))).
5 сен 13, 10:01    [14797537]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Сон Веры Павловны
aleks2
Кроме того, похоже он оперирует приличными объемами в табличных переменных, но считает создание индексов на них ниже свово достоинства.

Была же не так давно тема про index scan при наличии PK по табличной переменной. Чтобы эти индексы суметь использовать нормальным образом, надо суметь их приготовить. Я сам недавно наступал на эти грабли - по времени выполнения index scan по PK практически не отличался от table scan. Спасла option (recompile).
А хинт про индекс не спасает?
Может, наступит-таки вожделенный seek?
Сам не пробовал, хотя вроде бы минутное дело...
5 сен 13, 10:01    [14797540]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6178
iap
А хинт про индекс не спасает?
Может, наступит-таки вожделенный seek?
Сам не пробовал, хотя вроде бы минутное дело...

Хинт про индекс? для табличной переменной? Для хинта же нужно указать имя индекса, а поскольку индексы для табличной переменной создаются неявно в результате объявления констрейнта, то у них автогенерируемые, и неизвестные на момент исполнения имена. Или я тут что-то упустил?
5 сен 13, 10:27    [14797740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сон Веры Павловны
Для хинта же нужно указать имя индекса

В хинте можно указывать номер индекса.
Но для табличных переменных это всё равно не проходит, ибо "Incorrect syntax near the keyword 'with'."
5 сен 13, 10:38    [14797827]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Сон Веры Павловны
iap
А хинт про индекс не спасает?
Может, наступит-таки вожделенный seek?
Сам не пробовал, хотя вроде бы минутное дело...

Хинт про индекс? для табличной переменной? Для хинта же нужно указать имя индекса, а поскольку индексы для табличной переменной создаются неявно в результате объявления констрейнта, то у них автогенерируемые, и неизвестные на момент исполнения имена. Или я тут что-то упустил?
Напишите
WITH (INDEX(0))
Где здесь имя?
Синтаксис INDEX() указывает имя или идентификатор одного или более индексов, используемых при обработке инструкции оптимизатором запросов. Альтернативный синтаксис «INDEX =» позволяет задать отдельное значение индекса. Для каждой таблицы можно указать только одну подсказку индекса.

Если имеется кластеризованный индекс, аргумент INDEX(0) приводит к просмотру кластеризованного индекса, а INDEX(1) — к просмотру или поиску по кластеризованному индексу. Если кластеризованного индекса нет, аргумент INDEX(0) приводит к просмотру таблицы, а INDEX(1) интерпретируется как ошибка.

Если в отдельном списке подсказок используется несколько индексов, повторяющиеся индексы пропускаются, а остальные используются для получения строк из таблицы. Порядок индексов в подсказке индекса имеет значение. Подсказка нескольких индексов также приводит к выполнению операции AND над индексами, и оптимизатор запросов применяет столько условий, сколько возможно для каждого из индексов, к которым он получает доступ. Если коллекция индексов с подсказками не включает все указанные в запросе столбцы, выборка для получения остальных столбцов выполняется после того, как компонентом SQL Server Database Engine будут получены все индексированные столбцы.

Примечание
Если подсказка индекса, ссылающаяся на несколько индексов, используется в таблице фактов в соединении «звезда», оптимизатор не учитывает индекс и возвращает предупреждение. Кроме того, выполнение над индексами операции OR также не разрешено для таблицы с указанной подсказкой индекса.


Максимальное число индексов в табличной подсказке равно 250 некластеризованным индексам.
http://msdn.microsoft.com/ru-ru/library/ms187373(v=sql.100).aspx
5 сен 13, 10:44    [14797879]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
KasKas,

С табличными переменными много приколов. Один из, это невозможноcть параллельных планов если вставляете в табличную переменную, возможно, этим объясняется ваше
KasKas
Если их исключить - селект пролетает за секунду.

Начните читать с BOL
BOL
Переменные table не поддерживаются в модели выбора с учетом затрат оптимизатора SQL Server. Вследствие этого, они не должны использоваться при необходимости осуществления выбора с учетом затрат (примечание: вот это перевод! "с учетом затрат" имеется ввиду, с учетом решения на основе оценки стоимости, лучше все же английскую версию читать) для получения эффективного плана запроса. Временные таблицы являются предпочтительными при необходимости осуществления выбора с учетом затрат. Обычно их следует использовать в запросах с соединениями, решениях в отношении параллелизма и при выборе индекса.

Запросы, изменяющие переменные table, не создают параллельных планов выполнения запроса. При изменении очень больших переменных table или переменных table в сложных запросах может снизиться производительность. В подобных случаях целесообразно рассмотреть возможность использования временных таблиц. Дополнительные сведения см. в разделе Инструкция CREATE TABLE (Transact-SQL). Запросы, которые считывают переменные table, не изменяя их, могут выполняться параллельно.

На переменных table нельзя создавать индексы и статистику. В некоторых случаях можно добиться повышения производительности за счет использования вместо табличных переменных временных таблиц, которые позволяют создавать индексы и вести статистический учет. Дополнительные сведения о временных таблицах см. в разделе Инструкция CREATE TABLE (Transact-SQL).


А вот в документации прямое указание:
BOL
Не используйте табличные переменные для хранения больших объемов данных (более 100 строк). Плановые запросы могут оказаться неоптимальными или нестабильными при использовании табличных переменных с большим объемом данных. Попробуйте переписать такие запросы, чтобы они использовали временные таблицы или воспользуйтесь указанием запроса USE PLAN с тем, чтобы обеспечить использование оптимизатором существующего плана запроса, который хорошо работает в выбранном сценарии.

У вас больше 100 строк?

автор
Пробовал заменить их на временные переменные (с кластерными и не кластерными индексами) - выигрыш не превышает 5-10 секунд..

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

+ А вообще конечно

Картинка с другого сайта.
5 сен 13, 10:45    [14797884]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3394
iap
Сон Веры Павловны
пропущено...

Хинт про индекс? для табличной переменной? Для хинта же нужно указать имя индекса, а поскольку индексы для табличной переменной создаются неявно в результате объявления констрейнта, то у них автогенерируемые, и неизвестные на момент исполнения имена. Или я тут что-то упустил?
Напишите
WITH (INDEX(0))
Где здесь имя?
Пробовали? :)
5 сен 13, 11:01    [14797986]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Ennor Tiegael
iap
пропущено...
Напишите
WITH (INDEX(0))

Где здесь имя?
Пробовали? :)
Я ж написал, что нет.
А теперь и не буду после этого: 14797827
5 сен 13, 11:06    [14798018]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
aleks2
Guest
Робяты, чо вы опять толчете воду в ступе?

У тредстартера проблемы НЕ с табличными переменными.
14797115
5 сен 13, 11:26    [14798167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
KasKas
Guest
aleks2
...

со слепыми не заладилось, в итоге воспользовался "джигитским вариантом". Спасибо за помощь!

Сон Веры Павловны, Алексей Куренков
option (recompile)

Спасибо, дописал у себя.

SomewhereSomehow
...

BOL наше все=))
Строк у меня около полутора тысяч.. Ошибку понял=)
Долго копать и экспериментировать, к сожалению, нет возможности.. Аццки тормозить начало очень многое, и почти одновременно. И так вторую неделю "на костылях" все.
За картинку отдельное спасибо

В общем всем спасибо! Сейчас вместе с селектом вся бодяга пролетает секунды за 4-5. Хотя рекорды были 2 и 7 секунд=)
6 сен 13, 04:13    [14802433]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
almaz1988
Member

Откуда:
Сообщений: 9
У меня тоже проблема со скоростью выполнения запроса:
USE base

UPDATE dbo.train_raw
	SET body = dbo.deleteStopWords( body ), title = dbo.deleteStopWords( title ) FROM dbo.train_raw;


Функция deleteStopWords выглядит следующим образом:
CREATE   FUNCTION deleteStopWords ( @body varchar(MAX) )
RETURNS varchar(MAX)
AS
BEGIN
	select @body=replace(@body, word, ' ')
	from stop_words
	--   
  	return @body
END


Т.е. из полей таблицы Х удаляю все слова, имеющиеся в таблице У ( 500 слов ).
Размер таблицы Х - 2.5 ГБ.
Время выполнения запроса - 27 часов!!!
Возможно ли ускорить запрос? Возможно я его неправильно составил? Спасибо).
24 сен 13, 16:57    [14878690]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
almaz1988
У меня тоже проблема со скоростью выполнения запроса:
USE base

UPDATE dbo.train_raw
	SET body = dbo.deleteStopWords( body ), title = dbo.deleteStopWords( title ) FROM dbo.train_raw;


Функция deleteStopWords выглядит следующим образом:
CREATE   FUNCTION deleteStopWords ( @body varchar(MAX) )
RETURNS varchar(MAX)
AS
BEGIN
	select @body=replace(@body, word, ' ')
	from stop_words
	--   
  	return @body
END


Т.е. из полей таблицы Х удаляю все слова, имеющиеся в таблице У ( 500 слов ).
Размер таблицы Х - 2.5 ГБ.
Время выполнения запроса - 27 часов!!!
Возможно ли ускорить запрос? Возможно я его неправильно составил? Спасибо).


Вы неправильно составили запрос, это во-первых
UPDATE tr
	SET tr.body =replace(tr.body, sw.word, ' ') , tr.title = replace(tr.title, sw.word, ' ') 
FROM dbo.train_raw tr
         cross join stop_words sw


А во-вторых , у вас получается декартово произведение X x Y, отсюда тормоза. Подумайте стоит ли для всей X осуществлять операцию update. Или возможно надо не для всех Y делать замену или и то и другое
24 сен 13, 17:29    [14878913]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос с табличными переменными  [new]
Гость333
Member

Откуда:
Сообщений: 3683
almaz1988
Функция deleteStopWords выглядит следующим образом:
	select @body=replace(@body, word, ' ')
	from stop_words


Т.е. из полей таблицы Х удаляю все слова, имеющиеся в таблице У ( 500 слов ).

Вы не слова удаляете, а сочетания символов.
То есть, если у вас есть стоп-слово THE, а в таблице X встретилось WEATHER, то в итоге вы получите WEA R. Это именно то, что вам нужно?
24 сен 13, 17:44    [14879001]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить