powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Случайная запись
20 сообщений из 20, страница 1 из 1
Случайная запись
    #32021323
Вопрос по производителдьности: Есть некая табличка, назовем ее Tbl, для простоты. У этой таблички есть поля Id (autoIncrement), cat(числовое, категория) ,fVal(скажем текстовое). Записей в энтой табличке много. Записи из нее иногда удаляются и частенько добавляются. Интервалы в знаечниях Id большие и случайные Нужно получит случайную запись из нее.
Вариант в лоб (получить все, сгенерить случайное число, прыгнуть на эту запись) не катит из-за производительности. Хочется чтобы в рекордсете была только одна запись - случайная.
Какие варианты решения есть?
...
Рейтинг: 0 / 0
Случайная запись
    #32021331
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, например, так:
1. Генерим случайное целое @i;
2. SELECT TOP 1 * FROM Tbl WHERE id>=@i ORDER BY id
...
Рейтинг: 0 / 0
Случайная запись
    #32021334
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT TOP 1 * FROM Tbl ORDER BY newid()
...
Рейтинг: 0 / 0
Случайная запись
    #32021348
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory
У меня такой запрос:
select newid() from sysobjects
выдаёт
586DB9C0-065B-11D6-A038-00A0C997F01E
586DB9C1-065B-11D6-A038-00A0C997F01E
586DB9C2-065B-11D6-A038-00A0C997F01E
586DB9C3-065B-11D6-A038-00A0C997F01E
586DB9C4-065B-11D6-A038-00A0C997F01E
586DB9C5-065B-11D6-A038-00A0C997F01E
586DB9C6-065B-11D6-A038-00A0C997F01E
586DB9C7-065B-11D6-A038-00A0C997F01E
586DB9C8-065B-11D6-A038-00A0C997F01E
586DB9C9-065B-11D6-A038-00A0C997F01E
...

Не особо они и случайные. Так что такой способ не всем подойдёт.
...
Рейтинг: 0 / 0
Случайная запись
    #32021349
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что я могу сказать, у меня такой же запрос выдает каждый раз разные id.
SQL2000 EE SP2

Да, наверное вы правы, что это способ подойдет не всем, но может быть хоть кому-то подойдет.

PS
Интересно, а у вас получается что не будут работать запросы вида
INSERT INTO mytable(record_id, f1) SELECT newid(), myfield FROM TempTable ?
...
Рейтинг: 0 / 0
Случайная запись
    #32021352
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему они не должены работать? Работают

declare @t table(record_id uniqueidentifier, f1 varchar(99))

INSERT INTO @t(record_id, f1) SELECT newid(), name FROM sysobjects

select * from @t

выдаёт:

record_id f1
------------------------------------ -------------------------------
FC7D779A-1006-11D6-A038-00A0C997F01E sysobjects
FC7D779B-1006-11D6-A038-00A0C997F01E sysindexes
FC7D779C-1006-11D6-A038-00A0C997F01E syscolumns
FC7D779D-1006-11D6-A038-00A0C997F01E systypes
FC7D779E-1006-11D6-A038-00A0C997F01E syscomments
FC7D779F-1006-11D6-A038-00A0C997F01E sysfiles1
FC7D77A0-1006-11D6-A038-00A0C997F01E syspermissions
FC7D77A1-1006-11D6-A038-00A0C997F01E sysusers
FC7D77A2-1006-11D6-A038-00A0C997F01E sysproperties
FC7D77A3-1006-11D6-A038-00A0C997F01E sysdepends
...


Microsoft SQL Server 2000 - 8.00.384 (Intel X86)
May 23 2001 00:02:52
Copyright (c) 1988-2000 Microsoft Corporation
Standard Edition on Windows NT 4.0 (Build 1381: Service Pack 5)
...
Рейтинг: 0 / 0
Случайная запись
    #32021355
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, конечно, не заметил, что у вас меняется 8-ой знак

Странно, у меня каждый раз действительно генерируются случайные значения. Вот из последнего запуска


5282463E-0259-4345-B310-CBCCF5AB9E47
3FCB288B-9524-413F-822E-F801E2E93358
0202DD0C-3E6D-4D1F-B172-D44C90E7780E
CBA06D94-F976-458F-B1BE-AABFE4668B84
E54916FC-3B65-43BD-9477-5269D026ADD7
A82825FE-F653-421C-A830-AECE5ED6CC21
DC7D0244-EF69-492B-A6CB-9CE8D68F29E5
E363E609-9C20-438E-A6CB-4D6E49BF788D
11DC19AF-1687-47E2-97A0-B3739C186291
D2BF75CE-DCA0-445A-9411-963F2C435ADA


select @@version
Microsoft SQL Server 2000 - 8.00.534 (Intel X86) Nov 19 2001 13:23:50 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2)

Неужели все дело в версиях ?
...
Рейтинг: 0 / 0
Случайная запись
    #32021365
Как бы то там ни было, но запрос с newid() будет возвращать разные неповторяющиеся значения при каждом НОВОМ ЗАПУСКЕ запроса. Какая нам разница, в одном запросе одинаковые значения или разные, если требуется всего одна запись?
Следовательно, решение Glory - решает проблему.
...
Рейтинг: 0 / 0
Случайная запись
    #32021379
SergD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Glory, мне кажется, что дело тут не в версиях а в наличии/отсутствии на машине сетевой карты
в зависимости от этого GUID генерируется по разному, кажется при наличии сетевой MS обещает вообще уникальный GUID, наверное, из-за MAC адреса, а при отсутствии сетевой не обещает и GUID строится только на таймере
С уважением, Сергей.
...
Рейтинг: 0 / 0
Случайная запись
    #32021386
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergD:
У меня на домашнем компьютере (без сетевой карты) получается то же что и у Glory...
...
Рейтинг: 0 / 0
Случайная запись
    #32021390
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergD
При чем здесь сетевая карта? Это совсем разные уровни.
В любом случае у меня на сервере работает почти сотня юзеров, так что сетевая карта там всяко есть.

2 Глеб Уфимцев
У меня есть таблица, где просто записаны числа от 0 до 999 с кластерным индексом. Я делаю такой запрос:
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
SELECT TOP 1 num, newid() FROM Millenium ORDER BY 2
и получаю:
num
----------- ------------------------------------
89 FC7D8900-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

num
----------- ------------------------------------
113 FC7D8D00-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

num
----------- ------------------------------------
137 FC7D9100-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

num
----------- ------------------------------------
161 FC7D9500-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

num
----------- ------------------------------------
185 FC7D9900-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

num
----------- ------------------------------------
209 FC7D9D00-1006-11D6-A038-00A0C997F01E

(1 row(s) affected)

Казалось бы всё хорошо. Но "если посмотреть вооруженным глазом", то можно заметить, что числа идут через одинаковый промежуток - 24. Случайно наверное
...
Рейтинг: 0 / 0
Случайная запись
    #32021396
А у меня аналогичный запрос возвращает случайные значения, а GUID'ы не похожи друг на друга совсем. Различие идет уже с первого символа. sql2000sp2 Standart Edition.

Хорошо, что мы этот вопрос помусолили. Будем знать, что это решение не везде приемлимо.
...
Рейтинг: 0 / 0
Случайная запись
    #32021399
SergD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
>При чем здесь сетевая карта? Это совсем разные уровни.
Почему - алгоритм от MS используется один и тот же а он напрямую зависит от наличия сетевой карты(ее MAC адреса)
И соответственно я предполагаю что картины по результату newid() на машинах с сетевой картой и без будут отличаться и там где newid() строится только на показаниях таймера результат будет больше походить на случайную последовательнось (но всеравно это не будет случайным числом)

С уважением, Сергей.
...
Рейтинг: 0 / 0
Случайная запись
    #32021401
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то SergD прав
BOL - Accessing and Changing Relational Data - Transact-SQL Syntax Elements - Using Data Types - Using uniqueidentifier Data
"The Transact-SQL NEWID function and the application API functions and methods generate new uniqueidentifier values from the identification number of their network card plus a unique number from the CPU clock . Each network card has a unique identification number. The uniqueidentifier returned by NEWID is generated using the network card on the server. The uniqueidentifier returned by application API functions and methods is generated using the network card on the client.
"
Однако все равно остается непонятным сам механизм генерации.
У меня например на сервере физически 2 сетевые карты, которые объединены в одну виртуальную. С какой карты будет браться ее номер ?
...
Рейтинг: 0 / 0
Случайная запись
    #32021411
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory:
Похоже мы с Вами читали статью "Using uniqueidentifier Data" одновременно.


А Вы обратили внимание, что в этой статье уверенно говорится об уникальности(unique throughout the world), и как-то вскользь про случайность (The values are random and cannot accept any patterns that may make them more meaningful to users)?
...
Рейтинг: 0 / 0
Случайная запись
    #32021415
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет unique throughout the world IMHO корректнее было бы говорить об очень малой вероятности совпадения 2-х значения, сгенерированных на 2-х разных машинах. Не буду утверждать, но где-то я читал, что такая верояность кажется 0.000001%.

А как вам вот эта фраза
"There is no way to determine the sequence in which uniqueidentifier values were generated . They are not suited for existing applications that depend on incrementing key values serially."
Кажется сервер SergSuper может доказать обратное
...
Рейтинг: 0 / 0
Случайная запись
    #32021416
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlmag01/html/ProblemChildren.asp
Сделайте поиск по "random"
...
Рейтинг: 0 / 0
Случайная запись
    #32021421
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще про pseudo-random:
http://www.microsoft.com/technet/treeview/default.asp?url=/TechNet/prodtechnol/sql/plan/inside6.asp

Но если вернуться к вопросу о производительности, похоже что SELECT TOP 1 * FROM Tbl ORDER BY newid() приводит к полному перебору.
...
Рейтинг: 0 / 0
Случайная запись
    #32021548
Господа, расскажите, а как такой запрос будет работать? Что значит order by newId(). Как так вместо имени поля подставляется строковое значение?
...
Рейтинг: 0 / 0
Случайная запись
    #32021567
Dmitri+ICQ104152399
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а так чем плохо?
SELECT TOP 1 *
FROM [Table]
where [ID]>= floor(rand()*(select max([ID]) from [Table]))
или
SELECT TOP 1 *
FROM [Table]
where [ID]>= floor(rand()* IDENT_CURRENT('Table'))
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Случайная запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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