|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Всем доброго времени суток ! :) Уже голову сломал с тревиальнейшей задачей :( Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример. Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш ! В некоторых хороших СУБД можно напиать так Код: plaintext 1.
и будет счастье. В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело. Как обойти эту проблему или как убрать ограничение на уровень рекурсии ??? Поиском пользовался. Толком ничего не нашёл к сожалению :( Буду благодарен за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:11 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKВсем доброго времени суток ! :) Уже голову сломал с тревиальнейшей задачей :( Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример. Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш ! В некоторых хороших СУБД можно напиать так Код: plaintext 1.
и будет счастье. В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело. Как обойти эту проблему или как убрать ограничение на уровень рекурсии ??? Поиском пользовался. Толком ничего не нашёл к сожалению :( Буду благодарен за помощь. Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:13 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. И какая же это проблемка ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:13 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Спасибо за столь быстрый ответ ! И что я не подумал что про CT в БОЛ можно почитать :( ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:23 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Не получается Код: plaintext
Использовать в табличной функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:35 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Извеняюсь, в неоторых надо писать Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:43 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
>Не получается >OPTION(MAXRECURSION 0) >Использовать в табличной функции. в multi-statement можно. в inline непосредственно в функции не получится. надо указывать maxrecursion в запросе из функции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKНе получается Код: plaintext
Использовать в табличной функции.Внутри inline функции и view действительно нельзя. А в multistatement function - можно. Если нельзя внутри, то всё равно можно - в SELECTе из этих объектов. Неудобно, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:51 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
авторSELECT TOP 400 number FROM master..spt_values WHERE type = 'P' Там таких записей 2048. Большее число - получается декартовым произведением. Наконец в некоторых хорошихъ базах данных всегда присутсвет табличка Number с числоми от ... и до... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 18:07 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
pkarklin авторSELECT TOP 400 number FROM master..spt_values WHERE type = 'P' Там таких записей 2048. Большее число - получается декартовым произведением. Наконец в некоторых хорошихъ базах данных всегда присутсвет табличка Number с числоми от ... и до... по моему вас не понятен вопрос. 1) вы предлагаете изначально кривой метод; 2) вы не можете управлять количаством строк через TOP, а можете изначально выбрать много записей, а потом поставить where ПОЛЕ < @Переменная, что так же кривой метод. Сейчас же вопрос стоит как написать табличную функцию, потому что: 1) хинт OPTION(MAXRECURSION 0) не работает в функциях 2) процедуру нельзя использовать функции (потому что процедура совсем не процедура, а кусок скрипта с входными/выходными параметрами) Нужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 11:57 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Не понимаю, а почему Вы не можете использовать конструкцию Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:34 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
авторпо моему вас не понятен вопрос. 1) вы предлагаете изначально кривой метод; Да что Вы говорите?! автор2) вы не можете управлять количаством строк через TOP, а можете изначально выбрать много записей, а потом поставить where ПОЛЕ < @Переменная, что так же кривой метод. Не знаю как Вы, я могу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Более того, с таким поздапросом (постоянной таблицей Number) обычно JOINятся по условию Код: plaintext 1.
авторНужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) Да ради бога, уже давно пора было написать, использовав за основу приведенный мною запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:36 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Нужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) И что мешает в функции в цикле добавить в табличную переменную нужное число записей ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:37 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
[quot pkarklin] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL). Но выбирать из левой таблицы надеюсь всё равно не прийдётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 14:21 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK[quot pkarklin] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL). Но выбирать из левой таблицы надеюсь всё равно не прийдётся.Под "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 14:44 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2008, 17:30 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как же она "не нужна", если вы собрались из нее выбираит записи ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2008, 17:32 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Glory NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как же она "не нужна", если вы собрались из нее выбираит записи ? Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 09:17 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход. По-моему, вы занимаетесь тофтологией. Все равно в результате действий вы получите объект, который будет занимать ресурсы. Если он заранее не занимает места в базе, значит он будет занимать больше процессорного времени при формировании и наоборот. А вы, по-моему, просто ищите метод с наименьшим программным кодом ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 10:04 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKЯ и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Хм, да, в общем-то, весь язык SQL и T-SQL, в частности, созданы и заточены именно для запросов из таблиц. Вы средой разработки не ошиблись? Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание. Понятия красоты, глупости и т.п. сильно отличаются в разных языках. Вы точно про SQL говорите? Или Вы хотите со своим уставом в чужой монастырь залезть? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 10:10 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Извиняюсь, совсем забыл что окончательное решение не выложено. Вспомнил случайно. Отдельное спасибо jap, daw и тем кот понял вопрос и дал ответы про Код: plaintext 1.
в multi-statement можно. в inline непосредственно в функции не получится. надо указывать maxrecursion в запросе из функции. Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2008, 17:23 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
На данный момент я стараюсь использовать in-line функцию и посторяю maxrecursion опцию каждый раз. Но у функций стоит "жирный" комментарий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2021, 16:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK, авторберём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Из таблицы чисел, разумеется. Вы же работаете с базами данных, а не с императивными языками. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2021, 22:33 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Хренасе флэшбэки через, без малого, 15 лет! :-) Я думал, эта тема до конца уже обсосана. Ну, если master..spt_values по каким то причинам брезгаете пользоваться, и длина генерируемой последовательности чем то ограничена (миллионом, миллиардом, етц.), то можно так: Код: 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. 30. 31. 32. 33. 34. 35.
Тем более что: SQL Server parse and compile time: CPU time = 11 ms, elapsed time = 11 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. (199999 rows affected) Table 'Worktable'. Scan count 2, logical reads 1199995, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 1032 ms, elapsed time = 1171 ms. (199999 rows affected) Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 489, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 312 ms, elapsed time = 367 ms. Completion time: 2021-09-08T10:46:47.6679671+04:00 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 09:47 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
uaggster Хренасе флэшбэки через, без малого, 15 лет! :-) видел на просторах инета еще такой вариант Код: sql 1. 2.
Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 10:15 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#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 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK без внятного ответа и всё... Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 18:02 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
а расскажите, что за магия в запросе "1/0"? как это работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 18:10 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK aleks222, какие ещё 100лет ?! Вы к тест-кейсу с 10к значений? Так это простой тест-кейс. А объёмы берутся когда у тебя ЕТЛ-операции да и обычные запросы пользовательские по списку каких-то сущностей и для каждой из них до сделать какое-то перемножение. Чем "лучше" и "проще" использовать таблицу фейковую тупо ради строк ?! Вот надо вам будет расписание для списка каких-то сотрудников вывести (естественно колонки для ГУИ будут строками в вашем дата-сете) - вы что бы получить нужное количество строк будите делать выборки из реальной таблицы? А если такие расписания просматриваются одновременно многими пользователями в ГУИ ? Вы не нервничайте - пользуйтесь. Если по-другому не умеете. Я для неокрепших умов, шобы не сбивались на скользкий путь. ЗЫ. 30000 int = 15 страниц в памяти. Можно сколько угодно вопить, но это лучше, чем грузить процессор. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 19:15 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
invm, Ох, дух Глори живёт на СКЛ.ру (может он ещё и сам живёт). Где был дан ответ на моё сравнение варианты с рекурсивным ЦТЕ и новым c string_split ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 19:45 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
spenov а расскажите, что за магия в запросе "1/0"? как это работает? Да никакой магнии, просто оконной функции надо что-то для сортировки, константу туда пихать не получается, чаще (select 1) вкорячивают, он тоже НЕ выполняется и в процессе выполнения нет ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 19:46 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
aleks222, О, опять ражигатель набрасывающий на вентилятор... У меня ум "окреп" ещё 13+ лет назад когда эта тема мной же создавалась. Что в то время это был костылище, что сейчас костыль, но получше, после появления функции парсящей строку. Только "по другому не умеете" - это скорее вам. Тот код с "with derevo" я создал вроде как сам, причём я тогда контролировал новый проект на МсСКЛе, хотя изначально пришёл в мир БД с Оракла. И как бы решил задачу :) А разработка тогда не была основной моей задачей. Но функции парсящей строку на тот момент в принципе не было. И мне как-то вариант новый больше нравится, чем козлячие методы с запросами реальных таблиц, перемножениями и т. п. Ещё больше бы понравилось бы, если бы МС дело сделал (а не тролей подкармливал защищающих его). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 19:50 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK У меня ум "окреп" ещё 13+ лет назад когда эта тема мной же создавалась. Ещё больше бы понравилось бы, если бы МС дело сделал (а не тролей подкармливал защищающих его). Шо, померимся у кого длиннее? Помогите написать функцию 17 лет. Просто я уж не полез ТОГДА в ЭТУ тему, ибо очевидное было фуфло. Сколько таких тем... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 20:01 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
aleks222, Ну это ваша нездоровая идея, а я сказал что уже в 2008ом у меня всё окрепло. Ох... опять превращаете полезный форум в СКЛсРУ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2021, 20:39 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK aleks222, Ну это ваша нездоровая идея, а я сказал что уже в 2008ом у меня всё окрепло. Ох... опять превращаете полезный форум в СКЛсРУ Пойми, страдалец, то, что тебе мерещится - не является истиной. Ибо 1. Генерация чисел занимает память (причем память НА КАЖДЫЙ вызов) и процессор НА КАЖДЫЙ вызов. 2. Чтение чисел из таблицы занимает ТОЛЬКО память. Причем одну и ту же. Т.е. 1 раз на всех. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2021, 07:15 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1684317]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
127ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 281ms |
0 / 0 |