Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Добрый день!
Подскажите плиз решение задачи.
Есть некая временная таблица, в которую записываются данные запроса через select into table.
Как следствие, на данный момент временная таблица не имеет никакого синтетического PK, так как в 99% случаев он не требуется.
Но в одной из задач потребовалось проапдейтить колонку временной таблицы.
Не хотелось бы для этой задачи вводить identity у временной таблицы, или другим способом нумеровать строки (затраты на вставку идентификатора неоправданы, так как в 99% случаев он не нужен). В Oracle я могла бы рассчитывать на update where rownum = :текущий rownum (в рамках сессии по крайнем мере).
Есть ли аналогичный способ в MS SQL?
11 июл 11, 02:52    [10953552]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
То есть, есть ли в MS SQL встроенный идентификатор, однозначно идентифицирующий строку хотя бы в рамках сессии?
11 июл 11, 02:53    [10953553]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Зачем? UPDATE и так изменит вам нужные столбцы.
11 июл 11, 06:19    [10953592]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kateryne
временная таблица не имеет никакого синтетического PK, так как в 99% случаев он не требуется.
PK должен быть всегда
Kateryne
Не хотелось бы для этой задачи вводить identity у временной таблицы
Почему? Похоже на каприз.
Kateryne
затраты на вставку идентификатора неоправданы, так как в 99% случаев он не нужен
Дайте, пожалуйста, оценку этих затрат.
Kateryne
В Oracle я могла бы рассчитывать на update where rownum = :текущий rownum (в рамках сессии по крайнем мере).
Есть ли аналогичный способ в MS SQL?
Есть. ROW_NUMBER() в CTE, который надо апдейтить.
11 июл 11, 09:30    [10953849]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Смысл такой: есть один модуль программы, который вставляет по достаточно сложному (но не очень ресурсоемкому) правилу данные в ВТ (временную таблицу). При ее расчете в том числе используются данные, отсутствующие в БД.
Есть куча других модулей, для которых данные в ВТ являются базовыми для собственных расчетов и отчетов (ВТ выбрана, так как ее удобнее джойнить с таблицами внешних модулей).
Хочет сформировать пользователь отчет - дергает процедуру, записывающую данные в ВТ, а отчет уже использует ВТ.
Надо отработать под другим пользователем алгоритму некоему - алгоритм тоже дергает эту же процедуру.
Но при определенных условиях надо пометить несколько строк в этой ВТ. Причем, предположим есть две одинаковых строки. Дошли до первой из них - вызвали внешний модуль (не БД), рассчитали значение по данным строки - получили число 1.
Перешли на вторую строку - все то же, но так как внешние условия поменялись, то для тех же условий строки 2 получили число 0.
Так вот, в первой строке должно быть записано 1, во второй 0. А строки одинаковы.

iap
Есть. ROW_NUMBER() в CTE, который надо апдейтить.


row_number() - насколько я понимаю, это просто нумерация строк запроса, аналог rownum Oracle, а не rowid. Так? Или я не права?

То есть если написать код вида:

select field, row_number() from table where условие1

а потом в цикле (не T-SQL, внешней программы), но в той же сессии (временная таблица еще доступна)
сделать
цикл по результам запроса
update table set field = :value where row_number() = :row_number
конец цикла по результам запроса

то мы получим полную ерунду, так?

iap
PK должен быть всегда

Для постоянной таблицы - бесспорно (и я тоже сторонник синтетических ключей)
Для временной таблицы, созданной исключительно для ускорения и упрощения сложных расчетов, где играют роль и доли секунд, которые отнимет на вставке и получения id для большого количества строк, но в 99% мест в приложении - данные таблицы не апдейтятся вообще, а только используются в джойнах или агрегируются в отчетах - нафик?

iap
Дайте, пожалуйста, оценку этих затрат.

тесты проводились. Скорости падает до 5-10% на вставке. Учитывая специфику бизнеслогики (вызов алгоритма частый и реалтаймовый) затраты с текущим объемом базы на грани приемлимого - то есть можно на это пойти, но лучше избежать.

tpg
Зачем? UPDATE и так изменит вам нужные столбцы.

Нет, если нужно отделить уже обработанные алгоритмом, расположенным вне СУБД, строки от необработанных, при условии что строки идентичны во всем, но их более одной.
13 июл 11, 18:09    [10969434]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Kateryne
тесты проводились. Скорости падает до 5-10% на вставке. Учитывая специфику бизнеслогики (вызов алгоритма частый и реалтаймовый) затраты с текущим объемом базы на грани приемлимого - то есть можно на это пойти, но лучше избежать.
Для вставки может быть (для таблицы с 1-м полем), но во всём вашем алгоритме эжто будет тысячная доля процента.

По любому, проапдэйтить неизвестную запись нельзя. Просто добавьте такой же ид строки, как в оракле - придётся на это пойти.
13 июл 11, 18:19    [10969504]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Скорость нужна как раз на вставке, так как она очень часть происходит, в том числе в местах реалтаймовых. ВТ-то единая на всю систему. Мы именно вставку меряли.
13 июл 11, 18:45    [10969696]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Т.е. псевдостолбца в MS SQL нет как класса? Ок, жаль. Понятно.
13 июл 11, 18:45    [10969700]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kateryne
Т.е. псевдостолбца в MS SQL нет как класса? Ок, жаль. Понятно.
Типа, чтобы уже, по вашей же логике, вставка была замедленна вообще во всех случаях этим псевдо-столюцом?
13 июл 11, 18:47    [10969713]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Ну у Oracle же почему-то не замедляется по сравнению с MS SQL :)
13 июл 11, 18:49    [10969737]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kateryne
Ну у Oracle же почему-то не замедляется по сравнению с MS SQL :)
Так он уже с самого начала замедлен.

И вообще, зачем вы с этой убогой СУБД связались? Делайте на Оракле сразу.
13 июл 11, 18:50    [10969748]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
СУБД неплохая, где вы видите холивары от моего имени в пользу Oracle? Просто была надежда, что в скуле есть такая фича, которая есть в Oracle, а я просто про это не знаю.
Я конечно больше симпатизирую Oracle, да - первая СУБД, первая любовь :) Но и у MS SQL я вижу плюсы по сравнению с Oracle - особенно в части оракловых инсталляторов скуль смотрится привлекательнее
Скажем так - для меня MS SQL до сих пор просто непривычен. А для вас, я так понимаю, был бы непривычен Oracle.
Ну а выбор СУБД обусловлен инфраструктурой других приобретенных предприятием систем, которые с другими СУБД не работают.
13 июл 11, 18:55    [10969788]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Дошли до первой из них - вызвали внешний модуль (не БД), рассчитали значение по данным строки - получили число 1.
Перешли на вторую строку - все то же, но так как внешние условия поменялись, то для тех же условий строки 2 получили число 0.

Вот эти вот "дошли"/"перешли" - это курсор у вас что ли ?

use tempdb
go 
if object_id('dbo.testtable') is not null drop table dbo.testtable
go
create table dbo.testtable(f1 varchar(10))
go
insert dbo.testtable values('a')
insert dbo.testtable values('a')
insert dbo.testtable values('a')
insert dbo.testtable values('a')
insert dbo.testtable values('a')
go
select * from dbo.testtable
go
DECLARE mycursor CURSOR FOR 
SELECT f1 FROM dbo.testtable

OPEN mycursor

FETCH NEXT FROM mycursor 
UPDATE dbo.testtable SET f1='b' WHERE CURRENT OF mycursor
FETCH NEXT FROM mycursor 
FETCH NEXT FROM mycursor 
UPDATE dbo.testtable SET f1='b' WHERE CURRENT OF mycursor
FETCH NEXT FROM mycursor 

CLOSE mycursor
DEALLOCATE mycursor
go
select * from dbo.testtable
go
13 июл 11, 19:00    [10969815]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Не, увы не курсор. :( Зачитывается порция строк, передается внешнему модулю - не T-SQL, там производится расчет и в расчете уже апдейтятся строки. Перевести расчет на T-SQL не представляется возможным в принципе.
13 июл 11, 19:03    [10969829]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
передается внешнему модулю - не T-SQL, там производится расчет и в расчете уже апдейтятся строки.

И как же этот внешний модуль апдейтил записи без ключа ? как он их различал ?
13 июл 11, 19:06    [10969838]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
До определенного изменения бизнес-логики такой фигни не предусматривалось. Строки считались уникальными по одному из сочетаний полей (объект + дата-время).
13 июл 11, 19:09    [10969851]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Если в рамках сессии, то я бы создал вторую временную таблицу с ключом и пустым слобцом для новых значений. Засунул бы в эту таблицу порцию для апдейта, отдал внешнему модулю, проапдейтил по ключу, а потом проапдейтил основную временную таблицу на основе уже проапдейченой второй.
13 июл 11, 19:14    [10969868]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Kateryne
Ну у Oracle же почему-то не замедляется по сравнению с MS SQL :)
Оракл замедляется - у него же есть этот столбец независимо от вашего желания. Как не замедляться-то - чудес не бывает, за всё надо платить.

И не "псевдо" столбец, а совершенно реальный.
Псевдо - это когда на диске не расходуется.
Kateryne
Мы именно вставку меряли.
Вот я вам на это и намекаю. Ваша курсорная обработка по любому займёт в тыщу раз больше ресурсов, чем этот столбец.
13 июл 11, 19:26    [10969898]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Kateryne
Не, увы не курсор. :( Зачитывается порция строк, передается внешнему модулю - не T-SQL, там производится расчет и в расчете уже апдейтятся строки. Перевести расчет на T-SQL не представляется возможным в принципе.
Ага, и как же они апдэйтятся, если у них ПК нету, если они все одинаковые??? :-)
igor2222
а потом проапдейтил основную временную таблицу на основе уже проапдейченой второй.
И как это сделать, если строки идентифицировать нельзя?
13 июл 11, 19:30    [10969905]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Заведите себе идентитики и pk/uq по нему
13 июл 11, 19:41    [10969930]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Kateryne
Member

Откуда:
Сообщений: 351
alexeyvg
Вот я вам на это и намекаю. Ваша курсорная обработка по любому займёт в тыщу раз больше ресурсов, чем этот столбец.

Увы, не то. Дело в том, что метод-то вставки один на кучу мест. И если в нашей курсорной обработке действительно скорость не важна, то в других местах - слабое место как раз вставка.
Делать опцию не хочется - получится, что от места вызова метода зависит, какие столбцы в ВТ. Нехорошо, рано или поздно налетим.
13 июл 11, 19:52    [10969955]     Ответить | Цитировать Сообщить модератору
 Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
alexeyvg
Оракл замедляется - у него же есть этот столбец независимо от вашего желания.

Псевдо столбец, потому как
alexeyvg
И не "псевдо" столбец, а совершенно реальный.

именно никакой не а реальный, а псевдо: 10-байтовое значение, указывающее на физический адрес хранения записи
  • bits 1 to 32 (bytes 1 to 4): data object id (0-4294967295)
  • bits 33 to 44 (byte 5 and half byte 6): file number inside the tablespace (0-4095)
  • bits 45 to 64 (half byte 6 and bytes 7 and 8): block number inside the file (0-1048575)
  • bits 65 to 80 (bytes 9 and 10): row number inside the block (0-65535)

  • alexeyvg
    Псевдо - это когда на диске не расходуется.

    соответственно, никакого места на диске под хранение rowid не расходуется.
    Но, идентифицикация записи по rowid имеет ряд "но".
    14 июл 11, 06:17    [10971029]     Ответить | Цитировать Сообщить модератору
     Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31959
    Сон Веры Павловны
    Псевдо столбец, потому как
    А, понятно; действительно, нету накладных расходов.

    Но тогда ведь этот rowid не идентифицирует запись, и значит был-бы непригоден для целей автора, если строго подходить...
    Он же может поменяться, как я понимаю...

    Ну да, вот и по ссылке про это.
    14 июл 11, 08:47    [10971139]     Ответить | Цитировать Сообщить модератору
     Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
    рпав
    Guest
    Не совсем в тему, но всё же
    technet: SQL Server for Oracle Professionals
    14 июл 11, 11:48    [10972272]     Ответить | Цитировать Сообщить модератору
     Re: Аналог rowid Oracle или любой идентификатор строки таблицы для апдейта таблицы без PK  [new]
    Kateryne
    Member

    Откуда:
    Сообщений: 351
    Да не, оракловый как раз подошел бы. Ну какие шансы, что именно в момент апдейта в_той_же сессии, произойдет физическая реорганизация временной таблицы? Ровно нулевые.
    14 июл 11, 12:57    [10973014]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить