Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Или я не прав? Insert вставляет куда попало...  [new]
Жмурик
Member

Откуда: Оттуда
Сообщений: 382
Или во всяком случае потом select выводит как попало,
ЕСЛИ: нет уникального поля в таблице.

Я прав, правда?

(Почему бы по умолчанию не пользоваться бы какими нибудь там нибудь внутресистемными ключами и не обеспечить бы юзеру тот порядок записей, в каком была вставка для ОДНОЙ таблицы, если нет order by?)
22 окт 03, 17:08    [388454]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
SiDen
Member

Откуда:
Сообщений: 518
Почему бы по умолчанию не пользоваться бы какими нибудь там нибудь внутресистемными ключами и не обеспечить бы юзеру тот порядок записей, в каком была вставка для ОДНОЙ таблицы, если нет order by?

А для чего? Пример: таблица лежит в двух файлах данных, на разных контроллерах и инстанс вертится на 4 процах... ну или на двух... и данные получаются в кривом порядке... для чего их потом сортировать, если не было указания? Более того, данные будут отдаваться произвольно, даже если есть кластерный праймари кэй, если нет сортировки.
22 окт 03, 17:18    [388486]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
PeterS
Member

Откуда:
Сообщений: 3
Это идеология SQL
ты не можешь строить предположений о физическом размещении данных.
Реализация MSSQL такова, что записи вставляются туда где есть место.
22 окт 03, 17:20    [388492]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Alex_2003
Member

Откуда: Moscow
Сообщений: 277
Если есть кластерный индекс на таблице, то оператор ORDER BY можно и не использовать при выборке. Они хранятся в уже отсортированном виде.
22 окт 03, 17:29    [388523]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Дмитрий Рождественский
Member

Откуда:
Сообщений: 150
[QUOTE]Они хранятся в уже отсортированном виде.[/QUOTE]

А выдаваться могут, как уже было подмечено выше, в произвольном.
22 окт 03, 17:35    [388540]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Жмурик
Member

Откуда: Оттуда
Сообщений: 382
Понял, спасибо!

Короче говоря, Так он сделан (сервер). Так его сделали.
(Потому как мне известен другой sql-сервер, где каждая запись уникально идентифицируется безо всякого индекса, внутренним индексом, и по нему можно всегда найти и отстртировать. И база может храниться в нескольких файлах в разных доменах и многопроцовость поддерживается...)
22 окт 03, 17:43    [388555]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
2Жмурик
Раньше у MSSQL (когда он был ещё переделанным сайбесом) тоже был внутренний идентификатор у записи.
А потом они справедливо рассудили, что 2 идентификатора - это слишком много и для экономии дисков (ВАШИХ дисков) оставили один - тот, который определил пользователь.

И представляете, какое преимущество перед тем самым "другим sql-сервером" - всё то-же самое, но имя внутреннего индекса можно выбирать самому - просто сделайте кластерный идентити ПК и считайте его внутренним индексом :-)
22 окт 03, 17:54    [388581]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Гнездин Петр
Member

Откуда: Москва
Сообщений: 359
Alex_2003 писал:
оператор ORDER BY можно и не использовать при выборке

Распространенное заблуждение. Без явного указания сортировки на порядок выдачи результата может влиять многопроцессорность, используемые в данном запросе индексы и многое другое.
Даже при использовании GROUP BY SQL-2000, в отличие от предыдущих версий, не гарантирует порядок выдачи.

Примерно с тем же успехом можно говорить, что наличие в таблице identity гарантирует отсутствие пропусков в нумерации, если данные из таблицы никогда не удаляются.
23 окт 03, 11:25    [389471]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Примерно с тем же успехом можно говорить, что наличие в таблице identity гарантирует отсутствие пропусков в нумерации, если данные из таблицы никогда не удаляются.
Угу. Если триггер на вставку откатил запись, то следующее значение identity будет с пропуском.
23 окт 03, 12:44    [389661]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
Жмурик
писал:
Короче говоря, Так он сделан (сервер). Так его сделали.


Тогда давайте и реляционную теорию посрамим, т.к. она тоже не предусматривает упорядоченного хранения записей в таблице :))
Вы уж извините, но отсутствие внутренних индексов - это скорее плюс, чем минус. Отнюдь не всегда логика построения такого индекса будет соответствовать вашей бизнес-логике и способствовать оптимальному исполнению Ваших запросов.
23 окт 03, 14:08    [389927]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Жмурик
Member

Откуда: Оттуда
Сообщений: 382
Теория не в ответе за реализации
И не ограничивает их

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

не всегда логика построения такого индекса будет соответствовать вашей бизнес-лог
Не всегда, но в большинстве простых случаев.
23 окт 03, 14:34    [390007]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Гнездин Петр
Member

Откуда: Москва
Сообщений: 359
GreenSunrise писал:
Если триггер на вставку откатил запись...

Достаточно даже просто попытаться нарушить какой-нибудь constraint - уникальность, например.
23 окт 03, 14:56    [390069]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
2Жмурик
"Не всегда, но в большинстве простых случаев."

В том-то и дело, что в большинстве простых случаев. А в сложных случаях не будет :-( И вот тогда на "другом сервере" сделать будет ничего нельзя - ведь этот внутренний индекс не отменишь :-(
И автоматическую сортировку данных тоже (если она, по вашим словам, там производится всегда без учёта мнения разработчика приложения).

И как-бы он аккуратно не обращащался с дисковым пространством, дополнительные данные (внутренний ключ) нужно хранить и тратить место.

Вот поэтому-то этот "другой сервер" и проигрывает последнее время в синтетических и реальных тестах MSSQL-ю :-)))

И вообще, непонятно, всё-таки, неужели так тредно сделать идентити ПК???
23 окт 03, 15:10    [390095]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Жмурик
Member

Откуда: Оттуда
Сообщений: 382
Я вот что скажу
Я на 100% уверен что какая-нибудь внутренняя нумерация у таблиц MSSQL есть для внутренних же целей. Вопрос в том, что она недоступна для TSQL.
23 окт 03, 15:11    [390102]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Alex_2003
Member

Откуда: Moscow
Сообщений: 277
"Распространенное заблуждение. Без явного указания сортировки на порядок выдачи результата может влиять многопроцессорность, используемые в данном запросе индексы и многое другое."

Ну и что получается, у меня есть составной кластерный индекс (по двум полям), я вношу данные туда в любом порядке. А при обычной выборке получаю результат в отсортированном виде. Без всяких ORDER BY.

При наличии кластерного индекса, данные физически хранятся в отсортированном виде. И вовсе не обязательно использовать ORDER BY. Экспериментировал и на многопроцессорном сервере, результат тот же.
23 окт 03, 15:12    [390106]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
на 100% уверен что какая-нибудь внутренняя нумерация у таблиц MSSQL есть для внутренних же целей.
Эт точно.

https://www.sql.ru/articles/mssql/03013101Indexes.shtml
23 окт 03, 15:13    [390109]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Александр Азаркович
Member

Откуда:
Сообщений: 208
Alex_2003 писал:
При наличии кластерного индекса, данные физически хранятся в отсортированном виде. И вовсе не обязательно использовать ORDER BY. Экспериментировал и на многопроцессорном сервере, результат тот же.

Хранятся-то в отсортированном виде, а вот как выдаются?! И проявится эта проблема, по всем законам Мерфи, не на этапе эксперимента, а на этапе промышленной эксплуатации...
Лучше все-таки с ORDER BY...
23 окт 03, 15:25    [390138]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Народ! Обсуждалось уже ... раз! Без явного указания порядка результирующего набора сервер выдаст его в том порядке как ЕМУ УДОБНО, невзирая даже на кластерный индекс!
23 окт 03, 15:28    [390150]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
2Жмурик, tpg
"на 100% уверен что какая-нибудь внутренняя нумерация у таблиц MSSQL есть для внутренних же целей.
Эт точно.
https://www.sql.ru/articles/mssql/03013101Indexes.shtml"

В тексте по приведённой ссылке соделжится ошибка.
Там написано:
указатель представляет собой row ID, который имеет следующий формат: НомерФайла:НомерСтраницы:ПозицияЗаписи.

На самом деле внутренняя нумерация у таблиц MSSQL для внутренних же целей исползуется, если разработчик не создал собственную, т.е. кластерный ПК.
А если создал, то в ссылках на записи используется именно он. И дальше в тексте это указано.

Да вообще там глупости написаны. Например:
"В SQL Server кластерный индекс является уникальным индексом по определению" :-))))
23 окт 03, 15:30    [390156]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
rubas
Member

Откуда:
Сообщений: 13
Кажется суть сабжа в отсутствии Recno у SQL?
Вариант решения:
select IDENTITY(int, 1,1) AS ID,qq1,qq2,...,qqN from tableQQ

создаст уникальную нумерацию колонок.

Вообще при создании таблицы можно задать поле идентити!!!!
24 окт 03, 10:21    [391251]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2 alexeyvg

Да вообще там глупости написаны. Например:
"В SQL Server кластерный индекс является уникальным индексом по определению" :-))))


Ну, дык и предьяви притензии автору ;-))
24 окт 03, 10:40    [391282]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
alexeyvg писал:
https://www.sql.ru/articles/mssql/03013101Indexes.shtml"

В тексте по приведённой ссылке соделжится ошибка.


Наверное действительно нужно попросить автора статьи внести поправки, которые я потом размещу в самой статье в той форме, которую автор сочтёт нужной. Честно говоря, внутреннюю реализацию индексирования я глубоко не копал, поэтому и пропустил указанные Вами неточности при редактуре. Будет очень здорово, если опытные специалисты будут критиковать публикуемые на сайте и в рассылке материалы. Таким образом, их качество только выиграет :)
24 окт 03, 13:29    [391700]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Gena G.
Member

Откуда: Oz
Сообщений: 977
alexeyvg писал:
В тексте по приведённой ссылке соделжится ошибка.
Там написано:
указатель представляет собой row ID, который имеет следующий формат: НомерФайла:НомерСтраницы:ПозицияЗаписи.

На самом деле внутренняя нумерация у таблиц MSSQL для внутренних же целей исползуется, если разработчик не создал собственную, т.е. кластерный ПК.
А если создал, то в ссылках на записи используется именно он. И дальше в тексте это указано.


Если честно, то я мало понял что ты имел ввиду...

Оригинал в статье был таков:

автор писал:
In Figure 5.2, the reference is given through a row ID that
has the following format: file number:page number:row location. So, ID
1:13:5 indicates the fifth record in page 13 belonging to file number 1.


alexeyvg писал:
Да вообще там глупости написаны. Например:
"В SQL Server кластерный индекс является уникальным индексом по определению" :-))))


А дальше трудно было прочитать?

писал:
Это означает что все ключи записей должны быть уникальные. Если существуют записи с одинаковыми значениями, SQL Server делает их уникальными, добавляя номера из внутреннего (невидимого снаружи) счетчика. Рис. 4 иллюстрирует этот случай.


Вот текст оригинала:

писал:
In SQL Server 2000, a clustered index is a unique index by design,
which means that every key should be unique. While duplicates exist in the
index, they are made unique by the internal addition of a counter that
makes every key unique.


Рекомендую почитать все в оригинале. Он лежит на FTPишнике

MCSE: SQL Server™ 2000 Design Study Guide
Marc Israel, J. Steven Jones
Copyright © 2001 SYBEX Inc.
ISBN: 0-7821-2942-0

файл кажется называется sybex_229.pdf

Как правильно сказал Гладченко - все неточности перевода или ошибки в первоисточнике должны быть исправлены. Я лишь перевел одну главу указанной книги.
24 окт 03, 14:29    [391850]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
автор писал:
...a clustered index is a unique index by design...

Наверное лучше было бы перевести "выполнен(реализован) как уникальный индекс". Но уж всяко не как "уникальный по определению", по смыслу же не подходит.
24 окт 03, 15:26    [392025]     Ответить | Цитировать Сообщить модератору
 Re: Или я не прав? Insert вставляет куда попало...  [new]
Gena G
Guest
Вот что говорит Лингва:

писал:
by design
намеренно, умышленно
Syn: purposely , on purpose , intentionally


Но я перевел как это означает а не дословно :) by default что дословно переводится "неявно, по умолчанию" или оно же "по определению" - но и меет иное смысловой значение и сферу применения.

Хотя соглашусь, перевод наверное не лучший :)
24 окт 03, 17:42    [392416]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить