Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Вопрос по производителдьности: Есть некая табличка, назовем ее Tbl, для простоты. У этой таблички есть поля Id (autoIncrement), cat(числовое, категория) ,fVal(скажем текстовое). Записей в энтой табличке много. Записи из нее иногда удаляются и частенько добавляются. Интервалы в знаечниях Id большие и случайные Нужно получит случайную запись из нее. Вариант в лоб (получить все, сгенерить случайное число, прыгнуть на эту запись) не катит из-за производительности. Хочется чтобы в рекордсете была только одна запись - случайная. Какие варианты решения есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 09:50 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Можно, например, так: 1. Генерим случайное целое @i; 2. SELECT TOP 1 * FROM Tbl WHERE id>=@i ORDER BY id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 10:22 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
SELECT TOP 1 * FROM Tbl ORDER BY newid() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 10:32 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
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 ... Не особо они и случайные. Так что такой способ не всем подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 12:44 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Ну что я могу сказать, у меня такой же запрос выдает каждый раз разные id. SQL2000 EE SP2 Да, наверное вы правы, что это способ подойдет не всем, но может быть хоть кому-то подойдет. PS Интересно, а у вас получается что не будут работать запросы вида INSERT INTO mytable(record_id, f1) SELECT newid(), myfield FROM TempTable ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 13:43 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
А почему они не должены работать? Работают 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 14:25 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Да, конечно, не заметил, что у вас меняется 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) Неужели все дело в версиях ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 14:55 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Как бы то там ни было, но запрос с newid() будет возвращать разные неповторяющиеся значения при каждом НОВОМ ЗАПУСКЕ запроса. Какая нам разница, в одном запросе одинаковые значения или разные, если требуется всего одна запись? Следовательно, решение Glory - решает проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 15:42 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
2 Glory, мне кажется, что дело тут не в версиях а в наличии/отсутствии на машине сетевой карты в зависимости от этого GUID генерируется по разному, кажется при наличии сетевой MS обещает вообще уникальный GUID, наверное, из-за MAC адреса, а при отсутствии сетевой не обещает и GUID строится только на таймере С уважением, Сергей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 04:05 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
2 SergD: У меня на домашнем компьютере (без сетевой карты) получается то же что и у Glory... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 06:53 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
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. Случайно наверное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 07:25 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
А у меня аналогичный запрос возвращает случайные значения, а GUID'ы не похожи друг на друга совсем. Различие идет уже с первого символа. sql2000sp2 Standart Edition. Хорошо, что мы этот вопрос помусолили. Будем знать, что это решение не везде приемлимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 08:16 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
2 SergSuper >При чем здесь сетевая карта? Это совсем разные уровни. Почему - алгоритм от MS используется один и тот же а он напрямую зависит от наличия сетевой карты(ее MAC адреса) И соответственно я предполагаю что картины по результату newid() на машинах с сетевой картой и без будут отличаться и там где newid() строится только на показаниях таймера результат будет больше походить на случайную последовательнось (но всеравно это не будет случайным числом) С уважением, Сергей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 08:40 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Вообще-то 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 сетевые карты, которые объединены в одну виртуальную. С какой карты будет браться ее номер ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 09:10 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
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)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 10:19 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Насчет 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 может доказать обратное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 10:35 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlmag01/html/ProblemChildren.asp Сделайте поиск по "random" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 10:35 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Еще про 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() приводит к полному перебору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 11:13 |
|
||
|
Случайная запись
|
|||
|---|---|---|---|
|
#18+
Господа, расскажите, а как такой запрос будет работать? Что значит order by newId(). Как так вместо имени поля подставляется строковое значение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2002, 11:01 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32021548&tid=1824179]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 349ms |

| 0 / 0 |
