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

Откуда: Тольятти
Сообщений: 464
Добрый день!

В подобной теме Медленно выполняется запрос на SQL 2014 всё проблемы повесили на скалярную функцию. Нашёл ещё запрос, который в SQL2014 выполняется за 30 сек, а на 2005 выполняется за 5 сек.

DECLARE @tbl TABLE (tosUID uniqueidentifier primary key);
DECLARE @Search  varchar(40) = '%902534%';

SELECT Tovars_Sup.rowguid as tosuUID, Tovars_Sup.suiID, tosuName, tosuPriceEff, suName,
    ISNULL(pgName, '') as pgName, ISNULL(fiName, '') as fiName, ISNULL(toName, '-') as toName,
    tosuBestPrice, tosuVisible, tosuKod, tosuKol, Tovars_Sup.usiID, tosuDate,
    ISNULL(tosuliName, '') as tosuliName, PGroup_Sup.ID as pgsuID, tosuNameNew
FROM Tovars_Sup	WITH (noLock)
	INNER JOIN Supplier		WITH(noLock) ON Tovars_Sup.suiID = Supplier.suiID
	LEFT OUTER JOIN PGroup	WITH(noLock) ON PGroup.pgiID = Tovars_Sup.pgiID
	LEFT OUTER JOIN Firm	WITH(noLock) ON Firm.fiiID = Tovars_Sup.fiiID
	LEFT OUTER JOIN Tovars	WITH(noLock) ON Tovars.rowguid = Tovars_Sup.toUID
	LEFT OUTER JOIN PGroup_Sup	WITH(noLock) ON PGroup_Sup.pgsuName = Tovars_Sup.tosuPGroup AND PGroup_Sup.pgsuGroup = Tovars_Sup.tosuGroup AND PGroup_Sup.suiID = Supplier.suiID
	LEFT OUTER JOIN Tovars_Sup_Link WITH(noLock) ON Tovars_Sup_Link.tosuUID = Tovars_Sup.rowguid
	LEFT OUTER JOIN @tbl a  ON a.tosUID = Tovars_Sup.rowguid
WHERE a.tosUID IS NULL AND
	((tosuName    LIKE @Search escape '~') OR
	 (tosuKod     LIKE @Search escape '~') OR
	 (tosuNameNew LIKE @Search escape '~') OR
         (tosuDesc    LIKE @Search escape '~') OR
         (Tovars_Sup.vendorCode LIKE @Search escape '~') OR
         (toName                LIKE @Search escape '~') OR
         (Tovars.vendorCode     LIKE @Search escape '~'))
ORDER BY pgName, tosuName ASC;


Привожу также актуальный план.
Есть мысли, чем это может быть вызвано?

К сообщению приложен файл (search.rar - 8Kb) cкачать
11 ноя 15, 13:23    [18399677]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
попробуйте сджойнить Tovars_Sup и LEFT OUTER JOIN @tbl a ON a.tosUID = Tovars_Sup.rowguid
WHERE a.tosUID IS NULL . Результат записать во временную таблицу, а потом с результатом джойнить остальные таблички. Ну или поиграйтесь с порядком соединения с помощью force_order. У вас самое сильное фильтрующее условие на антиполуджойне с @tbl, а почему то оно применяется в самом конце.
11 ноя 15, 13:35    [18399789]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Мистер Хенки,

Над запросом ещё можно поработать. Он был написан давно и проблем с ним не было. Просто интересует, почему на более мощном сервере (как железо, так и софт) запросы выполняются медленней, причём в разы. Хотя думал (мечтал), что будет наоборот...
Если бы разница была бы в пару сек, ещё куда ни шло (хотя тоже странно). А когда (уже не первый запрос) разница идёт в 4-6 раз - как то грустно становится... В проекте около 2000 процедур. Их все перепроверять?
11 ноя 15, 13:46    [18399874]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Просто интересует, почему на более мощном сервере (как железо, так и софт) запросы выполняются медленней, причём в разы.

