Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
KasKas
Guest
Здравствуйте.
Помогите пожалуйста с решением проблемы:

Была БД на MSSQL2000 и win2003 server

На днях переехали на виртуальную машину с winserver2012 и mssql2012.

@@version=Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
	Oct 19 2012 13:38:57 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)


После этого начались какие-то космические тормоза на до этого спокойно работавших выборках.
При чем, один и тот же запрос на выборку полутора тысяч записей выполняется на одних клиентских машинах менее 7 секунд, на других около трех минут. На самом сервере, если запустить самописное приложение с этой выборкой - будет грузиться 3 минуты, если в QA - опять же выполнится за считанные секунды..
Подскажите, в чем может быть дело? Что посмотреть? Если нужны какие логи - подскажите как их сделать (впервые столкнулся с такой задачей).
Вот код процедуры:
    --	поиск одинаковых серийных номеров водомеров
    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 rtrim(a.OrganisationName) AS OrganisationName
         , rtrim(b.ObjectName) AS ObjectName
         , rtrim(c.UnitName) AS UnitName
         , rtrim(e.JobName) AS JobName
         , rtrim(d.PlombaNumber) AS PlombaNumber
         , rtrim(f.DistrictName) AS DistrictName
         , rtrim(g.SupportName) AS SupportName
         , rtrim(h.ConnectionTypeName) AS ConnectionTypeName
         , rtrim(k.Socr + '. ' + k.[Name] + ', ' + cast(b.DomNumber AS VARCHAR) + rtrim(b.DomBukva)) AS Address
         , rtrim(p.TroubleReasonName) AS TroubleReasonName
         , rtrim(k.[Name] + ', ' + k.Socr + '. ' + cast(b.DomNumber AS VARCHAR) + rtrim(b.DomBukva)) + ', ' + rtrim(UnitName) AS FullUnitName
         , --эта нужна в поиске узла в форме аддчейндж
         k.[Name] AS StreetName
         , c.CurrentEnabled
         , c.ModemPhone
         , d.SerialNumber
         , c.PressureInstalled
         , a.ContactPhone
         , a.Dogovor
         , c.Limit
         , c.StartDate
         , g.SupportPhone
         , d.Poverka
         , d.Diametr
         , c.OnLineEnabled
         , o.ID_Unit AS DuplicatedCounters
         , s.CounterModelName
         , d.ID_CounterModel
         , c.EnableHot
         , c.ConnectFails
         , c.UnitIP
         , c.ID_Counter
         , c.ID_Unit
         , c.ID_object
         , c.ID_Job
         , c.ID_Support
         , b.ID_Organisation
         , b.ID_District
         , c.ID_ConnectionType
         , c.ID_TroubleReason
         , c.ID_Modem
         , c.ID_KSPD
         , c.SyncronizationDate
         , c.EnableHot
    FROM
      tbl_Units c
      LEFT JOIN tbl_Objects b
        ON b.ID_object = c.id_object
      LEFT JOIN tbl_Organisations a
        ON a.ID_Organisation = b.ID_Organisation
      LEFT JOIN tbl_Counters d
        ON d.ID_Counter = c.ID_Counter
      LEFT JOIN tbl_Jobs e
        ON c.ID_Job = e.ID_job
      LEFT JOIN tbl_District f
        ON f.ID_District = b.ID_District
      LEFT JOIN tbl_Support g
        ON g.ID_Support = c.ID_Support
      LEFT JOIN tbl_ConnectionTypes h
        ON h.ID_ConnectionType = c.ID_ConnectionType
      LEFT JOIN tbl_Streets k
        ON k.PK = b.ID_Street
      LEFT JOIN @tbl_DuplicatedCounters o
        ON c.ID_Unit = o.ID_Unit
      LEFT JOIN tbl_TroubleReasons p
        ON c.ID_TroubleReason = p.ID_TroubleReason
      LEFT JOIN tbl_UserUnit r
        ON r.ID_Unit = c.ID_Unit
      LEFT JOIN tbl_CounterModels s
        ON d.ID_CounterModel = s.ID_CounterModel
    WHERE
      r.ID_User = @int1
26 авг 13, 08:02    [14754012]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
KasKas
Guest
Да, загрузка ЦП и памяти даже в пиках выше 80% не поднимается
26 авг 13, 08:17    [14754023]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
https://www.sql.ru/blogs/somewheresomehow/999
26 авг 13, 08:39    [14754057]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
KasKas
Guest
Ещё замечено, что если указанная выборка находится выполняется сама по себе - то даже на машине, где раньше ей надо было 3 минуты, все все успевает за пару секунд.
если же её запихать (как она и запихана) в хранимую процедуру (несколько выборок, разделенных "if(@CodeOperation=...)"), то возвращаемся к ситуации из первого сообщения..
26 авг 13, 08:43    [14754074]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
KasKas
Guest
Knyazev Alexey, понял, уже читаю. Спасибо!))
Только хочу уточнить, что выборка тормозит даже при выполнении из QA на многих пк..
26 авг 13, 08:46    [14754086]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
KasKas
Knyazev Alexey, понял, уже читаю. Спасибо!))
Только хочу уточнить, что выборка тормозит даже при выполнении из QA на многих пк..


Установите ИДЕНТИЧНЫЕ опции для подключений.

dbcc useroptions

..ибо чудес не бывает.
26 авг 13, 09:08    [14754137]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
KasKas
Guest
Но ведь на 2000м все одинаково работало?..

Выполнил эту штуку на своем (3 мин) и чужом (7 сек) пк:

У меня:
textsize -1
language русский
dateformat dmy
datefirst 1
lock_timeout -1
quoted_identifier SET
ansi_null_dflt_on SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
no_browsetable SET
concat_null_yields_null SET
isolation level read committed

у коллеги:
TEXTSIZE 2147483647
LANGUAGE русский
DATEFORMAT dmy
DATEFIRST 1
lock_timeout-1
QUOTED_IDENTIFIER SET
ARITHABORT SET
ANSI_NULL_DFLT_ON SET
ANSI_WARNINGS SET
ANSI_PADDING SET
ANSI_NULLS SET
CONCAT_NULL_YIELDS_NULL SET
isolation LEVEL read committed

По одинаковым параметрам, одинаковые значения. Разница только в TextSize. Ну и есть по одному параметру, который выводится только у одного из нас..

TEXTSIZE 2147483647
ARITHABORT SET

textsize -1
no_browsetable SET


ps а где править эти опции?
26 авг 13, 09:34    [14754239]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
KasKas
ARITHABORT SET

Это сурово изменяет планы исполнения.

KasKas
Но ведь на 2000м все одинаково работало?..

А ты на ем опции подключения проверял?

KasKas
ps а где править эти опции?

Как фсегда, либо явно задавать, либо в дефолтных опциях подключения на сервере.
26 авг 13, 09:55    [14754310]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
KasKas
На днях переехали на виртуальную машину с winserver2012 и mssql2012.


Не надо ставить боевой MSSQL на виртуальную машину. Или не ожидайте хорошей производительности.
26 авг 13, 10:13    [14754383]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
про Arithabort почитаю.. гугль вроде говорит что жутко геморный параметр..

автор
А ты на ем опции подключения проверял?

нет.. я ж говорю, не сталкивался ни с чем подобным ещё... даж куда копать пока не знаю. Нашел пару статей/скриптов - но пока яснее не стало.. Knyazev Alexey вроде нужную ссыль дал, но по ней бегло не получается))

автор
Как фсегда, либо явно задавать, либо в дефолтных опциях подключения на сервере.

А можно подробнее?
26 авг 13, 10:15    [14754393]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
aleks2
про Arithabort почитаю.. гугль вроде говорит что жутко геморный параметр..

автор
А ты на ем опции подключения проверял?

нет.. я ж говорю, не сталкивался ни с чем подобным ещё... даж куда копать пока не знаю. Нашел пару статей/скриптов - но пока яснее не стало.. Knyazev Alexey вроде нужную ссыль дал, но по ней бегло не получается))

автор
Как фсегда, либо явно задавать, либо в дефолтных опциях подключения на сервере.

А можно подробнее?


Чо за "м..дак" под меня маскируется?
Никтож не поверит, что я способен спросить такую ерунду.
26 авг 13, 10:18    [14754408]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
aleks2
aleks2
про Arithabort почитаю.. гугль вроде говорит что жутко геморный параметр..

пропущено...

нет.. я ж говорю, не сталкивался ни с чем подобным ещё... даж куда копать пока не знаю. Нашел пару статей/скриптов - но пока яснее не стало.. Knyazev Alexey вроде нужную ссыль дал, но по ней бегло не получается))

пропущено...

А можно подробнее?


Чо за "м..дак" под меня маскируется?
Никтож не поверит, что я способен спросить такую ерунду.
Давно говорили: зарегистрироваться надо!

Или уже давно зарегистрирован, но по другим ником? Иногда приходит в голову...
26 авг 13, 10:24    [14754432]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
_ч_
Member

Откуда:
Сообщений: 1427
KasKas,

А вы планы запроса из кэша (ну или хотя бы из MS SMS) сравнивали? Чем они отличаются искали?
26 авг 13, 10:25    [14754435]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
[quot iap]
aleks2

Или уже давно зарегистрирован, но по другим ником? Иногда приходит в голову...


Честное слово старого пыонера - нема у мя тут регистрированных ников.
26 авг 13, 10:28    [14754456]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
не_kaskas
Guest
автор
Чо за "м..дак" под меня маскируется?

что за вредная привычка на ровном месте хамить, уважаемый?;)

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


автор
А вы планы запроса из кэша (ну или хотя бы из MS SMS) сравнивали? Чем они отличаются искали?

если честно нет (не знаю как), но этот момент в статье из ссылки выше есть, дочитаю - сделаю/выложу
26 авг 13, 10:34    [14754490]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
_ч_
Member

Откуда:
Сообщений: 1427
не_kaskas,

http://www.google.ru/#fp=b55c7bbea867025d&newwindow=1&psj=1&q=how to get plan from cash ms sql

по первой же сылке
26 авг 13, 10:42    [14754545]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
Гость333
Member

Откуда:
Сообщений: 3683
_ч_
how to get plan from cash

Мать-мать-мать... откройте хотя бы Google Translate и просветитесь, чем cash отличается от cache ;-(
26 авг 13, 10:47    [14754571]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
kalimba
Member

Откуда:
Сообщений: 297
KasKas,

В SQL Server 2000 не было табличных переменных, что-то вы поправили значит, замените на временные таблицы (как в 2000 и было вероятно) или в сосединении с табличной переменной попробуйте HASH/MERGE JOIN по очереди.
26 авг 13, 11:07    [14754708]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kalimba
В SQL Server 2000 не было табличных переменных

Как раз в 2000 и появились:
http://technet.microsoft.com/en-us/library/aa226072(v=sql.80).aspx
Relational Database Enhancements

New Data Types

SQL Server 2000 introduces three new data types. bigint ... sql_variant ... . table is a type that allows applications to store results temporarily for later use. It is supported for variables, and as the return type for user-defined functions.
26 авг 13, 11:19    [14754752]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
kalimba
Member

Откуда:
Сообщений: 297
Гость333,

Извиняюсь, даже не знал) В любом случае проблема скорее всего в использовании табл. переменных, т.к. они не собирают статистику и оптимизатор путается, так как судя по верхней части запроса число строк может варьироваться и использовать кэш планов запросов оптимизатор не может.
26 авг 13, 11:23    [14754771]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
Меня всегда забавляла "слепота" отдельных знатоков.

1. У тредстартера НЕ всегда "тормозит".
2. С некоторых клиентов у тредстартера "фсе хорошо".
3. На "плохих" и "хороших" клиентах есть явное различие USEROPTIONS: Arithabort.
4. Но все равно "знатоки" тупо дают абсолютно бесполезные советы.
5. Ладно, про тредстартера промолчим...
Ведь набрать в SSMS
set Arithabort on
exec aPocedure
go
set Arithabort off
exec aPocedure

это не для средних умов...
26 авг 13, 11:28    [14754794]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
kalimba
Member

Откуда:
Сообщений: 297
aleks2,

Установка одинаковых опций SET может помочь, если возвращается одинаковое кол-во записей, т.е. процедура выполняется с одним и тем же параметров в одно и тоже время (если OLTP нагрузка). Автор просто не написал, что выполнял с одинаковыми параметрами (а просто что выполнялось на 1500 записей). Плюс в кэше планов может быть "плохой" план (с Nested Loops + Lookup), верно же?
26 авг 13, 11:32    [14754816]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
aleks2
Guest
kalimba
aleks2,

Установка одинаковых опций SET может помочь, если возвращается одинаковое кол-во записей, т.е. процедура выполняется с одним и тем же параметров в одно и тоже время (если OLTP нагрузка). Автор просто не написал, что выполнял с одинаковыми параметрами (а просто что выполнялось на 1500 записей). Плюс в кэше планов может быть "плохой" план (с Nested Loops + Lookup), верно же?


Тиоретег-недоучка, да еще и слепой? Иди учись.

KasKas
один и тот же запрос на выборку полутора тысяч записей выполняется на одних клиентских машинах менее 7 секунд, на других около трех минут.
26 авг 13, 11:37    [14754839]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
kalimba
Member

Откуда:
Сообщений: 297
aleks2,

Давайте не будем переходить на личности и подождем топикстартера.. Спасибо)
26 авг 13, 11:49    [14754916]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение процедур после перехода с MSSQL2000 на MSSQL2012  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 773
Глеб
Не надо ставить боевой MSSQL на виртуальную машину. Или не ожидайте хорошей производительности.


Я конечно прошу прощения, но это шутка такая? У нас не одна тысяча серверов, в т. ч. и mssql и в QA, и в DEV и в PROD крутятся на виртуальных машинах.
Если, конечно вы имеете в виду не бесплатный VMWare -плеер
26 авг 13, 15:27    [14756103]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить