Re: Вопросы не для собеседования 1 | |
---|---|
Prudivus Сообщений: 4283 Откуда: Кишинев Дата регистрации: 14.12.2006 |
Цитата:Формально - да. |
Re: Вопросы не для собеседования 1 | |
---|---|
leonid Автор Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Таблица такая
|
Re: Вопросы не для собеседования 1 | |
---|---|
Prudivus Сообщений: 4283 Откуда: Кишинев Дата регистрации: 14.12.2006 |
Леонид, таблица правильная. По комментарию: сначала, видимо, считается сумма (по количеству) нарастающим итогом (в вашем варианте - без учета текущей строки)...
Теперь приведу свой вариант (MS SQL). Извиняюсь, срочная работа, комментарии, если надо, будут позже.
|
Re: Вопросы не для собеседования 1 | |
---|---|
s28091973 Сообщений: 287 Дата регистрации: 05.04.2001 |
реально конечно круть. Вопрос, а разбивка на подзапросы не ускорит случаем время выполнения
|
Re: Вопросы не для собеседования 1 | |
---|---|
leonid Автор Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Интересно, а умеет ли MS SQL оптимизировать такие запросы? Если нет, то при нескольких тысячах записей в каждой из таблиц такой запрос совсем загнется. А если умеет, интересно было бы посмотреть, как он этот запрос преобразует перед выполнением (на MS SQL такое можно посмотреть? На DB2 можно). Вообще было бы интересно сравнить оба варианта по скорости. Что-то мне сдается, что на больших и средних таблицах мой вариант будет значительно побыстрее.
|
Re: Вопросы не для собеседования 1 | |
---|---|
s28091973 Сообщений: 287 Дата регистрации: 05.04.2001 |
И я о том же
|
Re: Вопросы не для собеседования 1 | |
---|---|
Prudivus Сообщений: 4283 Откуда: Кишинев Дата регистрации: 14.12.2006 |
Цитата:Ускорит, именно на больших объемах - сильно ускорит. В рабочей процедуре сначала вычисляются итоговые суммы (нарастающие итоги), а затем уже идет расчет связей. Ну и, кроме того, в рабочей версии идет соединение по коду товара и складу, в некоторых случаях еще дополнительные условия. |
Re: Вопросы не для собеседования 1 | |
---|---|
leonid Автор Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
А, стало быть условие уложиться в один селект было чисто академическим. Вообще при больших объемах суммы лучше считать не селектом, а создавать курсор и пробегать по нему последовательно. Тогда текущая сумма будет складываться из двух значений: текущего значения и суммы от предыдущего, а не как в селекте как сумма всех предыдущих значений (собственно именно на это обращал внимание ssa). Но писать такое, конечно, намного муторнее.
|
Re: Вопросы не для собеседования 1 | |
---|---|
Prudivus Сообщений: 4283 Откуда: Кишинев Дата регистрации: 14.12.2006 |
leonid
Не просто муторнее, а практически нереально (тормоза - жуть) в хранимых процедурах на MS SQL. Но - голь на выдумки хитра ;) - есть другие методы. Например:
|
Re: Вопросы не для собеседования 1 | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
Для сравнения - процедура расчета услуг на курсорах работает 22 часа, на селектах - 2.5 минуты. Недавно переписывал чужие труды Курсоры - ориентировочно до 1000 записей...
Использовать подзапросы выгодно тогда, когда объем результата значительно меньше основной таблицы. Хотя бы раз в 10. Кроме того, я эмпирически получил некое соотнешение 1 гигабайт на 1 миллион Гигабай оперативки, миллион записей. Если превысить в какой-либо операции этот объем, MS SQL загибается на составных селектах. Поздапросы использовать более выгодно и вместо джойна с фильтром, также быстрее работает. ------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. |
Re: Вопросы не для собеседования 1 | |
---|---|
leonid Автор Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Я знаю, что курсоры работают медленее, но в том примере, о котором я говорил, при использовании курсоров нужно провести значительно (в тысячи раз) меньше операций, чем при использовании селекта. За счет этого может быть выигрыш. А реально это узнать можно только проверив. Цитата:Не знаю, как MS SQL, давно на нем не работал, уже забыл все, а DB2, перед тем, как выполнить запрос, практически всегда заменяет подзапрос на джойн с фильтром. |
© 2000-2024 Fox Club  |