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

Откуда: Солнечная Болгария
Сообщений: 585
Здравствуйте, ситуацията такая:
Таблица 500к записей, делаю select id from ... join с фильтром по дате от-до, выполняется за 4 секунды - нормально.
Делаю то же самое, только select * ( все колоны) - 55 секунд. Методом тыка установил, что проблем появляется, когда делаю select bit колоны ?!? Их несколько! Колоны были nullable, сделал их not nullable, ситуация чуть лучше - 40 секунд. Вчера потерял несколько часов на этот проблем, гуглил - ничего схожего не нашел.

Может кто-то сталкивался ?

select @@VERSION
Microsoft SQL Server 2016 (SP2-CU4-OD) (KB4479742) - 13.0.5237.0 (X64) Dec 3 2018 21:07:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
6 мар 19, 10:25    [21825950]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
iiyama
Member

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

Думаю, это Вам поможет понять
6 мар 19, 10:52    [21825984]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
Заметил что-то очень странное,
Estimated Number of Rows - 452'521
Actual Number of Rows - 4'024 ( столько вернул select )

К сообщению приложен файл. Размер - 30Kb
6 мар 19, 11:49    [21826064]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
8 колонок типа BIT храняться в одном байте. За счет внутренней оптимизации когда таких колонок больше, чем 32 на таблице наблюдал небольшие тормоза, но описанная вами ситуация видимо возникает из-за других причин. Покажите план выполнения и статистику ожидания на уровне сессии. Как раз вам версия сиквела это позволяет сделать:

SELECT session_id
     , wait_type
     , wait_time = CAST(wait_time_ms / 1000. AS DECIMAL(18,4))
     , wait_resource = CAST((wait_time_ms - signal_wait_time_ms) / 1000. AS DECIMAL(18,4))
     , wait_signal = CAST(signal_wait_time_ms / 1000. AS DECIMAL(18,4))
     , wait_time_percent = CAST(100. * wait_time_ms / SUM(wait_time_ms) OVER (PARTITION BY session_id) AS DECIMAL(18,2))
     , waiting_tasks_count
     , max_wait_time = CAST(max_wait_time_ms / 1000. AS DECIMAL(18,4))
FROM sys.dm_exec_session_wait_stats -- 2016+
WHERE session_id != @@spid
    AND wait_time_ms > 0
ORDER BY SUM(wait_time_ms) OVER (PARTITION BY session_id) DESC
       , wait_time_ms DESC
6 мар 19, 11:52    [21826071]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
Сруль.
Member

Откуда:
Сообщений: 119
Итак, время отклика складывается из двух слагаемых.
Первое-это время поиска нужных записей,
второе-это их протаскивание по сети.
Протаскивание по сети: это колличество записей умножить на длину.
Теперь, то что ваш запрос-после фильтра с записю минимальной длины
берёт, 4 секунды, не знаю о каком колличестве идёт речь, но даже, если брать
по максимуму-многовато. Возможно, нет индекса на проверяемой поле.
Скажем так, если вы сделаете select count(*) и это возьмёт больше нуля,
проверьте индекс. Если вы не хотите все несколько сотен показывать юзеру
то сделайте на сервере хоть какую-ту группировку.
6 мар 19, 12:04    [21826090]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
AlanDenton
Покажите план выполнения и статистику ожидания на уровне сессии.

Не уверен, что точно показать. Вот результат вашего SQL-а, пока в другом окне работала медленная заявка.

К сообщению приложен файл. Размер - 21Kb
6 мар 19, 12:35    [21826130]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
AlanDenton,

План прилагаю

К сообщению приложен файл (exec_1.sqlplan - 26Kb) cкачать
6 мар 19, 12:38    [21826135]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
AlanDenton,

Estimation тоже добавил. Перед выполнением заявки делаю DBCC DROPCLEANBUFFERS;
Раньше не делал, и время было различное, каждый раз.

Сруль, результат маленький, INT + BIT колоны, 4к записей, SSMS клиент.

К сообщению приложен файл (estim_plan.sqlplan - 22Kb) cкачать
6 мар 19, 12:42    [21826141]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
msLex
Member

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

вы оба плана выкладывайте, а не только медленный.

В качестве предположения, без bit колонок вместо скана кластреного индекса происходит seek по некластерному индексу, в котором просто нет этих bit колонок.


Можете попробовать

...
from toffers o with(forceseek) 
...
6 мар 19, 13:23    [21826200]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Было бы неплохо сделать покрывающий индекс либо изменить текущий. Схемы в вашей БД мы не знаем, а потому фильтрация у вас не может в полной мере использовать predicate pushdown

К сообщению приложен файл. Размер - 46Kb
6 мар 19, 13:45    [21826254]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
AlanDenton,

Спасибо, я это тоже ранее заметил, ошибочный estimate индекса. drop table и recreate исправил ситуацию. Что-то не так было или с таблицей, или с индексами. Фрагментация показывала 0.0% , не знал, больше куда смотреть.
6 мар 19, 17:33    [21826600]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
msLex
Member

Откуда:
Сообщений: 7723
TPAKTOPA
drop table и recreate


Картинка с другого сайта.
6 мар 19, 17:49    [21826621]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
TPAKTOPA
AlanDenton,

Спасибо, я это тоже ранее заметил, ошибочный estimate индекса. drop table и recreate исправил ситуацию. Что-то не так было или с таблицей, или с индексами. Фрагментация показывала 0.0% , не знал, больше куда смотреть.


жестко вы, достаточно было статистику обновить
6 мар 19, 20:15    [21826729]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
TPAKTOPA
Member

Откуда: Солнечная Болгария
Сообщений: 585
WarAnt
жестко вы, достаточно было статистику обновить

делал rebuild и reorginize индекса, но не помогло. Ведь эти обе операции обновляют и статистику ?
6 мар 19, 20:45    [21826756]     Ответить | Цитировать Сообщить модератору
 Re: Медленная отдача, когда есть колона bit  [new]
Dzianis
Member

Откуда:
Сообщений: 76
TPAKTOPA
WarAnt
жестко вы, достаточно было статистику обновить

делал rebuild и reorginize индекса, но не помогло. Ведь эти обе операции обновляют и статистику ?


Update STATISTICS ...
или
EXEC sp_updatestats
7 мар 19, 11:46    [21827131]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить