powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опытным монстрам SQL
44 сообщений из 44, показаны все 2 страниц
Опытным монстрам SQL
    #32068242
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ктонить сталкивался с такой проблемой -
в таблице очень много записей (порядка 300 000 000), есть поле ID(Pk, identity) как быстро найти максимальный Id? Если писать в лоб Select Max(Id) from tabl1 работает достаточно долго - в районе 6 минут. Нужно чтобы хотябы секунд в 30 укладывалось
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068245
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT IDENT_CURRENT('table_name')
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068247
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select ident_current('tablename') работает правильно, если последние ID не удалялись.

select top 1 ID from table order by id desc может попроще будет
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068253
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select top 1 ID from table order by id desc - пробовал работает еще дольше.... :(
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068261
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй создать некластерный индекс по тому же полю, а в запросе укажи его хинтом
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068262
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может так получше будет:
select top 1 ID from table option (fast 1) order by id desc
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068265
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lexis: а некластерный индекс размером будет порядка гигабайта. :)
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068266
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
идея использования некластерного индекса в том, что в этом случае считывать SQL будет меньшее количество блоков данных..полагаю
так как кластерный привязан к таблице и храниться собственно в ней
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068276
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ускорение при использовании не кластерного индексе приблизительно в 2 раза... уже лучше - но все таки уже лучше

а вот select top 1 ID from table option (fast 1) order by id desc... не совсем понял что здесь значит fast 1
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068279
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда еще вариант - PK можно некластерным сделать. Но это все равно лишний гиг размера. :(

fast 1 - это указание оптимизатору выбрать такой план выполнения запроса, который максимально быстро вернет первую строку.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068281
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем нужен fast 1 если и так присутсвует top 1
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068282
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И если уж создан некластерный индекс - то может быть будет быстрее, если сделать его desc (только на 2000).
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068288
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пусть будет гигабайт, но он же древовидный :)
еще можно положить его в отдельный файл, файл положить на другой диск...
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068292
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может проще триггера повесить и держать это значение еще где-нибудь? Если уж ident_current совсем не подходит.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068294
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. вариант
сделать триггер на вставку и т.п, который будет постоянно обновлять max(id), хранящееся в другом месте....в какой нить служебный таблице
3. вариант
если Identity, то можно вот:
IDENT_CURRENT('table_name')
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068296
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По идее размер индекса меня абсолютно не пугает... fast 1 дает такую же скорость что и без него. Всеравно всем спасибо.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068302
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а тригера здесь не подходят - данные в онлайне льются очень быстро... порядка 30 000 000 в день.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068310
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как льются, по одной записи или пачками?
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068312
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так и так....
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068315
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удаляются часто? Пачками или по одной?
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068317
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
удаляются редко... и в основном штучно
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068329
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если так вижу такие варианты:

1) Использовать ident_current, наплевать на возможную ошибку в одну-две записи и молиться.

2) сделать триггер на делете:
if (select max(id) from deleted)=ident_current('tablename')
DBCC CHECKIDENT (tablename,RESEED)
и использовать после этого ident_current наплевав на возможность повторного появления уже однажды удаленных ID.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068333
aproximate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068334
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя второй вариант не пройдет - dbcc нверное будет блокировать таблицу на долгое время.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068347
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, где же ответ Glory?

Или он себя не считает опытным монстрам SQL?!
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068358
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, придумал пока обедал:

Сделать табличку (LastDeletedID bigint) и в триггере на удаление заносить туда max(id) from deleted, а в выборке max(ID) использовать максимум из ident_current и LastDeletedID. Будет всегда правильное значение!
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068360
mishgan2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если так:
select max(ID) from table (NOLOCK)
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068378
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если смотреть на планы выполнения, то
и
Select Max(Id) from tabl1
и
select top 1 ID from table order by id desc
- либо table scan, при отсутствии индексов на id
- либо (clustered) index scan при наличии индекса на id.

Поэтому просто упираемся в скорость чтения таблицы(индекса). А так как таблица очень большая, то нужно вести речь о скорости чтения дисков.
Другими словами
- либо увеличиваем производительность дисков
- либо решаем это решаем проблему через дополнительные таблицы. Можно рассмотреть и вариант VVG_, но если вы утверждаете что записи "удаляются редко... и в основном штучно", то вообще можно в триггере "запоминать" все удаленные ID. Рядом с 300 000 000 таблицей даже пара тысяч будет смотреться "жалко".

ЗЫ
2akuz
я не монстр - это точно :-)
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068441
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже не монстр... но мне приходилось отказываться от identity вообще.... поле генерировал на лету на клиенте....
от текущего maxid....
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068513
genie_vats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если вставить запись в транзакции получить ID и откатить?
(:
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068536
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не использовать кластерный индекс по id (desc) ? Или вставка будет очень долго занимать ?
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068545
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно использовать обычный сластерный индекс по полю id.... не desc конечно... ;))
так как поле ID identity - добовлятся будет всегда в конец...
вот такой запрос должен работать быстро...( по кластерному индексу)
select top 1 ID from table option(nolock) order by id desc
или select max(ID) from table option(nolock) group by id
если выполняется долго нужно смотреть статистику....
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068548
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что проблема в ТАКОЙ организации хранения данных. Наверняка в этой табле хранятся данные за все года или события различающиеся по одному признаку, которые ни чего не стоит развести и по таблям, и по файлам, и по дискам.
Именно это даст ощутимый прирост скорости и позволит в дальнейшем правильно развивать хранилище. Многие автоматические навороты для мини хранилищ абсолютно противопоказаны монстрам.

ЗЫ Убей свои иллюзии и перестань думать, что ты монстр. Фсе. МЯФ!
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068564
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как всегда, я предпочитаю не решать проблемы, а снимать их.
У меня жуткие сомнения, что этот поиск нафиг не нужен.
Обрисуйте, для чего используется этот max.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068723
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два кота! Ну, ты вообще правду матку рубанул, прям в глаза. Ты аккуратнее с людьми они такие ранимые.
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068728
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to
Tracer
MiCe
если написано
>есть поле ID(Pk, identity)
то значит кластерный индекс скорее всего есть и его уже попробовали
поиск по некластерному индексу будет быстрее в сило его физической организации
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068746
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал таблицу:
CREATE TABLE [t] (
[f1] [int] IDENTITY (1, 1) NOT NULL ,
[f2] [int] NULL ,
CONSTRAINT [PK_t] PRIMARY KEY CLUSTERED
(
[f1]
) ON [PRIMARY]
) ON [PRIMARY]

Вставил 301545854 записей.

select max(f1) from t --время выполнения =0.
Что я делаю не так?
Как получить 6 минут?
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068747
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, размер данных - 5Гиг, индекс - 13мег
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068753
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to VAT
все дело в волшебных пузырьках...
скорее всего таблица, по которой запрос идет 6 минут имеет не 2 поля, а с десяток и поэтому на одном блоке данных помещается всего несколько ROWs. Хотя 6 минут и 0 все равно непонятно...пусть покажут нам исходные данные :)
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068760
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да хрень какая-то ... не может этого быть, чтобы так долго было. Ищите ошибку не к коде... Маразм какой-то ...

PS При вычислении примера 2+2 запрос выполнятся 6 мин. Пожалуйста помогите написать правильно!
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068769
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор топика сбежал куда-то. Ну подумайте, народ, а зачем ищется этот самый max? Что-бы прибавить к нему единичку и получить уникальный ключ? Так есть GUID и identity.

А где это участвует? Строки кластерного индекса нумеруются? А нафиг это надо?

Это номер документа? Так нумерацию, во-первых, можно каждый год или даже месяц начинать с единицы.
Во-вторых, если это все-же номер документа и нумерацию сбрасывать нельзя, то с уверенностью в 99.9% модно предположить, что там есть поле DateTime. и при ежедневной вставке в 30 000 000 (неужели правда?), максимальное значение будет в интервале getdate() - 1/24 (час).
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068788
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А стоит ли так долго говорить о таблице, которая при таких объемах вставки загнется через 70 дней от переполнения поля int?
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32068792
кто-то сказал неправильно про identcurrent() и все поверили. попробуй:

create table t (id int identity primary key)
insert into t default values
insert into t default values
insert into t default values
select * from t
delete t where id>1
SELECT IDENT_CURRENT('t')
drop table t
...
Рейтинг: 0 / 0
Опытным монстрам SQL
    #32069097
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все проблемы упираются в скорость...
если данные вливаются непрерывно.... через булк ...
порциями...
и с базой еще и работают...
2 Опытный монстр SQL
а ты пробовал свой код именно в этой ситуации?
и 2 All
есть таблица.... пусть тяжелая....
есть ключ.... идент...
рассмотрим 2 варианта...
кластерный и не кластерный индекс...
при кластерном - добавлятся будет всегда в конец набора данных..... потерь на добавление нет....
а вот на вставку и удаление - есть.....
при обычном индексе - равномерная нагрузка на добавление и вставку.... но нагрузка только на этот идекс...
дык вот при огромных размерах данных , с постоянным добавлением и редким удалением - кластерный индекс
именно то что нужно.....
а вот причина почему 6 мин. ....
обычный индекс персчитывается после булк....
а кластерному пересчитываться при этом не нужно....
макс нужен чтобы сделать идентити инсерт в таблу...
иначе сервер может захлебнуться....
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опытным монстрам SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]