Всегда есть причина.
Механическое увеличение ресурсов не дает гарантии линейного увнеличения пироизодительности.
11 ноя 15, 13:49    [18399909]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
saszay
Есть мысли, чем это может быть вызвано?
Уже объяснили в вами же упомянутой теме - 18389413
Если не хотите заморачиваться анализом и возможным переписыванием запросов - поставьте БД уровень совместимости 90.
Правда тогда непонятно зачем вам нужен 2014 сервер.
11 ноя 15, 13:49    [18399914]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
В проекте около 2000 процедур. Их все перепроверять?

А что вас удивляет ?
Вы наивно полагаете, что любой апгрейд на новую систему не требует никакого тестирования ?
11 ноя 15, 13:51    [18399933]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Glory
saszay
Просто интересует, почему на более мощном сервере (как железо, так и софт) запросы выполняются медленней, причём в разы.

Всегда есть причина.
Механическое увеличение ресурсов не дает гарантии линейного увнеличения пироизодительности.


Но и не значит, что она должна упасть.
11 ноя 15, 13:51    [18399938]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Но и не значит, что она должна упасть.

Это вы такой закон Вселенной открыли ?
11 ноя 15, 13:52    [18399947]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
saszay
Мистер Хенки,

Над запросом ещё можно поработать. Он был написан давно и проблем с ним не было. Просто интересует, почему на более мощном сервере (как железо, так и софт) запросы выполняются медленней, причём в разы. Хотя думал (мечтал), что будет наоборот...
Если бы разница была бы в пару сек, ещё куда ни шло (хотя тоже странно). А когда (уже не первый запрос) разница идёт в 4-6 раз - как то грустно становится... В проекте около 2000 процедур. Их все перепроверять?

начните с обновления статистики, может это поможет без переписывания. В любом случае пока план выполнения получается не очень. использование like '%902534%' и несколько условий через OR усложняет для оптимизатора запросов поиск хорошего плана.
11 ноя 15, 13:53    [18399953]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
o-o
Guest
invm
saszay
Есть мысли, чем это может быть вызвано?
Уже объяснили в вами же упомянутой теме - 18389413
Если не хотите заморачиваться анализом и возможным переписыванием запросов - поставьте БД уровень совместимости 90.
Правда тогда непонятно зачем вам нужен 2014 сервер.

2014_ый же.
Valid values of the database compatibility level are 100, 110, or 120
11 ноя 15, 13:54    [18399967]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
а так да, новые версии сервера могут строить для привычных запросов новые планы и не всегда оптимальные.
11 ноя 15, 13:54    [18399970]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Glory
А что вас удивляет ?
Вы наивно полагаете, что любой апгрейд на новую систему не требует никакого тестирования ?


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

Может я не там ищу и у 2014 есть какая-то хитрость, которую я не знаю... :)
11 ноя 15, 13:58    [18400004]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
komrad
Member

Откуда:
Сообщений: 5739
мое верхнее сообщение кривое, должно быть так:

saszay
Может я не там ищу и у 2014 есть какая-то хитрость, которую я не знаю... :)


посмотрите сюда:
http://blogs.msdn.com/b/psssql/archive/2015/06/16/identifying-sql-server-2014-new-cardinality-estimator-issues-and-service-pack-1-improvement.aspx

и сюда:
https://www.mssqltips.com/sqlservertip/3320/enabling-sql-server-trace-flag-for-a-poor-performing-query-using-querytraceon/
11 ноя 15, 14:13    [18400146]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Владислав Колосов
Member

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

OR и полуджойны могут плохо вести себя, если OR для разных таблиц одновремено. Попробуйте exists в фильтре или разбейте на UNION ALL запросы.
11 ноя 15, 14:18    [18400178]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Apoj_sql
Member

Откуда:
Сообщений: 43
интересно было бы сравнить с планом запроса который на 2005м
11 ноя 15, 14:25    [18400225]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Apoj_sql,

План от 2005. Ради справедливости: у 2014 маленько другие столбцы появились (изменилось имя и тип значений и одно вычисляемое).

К сообщению приложен файл (search2005.sqlplan - 105Kb) cкачать
11 ноя 15, 14:41    [18400302]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
Apoj_sql
Member

Откуда:
Сообщений: 43
saszay
Apoj_sql,

План от 2005. Ради справедливости: у 2014 маленько другие столбцы появились (изменилось имя и тип значений и одно вычисляемое).

Может стоило было сделать тест на 2014 без изменения полей таблиц по сравнению с 2005? А то тест получается какбе не совсем "чистый".
11 ноя 15, 15:07    [18400513]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
invm
Member

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

Попробуйте вот так переписать:
SELECT Tovars_Sup.rowguid as tosuUID, Tovars_Sup.suiID, tosuName, tosuPriceEff, suName,
        ISNULL(pgName, '') as pgName, ISNULL(fiName, '') as fiName, ISNULL(toName, '-') as toName,
	    tosuBestPrice, tosuVisible, tosuKod, tosuKol, Tovars_Sup.usiID, tosuDate,
	    ISNULL(tosuliName, '') as tosuliName,
	    --dbo.Tovars_Sup_Unions(Tovars_Sup.rowguid) as Unions,
	    PGroup_Sup.ID as pgsuID, tosuNameNew
FROM
 (select top(cast(0x7fffffffffffffff as bigint)) перечень необходимых столбцов from Tovars_Sup WITH (noLock)
  where
   tosuName LIKE @Search escape '~' OR
   tosuKod LIKE @Search escape '~' OR
   tosuNameNew LIKE @Search escape '~' OR
   tosuDesc LIKE @Search escape '~' OR
   vendorCode LIKE @Search escape '~'
 ) Tovars_Sup	
	INNER JOIN Supplier		WITH(noLock) ON Tovars_Sup.suiID = Supplier.suiID
	INNER JOIN Tovars	WITH(noLock) ON Tovars.rowguid = Tovars_Sup.toUID
	LEFT OUTER JOIN PGroup	WITH(noLock) ON PGroup.pgiID = Tovars_Sup.pgiID
	LEFT OUTER JOIN Firm	WITH(noLock) ON Firm.fiiID = Tovars_Sup.fiiID
	LEFT OUTER JOIN PGroup_Sup	WITH(noLock) ON PGroup_Sup.pgsuName = Tovars_Sup.tosuPGroup AND PGroup_Sup.pgsuGroup = Tovars_Sup.tosuGroup AND PGroup_Sup.suiID = Supplier.suiID
	LEFT OUTER JOIN Tovars_Sup_Link WITH(noLock) ON Tovars_Sup_Link.tosuUID = Tovars_Sup.rowguid
	LEFT OUTER JOIN @tbl a  ON a.tosUID = Tovars_Sup.rowguid
WHERE a.tosUID IS NULL AND
		((toName                LIKE @Search escape '~') OR
         (Tovars.vendorCode     LIKE @Search escape '~')
         )
ORDER BY pgName, tosuName ASC
11 ноя 15, 15:27    [18400648]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
manioko
Member

Откуда:
Сообщений: 3
I suggest the problem is in the way different versions of MS SQL Server processing indexes of the data type of "uniqueidentifier". By the way, it is a very bad idea to use uniqueidentifier in key values. You can search Google by typing: "who do not use uniqueidentifier".
The best way of the problem resolution is switching from "uniqueidentifier" to "int" in all key values. If you cannot resign from uniqueidentifier for some reason you can add new columns of the integer type and use them as keys.
Another way of resolution is to assure that your uniqueidentifiers are changing monotonically. A function exists for this: newsequentialid(). But in my opinion this is just a half-way.
But I still strongly suggest to switch to integers in the keys. It will be your investment in future. Performance of your application will increase dramatically in any version of MS SQL Server: older or newer ones.
11 ноя 15, 15:35    [18400693]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
manioko,

Uniqueidentifier рудемент от 2005 сервера, т.к. в нём используется репликация. Одна из причин перехода на 2014 - уход от репликации и перевод ключей на int значения.
11 ноя 15, 15:44    [18400794]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
invm,

Не в даваясь в причины - запрос выполняется быстро, но нечего не находит
11 ноя 15, 15:47    [18400821]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
o-o
Guest
а можно ссылку вот на это
manioko
the way different versions of MS SQL Server processing indexes of the data type of "uniqueidentifier".
11 ноя 15, 15:57    [18400897]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
saszay
запрос выполняется быстро, но нечего не находит
Поправка
SELECT x.rowguid as tosuUID, x.suiID, tosuName, tosuPriceEff, suName,
        ISNULL(pgName, '') as pgName, ISNULL(fiName, '') as fiName, ISNULL(x.toName, '-') as toName,
	    tosuBestPrice, tosuVisible, tosuKod, tosuKol, x.usiID, tosuDate,
	    ISNULL(tosuliName, '') as tosuliName,
	    --dbo.Tovars_Sup_Unions(x.rowguid) as Unions,
	    PGroup_Sup.ID as pgsuID, tosuNameNew
FROM
 (select top(cast(0x7fffffffffffffff as bigint)) перечень необходимых столбцов from
   Tovars_Sup ts WITH (noLock)
   INNER JOIN Tovars t WITH(noLock) ON t.rowguid = ts.toUID
  where
   ts.tosuName LIKE @Search escape '~' OR
   ts.tosuKod LIKE @Search escape '~' OR
   ts.tosuNameNew LIKE @Search escape '~' OR
   ts.tosuDesc LIKE @Search escape '~' OR
   ts.vendorCode LIKE @Search escape '~' OR
   t.toName LIKE @Search escape '~') OR
   t.vendorCode LIKE @Search escape '~'
 ) x
	INNER JOIN Supplier		WITH(noLock) ON x.suiID = Supplier.suiID
	LEFT OUTER JOIN PGroup	WITH(noLock) ON PGroup.pgiID = x.pgiID
	LEFT OUTER JOIN Firm	WITH(noLock) ON Firm.fiiID = x.fiiID
	LEFT OUTER JOIN PGroup_Sup	WITH(noLock) ON PGroup_Sup.pgsuName = x.tosuPGroup AND PGroup_Sup.pgsuGroup = x.tosuGroup AND PGroup_Sup.suiID = Supplier.suiID
	LEFT OUTER JOIN Tovars_Sup_Link WITH(noLock) ON Tovars_Sup_Link.tosuUID = x.rowguid
	LEFT OUTER JOIN @tbl a  ON a.tosUID = x.rowguid
WHERE
 a.tosUID IS NULL
ORDER BY pgName, tosuName ASC

Возможные ошибки подкорректируете сами.

ЗЫ: На будущее - всегда пишите алиасы у таблиц и у столбцов. Если вам не важно видеть в запросе какой столбец к какой таблице относится, то подумайте о тех, у кого просите помощи.
11 ноя 15, 16:58    [18401427]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
o-o
Guest
а я повторю вопрос.
за непредоставлением доказательств буду считать сие заявление трэшем
o-o
а можно ссылку вот на это
manioko
the way different versions of MS SQL Server processing indexes of the data type of "uniqueidentifier".
11 ноя 15, 17:15    [18401598]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос на SQL 2014, часть 2  [new]
a_voronin
Member

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

Попробуйте

CREATE CLUSTERED COLUMNSTORE INDEX cci_Tovars_Sup ON Tovars_Sup;
11 ноя 15, 17:35    [18401744]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить