|
|
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Ктонить сталкивался с такой проблемой - в таблице очень много записей (порядка 300 000 000), есть поле ID(Pk, identity) как быстро найти максимальный Id? Если писать в лоб Select Max(Id) from tabl1 работает достаточно долго - в районе 6 минут. Нужно чтобы хотябы секунд в 30 укладывалось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 11:38:30 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
SELECT IDENT_CURRENT('table_name') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 11:44:03 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
select ident_current('tablename') работает правильно, если последние ID не удалялись. select top 1 ID from table order by id desc может попроще будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 11:47:44 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
select top 1 ID from table order by id desc - пробовал работает еще дольше.... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 11:52:15 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
попробуй создать некластерный индекс по тому же полю, а в запросе укажи его хинтом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:00:54 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
может так получше будет: select top 1 ID from table option (fast 1) order by id desc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:03:01 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
2 Lexis: а некластерный индекс размером будет порядка гигабайта. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:04:15 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
идея использования некластерного индекса в том, что в этом случае считывать SQL будет меньшее количество блоков данных..полагаю так как кластерный привязан к таблице и храниться собственно в ней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:06:06 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Ускорение при использовании не кластерного индексе приблизительно в 2 раза... уже лучше - но все таки уже лучше а вот select top 1 ID from table option (fast 1) order by id desc... не совсем понял что здесь значит fast 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:16:17 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Тогда еще вариант - PK можно некластерным сделать. Но это все равно лишний гиг размера. :( fast 1 - это указание оптимизатору выбрать такой план выполнения запроса, который максимально быстро вернет первую строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:18:16 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
зачем нужен fast 1 если и так присутсвует top 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:21:01 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
И если уж создан некластерный индекс - то может быть будет быстрее, если сделать его desc (только на 2000). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:21:11 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
пусть будет гигабайт, но он же древовидный :) еще можно положить его в отдельный файл, файл положить на другой диск... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:27:17 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Может проще триггера повесить и держать это значение еще где-нибудь? Если уж ident_current совсем не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:32:53 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
2. вариант сделать триггер на вставку и т.п, который будет постоянно обновлять max(id), хранящееся в другом месте....в какой нить служебный таблице 3. вариант если Identity, то можно вот: IDENT_CURRENT('table_name') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:33:29 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
По идее размер индекса меня абсолютно не пугает... fast 1 дает такую же скорость что и без него. Всеравно всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:34:37 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
а тригера здесь не подходят - данные в онлайне льются очень быстро... порядка 30 000 000 в день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:37:43 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Как льются, по одной записи или пачками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:41:18 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
так и так.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:42:33 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Удаляются часто? Пачками или по одной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:45:22 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
удаляются редко... и в основном штучно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 12:47:15 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Ну если так вижу такие варианты: 1) Использовать ident_current, наплевать на возможную ошибку в одну-две записи и молиться. 2) сделать триггер на делете: if (select max(id) from deleted)=ident_current('tablename') DBCC CHECKIDENT (tablename,RESEED) и использовать после этого ident_current наплевав на возможность повторного появления уже однажды удаленных ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 13:03:30 |
|
||
|
Опытным монстрам SQL
|
|||
|---|---|---|---|
|
#18+
Хотя второй вариант не пройдет - dbcc нверное будет блокировать таблицу на долгое время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2002, 13:11:45 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32068334&tid=1818726]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
29ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 300ms |

| 0 / 0 |
