Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Kahramon
Если я хочу получить информация именно выбранный период, он занимает больше 30 минут ,

ТС пишет вроде, что у него count еще с условием по периоду, не?
то есть типа
LogEntryDateTime > .... and  LogEntryDateTime < .... 

Может тут проблема, и ему достаточно хинтом как-то поправить дело?
Kahramon, Чего именно хотите то?
25 мар 19, 18:36    [21843067]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

Откуда:
Сообщений: 5244
Glebanski
Kahramon
Если я хочу получить информация именно выбранный период, он занимает больше 30 минут ,

ТС пишет вроде, что у него count еще с условием по периоду, не?
то есть типа
LogEntryDateTime > .... and  LogEntryDateTime < .... 

Может тут проблема, и ему достаточно хинтом как-то поправить дело?
Kahramon, Чего именно хотите то?


товарищ хочет быстро неблокируеще считать кол-во записей по таблице за определенный период (порция данных)


Kahramon, покажите структуру таблицы, индексы и ваш медленный запрос
так же следующее:

select @@version
go
select * from sys.configurations
go
25 мар 19, 18:44    [21843072]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
Всем спасибо большое что уделили время!
select t1.* from meter_log t1 inner join(select min(date_format) as min_time from meter_log m2 where factory_number=:number and type_id=:typeId and modem_id=:modemId and (date_format between :from and :to) group by convert(varchar,date_format,112))t2 on t1.date_format=t2.min_time where t1.factory_number=:number and t1.type_id=:typeId and t1.modem_id=:modemId
typeId and modem_id are foreign keys. Factory_number and date_format are indexed keys.

Мне нужна взять первые данные за каждый день(втечение выбранного периода ). Тут запрос занемает много времени. В таблице есть где то 1 млрд записи
26 мар 19, 10:16    [21843460]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Glebanski
пропущено...

ТС пишет вроде, что у него count еще с условием по периоду, не?
то есть типа
LogEntryDateTime > .... and  LogEntryDateTime < .... 

Может тут проблема, и ему достаточно хинтом как-то поправить дело?
Kahramon, Чего именно хотите то?


товарищ хочет быстро неблокируеще считать кол-во записей по таблице за определенный период (порция данных)


Kahramon, покажите структуру таблицы, индексы и ваш медленный запрос
так же следующее:

select @@version
go
select * from sys.configurations
go

Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 6.0 (Build 6001: Service Pack 1)

К сообщению приложен файл (123.csv - 9Kb) cкачать
26 мар 19, 10:20    [21843465]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
Kahramon
А можно создавать каждый месясь отдельный таблица(log_month_year) и сохранить как ndf(log_month_year.ndf) файл?
Можно и так.

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

А вы описали сначала одну задачу (select count(*) from tablename), вам дали решение.
Потом совсем другую задачу (за период)
А сейчас говорите про месяца, а это уже треться задача (когда периоды известны и фиксированны)

Вот для этих трёх задач есть три разных решения, со своими моделями данных, а могут быть и другие задачи, про которые вы пока не сказали.
26 мар 19, 10:33    [21843476]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

Откуда:
Сообщений: 5244
Kahramon
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 6.0 (Build 6001: Service Pack 1)


ого!
чистый 2005 RTM!
не думал, что такие еще встречаются в природе
и не конфигурированный к тому же

покажите
select * from sys.dm_os_sys_info


на таблице есть индексы? заскриптуйте их и саму таблицу (show scripts of the table and its indexes)

покажите план запроса (execution plan)

по поводу запроса: мне кажется что он не совсем корректен, к тому же группировка лишняя
попробуйте альтернативный


-- your query
SELECT
	t1.*
FROM meter_log t1
INNER JOIN (SELECT
				MIN(date_format) AS min_time
				FROM meter_log m2
			WHERE factory_number = :number
				AND type_id = :typeId
				AND modem_id = :modemId
				AND (date_format BETWEEN :from AND :to)
			GROUP BY CONVERT(varchar, date_format, 112)
			) t2
	ON t1.date_format = t2.min_time
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId

-- alternative 1 
SELECT
	t1.*
FROM meter_log t1
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId
and  t1.date_format = (SELECT
                                        MIN(date_format) AS min_time
                                   FROM meter_log m2
                                   WHERE factory_number = :number
                                        AND type_id = :typeId
                                        AND modem_id = :modemId
                                        AND (date_format BETWEEN :from AND :to)
						) 
26 мар 19, 11:22    [21843533]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
aleks222
Member

Откуда:
Сообщений: 949
Kahramon
Всем спасибо большое что уделили время!
select t1.* from meter_log t1 inner join(select min(date_format) as min_time from meter_log m2 where factory_number=:number and type_id=:typeId and modem_id=:modemId and (date_format between declarep by convert(varchar,date_format,112))t2 on t1.date_format=t2.min_time where t1.factory_number=:number and t1.type_id=:typeId and t1.modem_id=:modemId
typeId and modem_id are foreign keys. Factory_number and date_format are indexed keys.

Мне нужна взять первые данные за каждый день(втечение выбранного периода ). Тут запрос занемает много времени. В таблице есть где то 1 млрд записи



Первое, что вам нужно сделать - поучиться писать запросы.

1. Таблица всех дат периода. Можете генерировать прямо перед запросом.
2. Cross apply ( select top(1) * from ... )
3. Индексы получат шанс.

declare @from datetime = '20190101'
      , @to datetime = '20190201'
;

declare @dates table(dt datetime primary key);

while @from <= @to begin

  insert @dates select @from;

  set @from = @from + 1;

end;

select d.dt, t.*
   from @dates as d
        cross apply( select top(1) * from meter_log as t1 where t1.factory_number=:number and t1.type_id=:typeId and t1.modem_id=:modemId and t1.date_format >= d.dt order by t1.date_format asc ) as t
26 мар 19, 12:22    [21843595]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
aleks222
Member

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

-- your query
SELECT
	t1.*
FROM meter_log t1
INNER JOIN (SELECT
				MIN(date_format) AS min_time
				FROM meter_log m2
			WHERE factory_number = :number
				AND type_id = :typeId
				AND modem_id = :modemId
				AND (date_format BETWEEN :from AND :to)
			GROUP BY CONVERT(varchar, date_format, 112)
			) t2
	ON t1.date_format = t2.min_time
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId

-- alternative 1 
SELECT
	t1.*
FROM meter_log t1
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId
and  t1.date_format = (SELECT
                                        MIN(date_format) AS min_time
                                   FROM meter_log m2
                                   WHERE factory_number = :number
                                        AND type_id = :typeId
                                        AND modem_id = :modemId
                                        AND (date_format BETWEEN :from AND :to)
						) 


Ты меня пугаешь.
1. Группировка - зло.
2. Группировка большой таблицы - большое зло.
3. Группировка там, где группировка не нужна, - глупость.
26 мар 19, 12:25    [21843602]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

Откуда:
Сообщений: 5244
aleks222
Ты меня пугаешь.
1. Группировка - зло.
2. Группировка большой таблицы - большое зло.
3. Группировка там, где группировка не нужна, - глупость.

у меня группировки нет, она у автора (your query)
я предложил alternative 1
26 мар 19, 12:33    [21843619]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1233
Гавриленко Сергей Алексеевич
Гулин Федор,

1. Для получения имени схемы есть удобная функция object_schema_name().
2. В таблице может быть более одной партиции.


1+
2 да не учитывается сей момент - проверил на патриционных - 0-ли показывает

schema TableName rows
temp part1 0
temp part1 0
temp part1 0


но скрпит сей полезен в 90% случаев и висит у меня на макросах ибо юзаю я его часто

зы ну вот написали бы рабочий вариант учитывающий 2) и была бы практич. польза людям
я вот навскидку не могу сообразить как по метаданным вытащить сию инфу сразу
26 мар 19, 14:16    [21843782]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
Гулин Федор
написали бы рабочий вариант учитывающий 2) и была бы практич. польза людям
Так в первом ответе написали правильный запрос. 21842488
26 мар 19, 14:38    [21843806]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
aleks222
Первое, что вам нужно сделать - поучиться писать запросы.

1. Таблица всех дат периода. Можете генерировать прямо перед запросом.
2. Cross apply ( select top(1) * from ... )
3. Индексы получат шанс.

declare @from datetime = '20190101'
      , @to datetime = '20190201'
;

declare @dates table(dt datetime primary key);

while @from <= @to begin

  insert @dates select @from;

  set @from = @from + 1;

end;

select d.dt, t.*
   from @dates as d
        cross apply( select top(1) * from meter_log as t1 where t1.factory_number=:number and t1.type_id=:typeId and t1.modem_id=:modemId and t1.date_format >= d.dt order by t1.date_format asc ) as t


Спасибо Вам. Ваши скрипт уменьшил время но он занимал где то 15 минут. Когда тот запрос запушен другие сервисе не могут записават данный
26 мар 19, 15:01    [21843853]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 6.0 (Build 6001: Service Pack 1)


ого!
чистый 2005 RTM!
не думал, что такие еще встречаются в природе
и не конфигурированный к тому же

покажите
select * from sys.dm_os_sys_info


на таблице есть индексы? заскриптуйте их и саму таблицу (show scripts of the table and its indexes)

покажите план запроса (execution plan)

по поводу запроса: мне кажется что он не совсем корректен, к тому же группировка лишняя
попробуйте альтернативный


-- your query
SELECT
	t1.*
FROM meter_log t1
INNER JOIN (SELECT
				MIN(date_format) AS min_time
				FROM meter_log m2
			WHERE factory_number = :number
				AND type_id = :typeId
				AND modem_id = :modemId
				AND (date_format BETWEEN :from AND :to)
			GROUP BY CONVERT(varchar, date_format, 112)
			) t2
	ON t1.date_format = t2.min_time
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId

-- alternative 1 
SELECT
	t1.*
FROM meter_log t1
WHERE t1.factory_number = :number
AND t1.type_id = :typeId
AND t1.modem_id = :modemId
and  t1.date_format = (SELECT
                                        MIN(date_format) AS min_time
                                   FROM meter_log m2
                                   WHERE factory_number = :number
                                        AND type_id = :typeId
                                        AND modem_id = :modemId
                                        AND (date_format BETWEEN :from AND :to)
						) 


К сообщению приложен файл (32.csv - 242bytes) cкачать
26 мар 19, 15:10    [21843870]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
aleks222
Member

Откуда:
Сообщений: 949
Kahramon
Спасибо Вам. Ваши скрипт уменьшил время но он занимал где то 15 минут. Когда тот запрос запушен другие сервисе не могут записават данный


Дарагой, тебе уже говорили: "определение таблицы и индексов давай".
26 мар 19, 16:29    [21843992]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

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


select * from sys.dm_os_sys_info



результат покажите либо картинкой, либо текстом с названием столбцов

гадать какие были колонки в выводе команды на сиквеле 5 поколений назад нет возможности
26 мар 19, 16:37    [21844006]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1233
alexeyvg
Гулин Федор
написали бы рабочий вариант учитывающий 2) и была бы практич. польза людям
Так в первом ответе написали правильный запрос. 21842488


ткните пальцем ГДЕ
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'T' AND (index_id < 2);

select COUNT(*) from T;

вот это у меня НЕ пашет - dвы
или про что

SELECT COUNT(*) FROM  <t1> (Nolock) ??? 

ну да но это тормоз на реально большоей таблице

приведенный выше мной скл отрабатывает моментально в независимости от кол-ва записей (ясно что зависит от прав. статистики)
если в таблицах милионы записей ЭТО оч. даже полезно ибо быстро помогает видеть картиену целиком
26 мар 19, 16:56    [21844028]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
Гулин Федор
ткните пальцем ГДЕ
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'T' AND (index_id < 2);

select COUNT(*) from T;


вот это у меня НЕ пашет - dвы
Да, про это.

А что "не пашет"?
26 мар 19, 17:22    [21844073]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon,


select * from sys.dm_os_sys_info



результат покажите либо картинкой, либо текстом с названием столбцов

гадать какие были колонки в выводе команды на сиквеле 5 поколений назад нет возможности


К сообщению приложен файл. Размер - 38Kb
28 мар 19, 10:19    [21845788]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon,


select * from sys.dm_os_sys_info



результат покажите либо картинкой, либо текстом с названием столбцов

гадать какие были колонки в выводе команды на сиквеле 5 поколений назад нет возможности


К сообщению приложен файл. Размер - 16Kb
28 мар 19, 10:20    [21845790]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

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

спасибо

и вот это тоже:

select object_name,counter_name,cntr_value/1024 [MB] 
from sys.dm_os_performance_counters
where counter_name like 'T%Server%Memory%'
28 мар 19, 11:35    [21845900]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon,

спасибо

и вот это тоже:

select object_name,counter_name,cntr_value/1024 [MB] 
from sys.dm_os_performance_counters
where counter_name like 'T%Server%Memory%'


К сообщению приложен файл. Размер - 19Kb
28 мар 19, 16:31    [21846331]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
komrad
Member

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

ну что, винда2008 с 8ГБ и 16цпу, сиквел 2005 стандарт RTM съедает половину памяти (3.5ГБ), конфигурирован по умолчанию

неясен размер базы, таблицы meter_log, структура таблицы и индексы по ней

покажите результат отдельными картинками

exec sp_help meter_log
exec sp_helpindex meter_log
exec sp_spaceused meter_log
28 мар 19, 16:42    [21846348]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon,

ну что, винда2008 с 8ГБ и 16цпу, сиквел 2005 стандарт RTM съедает половину памяти (3.5ГБ), конфигурирован по умолчанию

неясен размер базы, таблицы meter_log, структура таблицы и индексы по ней

покажите результат отдельными картинками

exec sp_help meter_log
exec sp_helpindex meter_log
exec sp_spaceused meter_log


К сообщению приложен файл. Размер - 15Kb
28 мар 19, 17:18    [21846390]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
Kahramon
Member

Откуда:
Сообщений: 19
komrad
Kahramon,
exec sp_spaceused meter_log


К сообщению приложен файл. Размер - 52Kb
28 мар 19, 17:19    [21846399]     Ответить | Цитировать Сообщить модератору
 Re: Почему select count(*) from tablename запрос занимает много время?  [new]
aleks222
Member

Откуда:
Сообщений: 949
komrad
Kahramon,

ну что, винда2008 с 8ГБ и 16цпу, сиквел 2005 стандарт RTM съедает половину памяти (3.5ГБ), конфигурирован по умолчанию

неясен размер базы, таблицы meter_log, структура таблицы и индексы по ней

покажите результат отдельными картинками

exec sp_help meter_log
exec sp_helpindex meter_log
exec sp_spaceused meter_log


Лечим геморрой горчичниками?

ЗЫ. Никакое оборудование не исправит кривого запроса/таблицы.
29 мар 19, 05:48    [21846719]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить