|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 10:45 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
[quot HandKot#22369108] uaggster Хренасе флэшбэки через, без малого, 15 лет! :-) видел на просторах инета еще такой вариант Код: sql 1. 2.
еще для краткости кода (select 1/0) можно заменить на 1/0 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:02 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
HandKot, класс какой! Возьму в копилку. У меня время немного другое получилось (199999 rows affected) Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0. SQL Server Execution Times: CPU time = 440 ms, elapsed time = 983 ms. (199999 rows affected) SQL Server Execution Times: CPU time = 438 ms, elapsed time = 1187 ms. Но всё равно - огонь. Жаль, работает с 2017, тогда, кажется STRING_SPLIT появилось. Кстати, возможно это самый быстрый и наименее ресурсоемкий вариант генерации последовательности 1...N ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:03 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
invm, там, кстати, и isNull лишние. И я даже знаю, откуда они взялись :-) Изначально там так было: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Но "улучшение", очевидно, бессмысленное, о чем я в свое время, и сказал разрабам. Низ поправили, а верх - нет :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:12 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Кстати, если их убрать - получается не все так однозначно: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
(1000000 rows affected) Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0. SQL Server Execution Times: CPU time = 1077 ms, elapsed time = 4423 ms. (1000000 rows affected) SQL Server Execution Times: CPU time = 625 ms, elapsed time = 5521 ms. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:26 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
uaggster Кстати, возможно это самый быстрый и наименее ресурсоемкий вариант генерации последовательности 1...N Примерно до 1 млн, а далее намного быстрее ваш код ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:31 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
uaggster получается не все так однозначно Я не просто так в переменную складываю. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 11:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Все придумано до нас. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:14 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов, Ага и каждый раз, для каждого пользователя/запроса запущенного ещё добавить операций чтения (а может ещё и записи в случае вставки в табличную переменную мульти-стейтмент функции). А если ещё эта функция вызывала в Код: sql 1. 2. 3. 4. 5.
или в чём-то подобном. Или если эта функция использована ещё в чём (в той же функции возврата списка дат по периоду) ... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:36 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
uaggster, Думаете надо было дать "настояться" до 15ти :) ?! Просто очередной холивар по работе возник сейчас. Оппонент как раз за мой старый вариант с мульти-стейтмент функцией и вставкой во временную таблицу топит по мотивам "что бы options не надо было писать". А я предпочитаю даже перед вызовом функции каждый раз коммент поставить. Так и в обычном CTE разрабочики могут забывать/не знать/ про это ограничение. Было бы лучше если бы МС дало бы встроенную (и не CLR) функцию для этого дела. На фоне остальных вариантов предпочитаю именно рекурсивный CTE (с учётом быстродействия, чтений-записей и т. п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:40 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
[quot Oleg_SQL#22369138] HandKot пропущено... видел на просторах инета еще такой вариант Код: sql 1. 2.
еще для краткости кода (select 1/0) можно заменить на 1/0 Ну и СплитСтринш не всегда был (даже .nodes для XML раньше появился вроде), но сомнительно что это быстрее. (select 1/0) вряд ли убрать получится из оконной функции, скорее можно просто написать (select 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:42 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK, А вариант с циклом Вам не подойдёт? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Oleg_SQL, Отличный вариант, спасибо, по чтениям и записям и CPU выигрывает Чуть код отформатировал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 12:56 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK, производительность запроса не оценивается количеством чтений. В случае использования таблицы чисел получить список дат очень легко: авторавторselect dateadd(day, numbers.nn, @StartDate) dd from dbo.numbers при том таблица числе может быть сформирована как угодно - неделя, месяц, квартал и так далее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 14:36 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов NIIIK, производительность запроса не оценивается количеством чтений. В случае использования таблицы чисел получить список дат очень легко: авторпропущено... при том таблица числе может быть сформирована как угодно - неделя, месяц, квартал и так далее. Владислав, этому посту 13 лет! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 15:03 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK по чтениям и записям и CPU выигрывает И какова методика тестирования, показавшая выигрыш по CPU? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 15:05 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
invm, https://gyazo.com/30ccc507f43addcdcf874ee23c137020 Такая устроит? А если хотите видеть запись сделайте мульти-стейтмент. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 15:32 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов, Производительность запроса оценивается операциями I/O, особенно если борешься именно с этим у убираешь циклы на Т-SQL и пишешь один запрос и легаси код меняешь из кучи вложенных multi-statement функций которые на каждый чих делают вставку в табличную переменную. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 15:34 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Кстати, бесит MS, уже бы сделал готовую функцию, как тот же string_split сделал (не прошло и 10+++ лет). Новый метод по производительности хорош, однако "в недрах string_split" всё равно идёт создание отельной строки для каждого случая которые могут быть ограничены внешними условиями и из 10к вернуться могут пару (или ноль) строк. Но всё равно этот костыль лучший, даже "продвинутый протез", просто надо иметь маленькую последовательность вызовов встроенных функций (а не постоянные итерации в рекурсии). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 15:38 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Кстати, бесит MS, уже бы сделал готовую функцию, как тот же string_split сделал (не прошло и 10+++ лет). В "правильной" базе такая функция не нужна. Равно как и string_split. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 16:40 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
aleks222, В правильной базе нет операций, часто связанных с внешними данными: - когда надо сгенерить отдельную запись для каждой даты из периода (причём для каждой записи отдельно) - когда надо заменить цикл на Т-SQL на обычный запрос - .... Вот, пример "от балды", стоит у вас, например, какая-то настройка у пользователя/продукта/... в духе "по умолчанию создавать 10 записей при таком-то действии" - вы как, одним insert-оператором вставляющем 10 строк напишите? Или будите в T-SQL цикле крутить? Или вообще, в цикле на клиенте? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 16:52 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Такая устроит? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 17:09 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK aleks222, В правильной базе нет операций, часто связанных с внешними данными: - 1) когда надо сгенерить отдельную запись для каждой даты из периода (причём для каждой записи отдельно) - когда надо заменить цикл на Т-SQL на обычный запрос - .... Вот, пример "от балды", стоит у вас, например, какая-то настройка у пользователя/продукта/... в духе "по умолчанию создавать 10 записей при таком-то действии" - вы как, одним insert-оператором вставляющем 2) 10 строк напишите? Или будите в T-SQL цикле крутить? Или вообще, в цикле на клиенте? 1) 100 лет = 30000 и, в большинстве случаев (101% таковых), не нужно, 2) про 10 я помолчу. Это не стоит функции - таблица справляется лучше и проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 17:12 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
invm, ага, набросил на вентилятор без внятного ответа и всё... я уже и начал забывать типичный СКЛ.Ру ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 17:30 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
aleks222, какие ещё 100лет ?! Вы к тест-кейсу с 10к значений? Так это простой тест-кейс. А объёмы берутся когда у тебя ЕТЛ-операции да и обычные запросы пользовательские по списку каких-то сущностей и для каждой из них до сделать какое-то перемножение. Чем "лучше" и "проще" использовать таблицу фейковую тупо ради строк ?! Вот надо вам будет расписание для списка каких-то сотрудников вывести (естественно колонки для ГУИ будут строками в вашем дата-сете) - вы что бы получить нужное количество строк будите делать выборки из реальной таблицы? А если такие расписания просматриваются одновременно многими пользователями в ГУИ ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 17:33 |
|
|
start [/forum/topic.php?fid=46&msg=40095899&tid=1684317]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
138ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 262ms |
0 / 0 |