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

Откуда: Moscow
Сообщений: 36972
Владислав Колосов
Гавриленко Сергей Алексеевич
пропущено...
"В данном случае не имеет". "Вообще" смысл бывает большой.

+1. Например для минимального протоколирования очень даже может иметь.
Это уже тонкости. Более очевидно, что порядок при вставке нужен для правильного логического вычисления всяких identity и прочих сиквенсов.
6 июн 17, 16:56    [20544150]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
WarAnt
Василиус,

автор
В моем случае "Тема" была просто очищена, т.к. в ней содержится конфиденциальная информация)

Об этом надо было догадаться?

Согласен, мой косяк, тут можно было бы расшифровку дать)

WarAnt
автор
Кроме того, если будет не 10, а 15000 строк, то такой вариант запроса не видится более дорогим? Подождем прятать апогей))

вы научились читать планы выполнения без построения самих планов, лучше самого сервера?

Я научился посмотреть порядок построения таблиц и, полагаю, что двухкратное увеличение строк, негативно может сказаться на стоимости выполнения запроса) Сделаем опытным путем замеры скорости? ;)

К сообщению приложен файл. Размер - 35Kb
6 июн 17, 17:00    [20544166]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Владислав Колосов
Василиус,

у сервера нет любимого порядка строк. Нет ни "снизу" ни "сверху". Правила процитировали выше.

В этом и проявляется странность T-SQL и не понятно по какой причине новые строки добавляются то вниз, то вверх таблицы. Выше это сакральное правило никто пока не приводил. Если вы знаете его, можете поделиться с нами? :)
6 июн 17, 17:10    [20544218]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Василиус
Владислав Колосов
Василиус,

у сервера нет любимого порядка строк. Нет ни "снизу" ни "сверху". Правила процитировали выше.

В этом и проявляется странность T-SQL и не понятно по какой причине новые строки добавляются то вниз, то вверх таблицы. Выше это сакральное правило никто пока не приводил. Если вы знаете его, можете поделиться с нами? :)
Нет, это просто кто-то не разумеет простую истину: если не предпринято никаких действий для обеспечения порядка, сервер волен вставлять данные в любое место таблицы и выбирать их в любом порядке.
6 июн 17, 17:17    [20544256]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
[quot Гавриленко Сергей Алексеевич]
Василиус
пропущено...
Нет, это просто кто-то не разумеет простую истину: сервер волен

Нет слов!))) Появился новый термин "по воле SQL"?))) А как жеж упомянутые выше "четкие правила"?)))
6 июн 17, 17:24    [20544278]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Строки не добавляются "вниз" или "вверх". Там нет ни низа ни верха. А на экран попадают в порядке выборки. Порядок выборки определяет оператор предложением ORDER BY или отдает серверу на его усмотрение.
6 июн 17, 17:24    [20544279]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
CREATE TABLE #Table ( id int , val varchar(10), ord int)

INSERT INTO #Table SElect 1, 'doc1', 1
INSERT INTO #Table SElect 2, 'doc2', 1
INSERT INTO #Table SElect 3, 'doc3', 1
INSERT INTO #Table SElect 4, 'doc4', 1

ALTER TABLE #Table ADD SomeTotal varchar(2000) null

INSERT INTO #Table SELECT 99,'',2 , 'Итого огого:' + CAST((SELECT COUNT(1) fROM #Table) as varchar(200))


SELECT val, someTotal FROM #Table ORDER BY CASE WHEN ORD = 1 THEN 0 ELSE 1 END
SELECT val, someTotal FROM #Table ORDER BY CASE WHEN ORD = 1 THEN 99 ELSE 1 END
6 июн 17, 17:27    [20544292]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Василиус
Появился новый термин "по воле SQL"?))) А как жеж упомянутые выше "четкие правила"?)))
Они вполне четкие. Просто чтобы их осознать, надо знать, в каких структурах сервер хранит данные и каким образом он с этими структурами может работать. Раз вы этого не знаете, просто запомните, что именно так, "по воле сервера", раз вы свою не соизволили проявить.

Сообщение было отредактировано: 6 июн 17, 17:28
6 июн 17, 17:28    [20544295]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
автор
А как жеж упомянутые выше "четкие правила"?)))

Если нет кластерного индекса, данные хранятся в куче. Куча - неупорядоченный набор записей.
Куда уж четче то?
6 июн 17, 17:29    [20544302]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Cammomile
CREATE TABLE #Table ( id int , val varchar(10), ord int)

INSERT INTO #Table SElect 1, 'doc1', 1
INSERT INTO #Table SElect 2, 'doc2', 1
INSERT INTO #Table SElect 3, 'doc3', 1
INSERT INTO #Table SElect 4, 'doc4', 1

ALTER TABLE #Table ADD SomeTotal varchar(2000) null

INSERT INTO #Table SELECT 99,'',2 , 'Итого огого:' + CAST((SELECT COUNT(1) fROM #Table) as varchar(200))

SELECT val, someTotal FROM #Table ORDER BY CASE WHEN ORD = 1 THEN 0 ELSE 1 END
SELECT val, someTotal FROM #Table ORDER BY CASE WHEN ORD = 1 THEN 99 ELSE 1 END

Данный пример в целом рабочий, но вновь для вывода общего количества добавляется отдельная колонка ord, она же участвует в сортировке. Но в предлагаемом мной примере, требуется, что бы строка с итогами вписывалась в существующие колонки таблицы и добавлялась к ним снизу, после их сортировки. Т.е. в том виде, как это обычно выглядит в отчете, строка "Итого" внизу последняя, а не сбоку. Можете предложить такой вариант, который несмотря на "волю сервера", произведет нужную сортировку при добавлении строк в таблицу? Или в данном случае без ещё одной временной таблицы не обойтись?

К сообщению приложен файл. Размер - 29Kb
6 июн 17, 17:53    [20544405]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Василиус
Можете предложить такой вариант, который несмотря на "волю сервера", произведет нужную сортировку при добавлении строк в таблицу?
Выберите другую СУБД или напишите свою, чтобы они обеспечивали порядок записей при выборке без указания order by.

Сообщение было отредактировано: 6 июн 17, 18:00
6 июн 17, 17:56    [20544421]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Cammomile
автор
А как жеж упомянутые выше "четкие правила"?)))

Если нет кластерного индекса, данные хранятся в куче. Куча - неупорядоченный набор записей.
Куда уж четче то?

Неупорядоченный говорите? А это тогда что, если не упорядоченное? В данных двух примерах, используется сортировка записей при добавлении в таблицу в одном случае по дате, в другом случае - по номеру регистрации. Как можно видеть, в обоих случаях, сортировка четко отрабатывает. Это и есть "куча"? Так вот ты какой неупорядоченный набор записей?)))

Повторюсь, что сортировка при выполнении инсерта в таблицу работает правильно в 10 из 10 проверенных мной опытным путем вариантов. Проблема не с сортировкой данных, а с добавлением новых строк в таблицу в зависимости от размера такой таблицы. Рассказы про "волю сервера" и "кучу" конечно, крайне поучительны и, порой, даже забавны, но какова их ценность для данного конкретного примера - не ясно.

Сортировка по дате (работает верно):

К сообщению приложен файл. Размер - 33Kb
6 июн 17, 18:06    [20544450]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Сортировка по номеру (так же работает верно):

К сообщению приложен файл. Размер - 34Kb
6 июн 17, 18:06    [20544451]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Василиус
какова их ценность для данного конкретного примера - не ясно.
Донести для упертых в танке, что запрос без явного указания сортировки, может выводить записи в любом порядке, даже если на первый взгляд кажется, что это не так.
6 июн 17, 18:12    [20544468]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Василиус
WarAnt
Василиус,

пропущено...

Об этом надо было догадаться?

Согласен, мой косяк, тут можно было бы расшифровку дать)

WarAnt
пропущено...

вы научились читать планы выполнения без построения самих планов, лучше самого сервера?

Я научился посмотреть порядок построения таблиц и, полагаю, что двухкратное увеличение строк, негативно может сказаться на стоимости выполнения запроса) Сделаем опытным путем замеры скорости? ;)


Да уж более странного способа определять производительность я еще не встречал:) не пробовали планы сравнить?
6 июн 17, 18:16    [20544478]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Василиус,

в пределах одной страницы вставкой с order by может быть и можно упорядочить, но если данные занимают несколько страниц, то сервер прочтет их так, как ему "удобно" и свой сортировки Вы не получите. Причем два дня вы будете видеть отсортированные данные а на третий случится конфуз.
6 июн 17, 18:23    [20544492]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Владислав Колосов
Василиус,

в пределах одной страницы вставкой с order by может быть и можно упорядочить, но если данные занимают несколько страниц, то сервер прочтет их так, как ему "удобно" и свой сортировки Вы не получите. Причем два дня вы будете видеть отсортированные данные а на третий случится конфуз.

Ок, конфуз никому не нужен, прошу критики этому варианту:
IF OBJECT_ID ('dbo.temp1', 'U') IS NOT NULL  
DROP TABLE dbo.temp1;  
GO  
IF OBJECT_ID ('dbo.temp2', 'U') IS NOT NULL  
DROP TABLE dbo.temp2;  
GO

select CONVERT(varchar(10), t_CardDoc.f_dtStart, 103) [Дата], t_CardDoc.f_AutoNumber [Номер], 'Научный трактат о воле сервера SQL' [Тема документа]
into dbo.temp1
from t_CardDoc
where t_CardDoc.f_ControlType=40
order by t_CardDoc.f_dtStart
go

select '' a,'' b,'Всего документов: '+CONVERT(varchar(10),(select count(*) from dbo.temp1)) c
into dbo.temp2
go

select *
from dbo.temp1
union all
select *
from dbo.temp2
go

Выглядит вроде нарядно:

К сообщению приложен файл. Размер - 26Kb
6 июн 17, 18:38    [20544537]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
o-o
Guest
Васисуалий, утомил
6 июн 17, 18:44    [20544546]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Да вроде бы все объяснили, теперь человеку нужно получить собственный опыт для закрепления.
6 июн 17, 18:52    [20544568]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
[quot WarAnt]
Василиус
пропущено...
Да уж более странного способа определять производительность я еще не встречал:) не пробовали планы сравнить?

Нет, мне хватило ознакомления со структурой предложенного запроса) что бы сравнить планы, нужно предложенный вариант адаптировать для БД и напустить для наглядности на 100 тыс.записей. Не вижу смысла, зачем это делать, если вариант, прямо скажем, далек от решаемой задачи? Только если ради интереса? Кому оно надо? Мне - нет) тем более, что и тема про другое)

Раз критики по сути больше нет, значит "результат закрепили" и со спокойной душой закроем темку? :)
6 июн 17, 19:15    [20544612]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Василиус
Раз критики по сути больше нет, значит "результат закрепили" и со спокойной душой закроем темку? :)
Да на здоровье. Никто вам не может запретить ходить по собственноручно разбросанным граблям. Ходите и набивайте шишки, мы не против.
6 июн 17, 20:12    [20544719]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Парни, по-моему это какая-то троллота из ранее забаненных. Тут, очевидно, толкового разговора не будет. Предлагаю покинуть топик и не кормить тролля.
6 июн 17, 21:45    [20544900]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1367
Cammomile,

+

чесно сказать прямо с первого поста топика подумал на клон sql_user2


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

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


Тут по логике ТС мы походу на стадии зарождения ИИ. сервер сам будет решать когда и какой запрос ему выполнять, отдавать ли данные клиенту или буферизовать их в вакууме
6 июн 17, 23:17    [20545110]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
o-o
Guest
нет, последний известный клон sql_user2 это сникерс.
а это Васисуалий Лоханкин и его пятистопный ямб апогей
"я научился посмотреть порядок построения таблиц"
6 июн 17, 23:27    [20545127]     Ответить | Цитировать Сообщить модератору
 Re: Как в конце таблицы вывести итоговое значение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
+
Нет, это не шпана имени sql_user2. Ну или таки они проксю освоили.


Сообщение было отредактировано: 7 июн 17, 00:24
7 июн 17, 00:24    [20545253]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить