Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Philin Member Откуда: г. Иркутск Сообщений: 162 |
Требуется создать таблицу, в которой содержались бы числа от @LeftBorder до @RightBorder. Я нашел 2 способа:
2 способ плох тем, что уж очень он медленный.... Может кто знает еще какой способ? |
|
26 ноя 04, 07:00 [1137161] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Самый быстрый: 1) Создаем постоянную таблицу Numbers с числами от 0 до максимально возможного значения @RightBorder-@LeftBorder. 2) SELECT Number+@LeftBorder FROM Numbers WHERE Number<=@RightBorder-@LeftBorder быстрее только создать постоянную таблицу Numbers с числами от 0 до максимально возможного значения @RightBorder. |
26 ноя 04, 07:46 [1137199] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
Можно так, если нужна небольшая таблица. ( до 100000 значений время исполнения < 500 ms )
|
|
26 ноя 04, 07:50 [1137201] Ответить | Цитировать Сообщить модератору |
Philin Member Откуда: г. Иркутск Сообщений: 162 |
to aleks2 > 1) Создаем постоянную таблицу Numbers с числами от 0 до максимально возможного значения @RightBorder-@LeftBorder. как создаем-то? это же и есть мой вопрос... to VladRUS.ca > поставил @RightBorder = 20000 и ваша фнкция работала 17 секунд.... при этом скрипт, приведенный мною во 2 способе отработал менее чем за 10 секунд... что все равно чересчур МЕДЛЕННО |
26 ноя 04, 08:09 [1137220] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
Это только первый раз медлено, потомучто фунция должна откомпелироваться |
26 ноя 04, 08:13 [1137226] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
У меня на 20000 уходит 250 ms |
26 ноя 04, 08:17 [1137235] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
|
||
26 ноя 04, 08:31 [1137254] Ответить | Цитировать Сообщить модератору |
sti Member Откуда: Сообщений: 769 |
Какая разница, 17 или 10 сек, если надо ее только 1 раз создать? На обсуждение куда больше времени ушло :) |
||
26 ноя 04, 08:45 [1137270] Ответить | Цитировать Сообщить модератору |
Лео Member Откуда: Москва Сообщений: 207 |
Вот:
|
|
26 ноя 04, 09:00 [1137312] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
To Leo: Проверте скорость на генерацию 50000 значений. Ваша работает около 3800 ms моя 360 ms
|
|
26 ноя 04, 09:12 [1137327] Ответить | Цитировать Сообщить модератору |
Philin Member Откуда: г. Иркутск Сообщений: 162 |
Всем спасибо... насчет готовой таблицы натуральных чисел от 0 до 1 000 000 000 в базе я как-то даже не подумал... to VladRUS.ca действительно все работает быстро.... разбираюсь в вашей функции... вам отдельное за нее спасибо! |
26 ноя 04, 09:17 [1137339] Ответить | Цитировать Сообщить модератору |
Лео Member Откуда: Москва Сообщений: 207 |
Результаты измерений. Метод 1. готовая таблица на 1000000 --SET @LeftBorder = 150000 --SET @RightBorder = 200000 --время 2173 --SET @LeftBorder = 10000 --SET @RightBorder = 60000 --время 2233 причем при росте таблицы время должно расти Метод 2. исполнение текстовой строки. --SET @LeftBorder = 150000 --SET @RightBorder = 200000 --время 2173 --SET @LeftBorder = 10000 --SET @RightBorder = 60000 --время 263 Метод 3. функция --SET @LeftBorder = 150000 --SET @RightBorder = 200000 --время 423 --SET @LeftBorder = 10000 --SET @RightBorder = 60000 --время 423 В общем все зависит от задачи, но ф-ция по моему изящнее. |
26 ноя 04, 09:31 [1137382] Ответить | Цитировать Сообщить модератору |
saint Member Откуда: Архангельск Сообщений: 2262 |
to VladRUS.ca Смею заметить, на Ваша функция не работает по крайней мере на одном промежутке 155 - 160. А вот эта конструкция:
|
|
26 ноя 04, 09:57 [1137474] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
А индекс на таблицу? Сканировать нечестно... |
26 ноя 04, 09:59 [1137488] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
Я ее не тестировал но похоже что Вы правы. Она не работает до 9.
|
||||
26 ноя 04, 10:05 [1137513] Ответить | Цитировать Сообщить модератору |
saint Member Откуда: Архангельск Сообщений: 2262 |
Разобрался с мистикой power. Поздравляю, гениальный код! Ошибка похоже действительно только в первой десятке. Однако есть еще другой подводный камень - как интересно будет работать функция, если ее вызвать из SP, допустим. |
26 ноя 04, 10:13 [1137544] Ответить | Цитировать Сообщить модератору |
гостьььь
Guest |
Иногда гениальность конечно трактуют как нечто сродни идиотизму... Рекурсия то там зачем? |
26 ноя 04, 10:42 [1137696] Ответить | Цитировать Сообщить модератору |
Valer Member Откуда: Сообщений: 278 |
может просто создать таблицу с 1 колонкой int, сделать ее счетчиком с нужным начальным значением = @LeftBorder и в цикле закатать число записей =@RightBorder - @LeftBorder |
26 ноя 04, 12:33 [1138350] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
Исправленная функция (HotFix1: @NumValues < 10 ):
To:гостьььь Рекусионный вызов равен всего:len(@NumValues) - 1 To:saint >... как интересно будет работать функция, если ее вызвать из SP, допустим. Правельное замечание. Надо подумать |
|
26 ноя 04, 15:45 [1139473] Ответить | Цитировать Сообщить модератору |
LR Member Откуда: 8P8C Сообщений: 2423 |
Как бы его поизящнее "размножить" записи? |
26 ноя 04, 16:52 [1139823] Ответить | Цитировать Сообщить модератору |
VladRUS.ca Member Откуда: Toronto Сообщений: 1172 |
Вариант учитываюший вызов из SP
|
|
26 ноя 04, 21:19 [1140614] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вот имхо один и самых быстрых запросов. Ибо оптимизирован для того, чтобы серверу удобнее было производить вычисления. Как ни странно это звучит для при виде выражений в where
|
|
29 ноя 04, 10:24 [1142669] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Даешь ускорение самого быстрого:
нет предела совершенству... Вы что, ребяты, всерьез считаете, что деление быстрая операция? |
|
29 ноя 04, 12:18 [1143281] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы что, ребяты, всерьез считаете, что деление быстрая операция? Деление на степень 2-ки есть сдвиг байта на один разряд вправо. |
29 ноя 04, 12:21 [1143295] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ну ладно, вот еще быстрее сортировку я убрал, дабы сосредоточиться на генерации... по Profiler-у от 10 до 560000 оригинал _nums_1 CPU 3415 Duration 4763 без деления _nums_2 CPU 2534 Duration 4356
|
|
29 ноя 04, 13:44 [1143737] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |