|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Подскажите почему не компелится следующая процедура? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2005, 23:10 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
в своё время детали обсасывались в http://groups.google.com/groups?hl=ru&lr=&group=comp.databases.ibm-db2 и в ibm-овской ньюсгруппе. Я не запомнил, ибо мне не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2005, 23:39 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 10:48 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Почему вам не хватает запросов с WITH и табличных SQL-функций? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 20:07 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
спасибо Astron Victor MetelitsaПочему вам не хватает запросов с WITH и табличных SQL-функций? Просто нужно сделать такую вещь: процедура 1 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
процедура 2 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 22:44 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
А почему вам это надо сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 23:22 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Наверное, вам платят построчно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 23:25 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Victor MetelitsaНаверное, вам платят построчно. ну если вы видите другой вариант то подскажите плз. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2005, 23:45 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Попробуй так: Код: 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.
Мне лично интересно, как в PROC2 узнать, создана ли уже временная таблица, если нет, то создать. Т.е. типа (MS SQL): IF object_id('tempdb..t') IS NULL THEN DECLARE GLOBAL TEMPORARY TABLE t (i INTEGER); END IF; Если кто знает - подскажите, плз. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 17:59 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Проверил, вот так работает: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 18:12 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
divp Victor MetelitsaНаверное, вам платят построчно. ну если вы видите другой вариант то подскажите плз. ??? SELECT * FROM table1 ORDER BY i (возможно, вместе с ROWNUMBER()) SP, да еще с temporary table - это мазохизм какой-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 20:22 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Victor Metelitsa divp Victor MetelitsaНаверное, вам платят построчно. ну если вы видите другой вариант то подскажите плз. ??? SELECT * FROM table1 ORDER BY i (возможно, вместе с ROWNUMBER()) SP, да еще с temporary table - это мазохизм какой-то. хм а почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 20:55 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Ага, понял - вы надо мной насмехаетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 22:41 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Victor MetelitsaАга, понял - вы надо мной насмехаетесь. Почему? Возможно, целью стоит засадить сервер в idle на веки вечные, и выбить под это денег на новое железо, как знать? Я бы посоветовал NOT LOGGED заменить на просто LOGGED, для начала. Есть еще много способов, но самый лучший - устроить бардак с локировками, к сожалению к примеру не подходит :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2005, 23:11 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Victor MetelitsaАга, понял - вы надо мной насмехаетесь. Как Вы могли такое подумать? После стольих ваших правильных советов у меня просто язык не повернется :) Вопрос конечно прояснил ak@ но хотелось бы узнать как можно проверить создана ли временная таблица или нет... как долго и в каких рамках ограничена "жизнь" временных таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 01:39 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Так я спрашивал - зачем вы делаете то, что делаете? Зачем вам вообще нужны хранимые процедуры? Зачем нужны временные таблицы? Почему нельзя просто сделать выборку (SELECT, WITH, табличная функция), а нужно изощряться - куда-то что-то пихать, курсоры туда-сюда передавать? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 07:26 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
я склонен согласится с Виктором... Задача выглядит только как спортивный интерес, а не как реальная задача. Хотя, в презенташке SP Profiling я встречал похожий синтаксис с пояснениями. Ну там то понятно - учат. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 09:34 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
я пока что знаю только один способ посмотреть структуру временной таблицы: describe select * from session.<table> Дело в том, что о временной таблице не существует никаких данных в системном каталоге. (В сущности правильно - нафига шоркать по каталогу?) Хотя - из всего можно выкрутиться... При желании конечно. 1) Создать временную таблицу, в которой будет описание других времменных таблиц (ну хотябы перечень). 2) Юзать таблички с опцией REPLACE - чтоб было без разницы - создал ее или не создал. Объявил - перезаписалась. 3) Наехать на IBM. Пусть покажет как работать с временными таблицами. Ведь сервак-то знает и структуру таблиц и их индексы. Ток как мне кажется у IBM еще руки не дошли до этого. А может они сомневаются - нужно ли это юзеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 10:53 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
М-да, запинать кого-то легко. Попробую объяснить, почему я лично использовал такой подход в MS SQL и вот сейчас пытаюсь искать аналогии. В программировании есть такое понятие "рефакторинг". И одним из самых наиболее используемых методов рефакторинга является "выделение метода" (пардон за каламбур). И я являюсь противником дублирования кода. Поэтому и на стороне клиента и на стороне сервера приложений и в БД старательно его избегаю, проводя время от времени это самое выделение метода. И если на стороне клиента/сервера приложений методы в качестве параметров чаще всего имеют переменные простого типа либо инстансы класса, то в СУБД, которая по определению "заточена" под работу с набором объектов, т.е. строк, вполне логично передавать наборы данных через временные таблицы. Перетаскивание же данных на сервер приложений и последующая их обработка там приводит к потере производительности. Простой пример - сводный отчет по абонентам связи: результат отчета есть небольшая матрица с суммами и средними значениями, а данных под этим отчетом кроется очччень большой объем. To gardenman: спасибо за подсказку с использованием врем. таблицы, но это не очень есть хорошо, поскольку иерархия вызовов может быть разной. Поэтому и WITH REPLACE не подходит (затрет все на фиг). Вот если бы был еще хинт WITH NOREPLACE :) было бы то, что надо. До IBM достучаться пока не могу. До августа саппорт у них в отпуске. Как только объявятся - постараюсь прояснить. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 13:23 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
вот-вот - как раз у разработчиков MSSQL я встретил процедуру с обалденным количеством temporary table. Поскольку мне это мигрировать надо будет, буду разбираться, но чать уже выкинута за ненадобностью. С остальными будем посмотреть (по мере появления понимания) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 13:41 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
2 ak@ А почему бы не поступить просто - пытаешься создать временную таблицу - и обработать исключение. Кстать GTT по у молчанию как раз и есть WITH NO REPLACE Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 14:09 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
ak@М-да, запинать кого-то легко. Я не запинывал, а просто спросил. Вдруг что-то интересное узнаю? Попробую объяснить, почему я лично использовал такой подход в MS SQL и вот сейчас пытаюсь искать аналогии. У меня тоже есть объяснение - или предположение, по крайней мере. Сводится оно к тому, что SQL и/или блокировочный механизм на MS SQL убог настолько, что разработчикам приходится действовать через ж. Но на DB2 нет необходимости пользоваться тем же подходом. В программировании есть такое понятие "рефакторинг". И одним из самых наиболее используемых методов рефакторинга является "выделение метода" (пардон за каламбур). И я являюсь противником дублирования кода. Поэтому и на стороне клиента и на стороне сервера приложений и в БД старательно его избегаю, проводя время от времени это самое выделение метода. И если на стороне клиента/сервера приложений методы в качестве параметров чаще всего имеют переменные простого типа либо инстансы класса, то в СУБД, которая по определению "заточена" под работу с набором объектов, т.е. строк, вполне логично передавать наборы данных через временные таблицы. Мне это напоминает Белых Айя из Wheel of Time (как я понял, автор книг, Джордан, считает, что если несколько раз повторить "логично", то всё рассуждение будет логично). Что логично? В чем логично? Почему логично? Для чего result set необходимо получать именно из SP, а не из "честного SELECT'а"? Зачем данные нужно запихивать в temporary table? Рефакторинг - разложение на множители. По отношению к SQL это будет разбиение запросы на подзапросы. Типа из единичного CREATE VIEW VY AS SELECT ... сделать два: CREATE VIEW VX AS SELECT ... CREATE VIEW VY AS SELECT ... FROM Y .... с возможным использованием VX в другом месте - вот предполагаемый результат рефакторинга. Если же вы эти подзапросы (в DB2) оформляете как SP, вы крайне затрудняете себе же жизнь. Вы не можете сделать CREATE PROCEDURE PX ... (открыл курсор CX) CREATE PROCEDURE PY ... SELECT ... FROM PX ... (открыл курсор CY) У вас будет в несколько раз больше писанины (тогда как рефакторинг призван уменьшить её), работа с циклами вместо работы с множествами, лишний I/O (на вставку во временную таблицу), отсутствие части оптимизаций (при компиляции SELECT ... FROM VY в выражение будет подставлен текст VY с заинлайненым VX с последующей оптимизацией целиком, тогда как хранимая процедура в хранимую процедуру подставлена не будет). Перетаскивание же данных на сервер приложений и последующая их обработка там приводит к потере производительности. Это не обязательно так, но я веду не к тому. WITH и табличные SQL-функции дают возможность создавать _очень сложные_ запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 14:13 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
PS. Объектная СУБД у нас одна - GemStone/S (http://www.gemstone.com). Нехорошо обзывать байтовые огрызки объектами ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 14:15 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Когда я говорил "объекты" я имел ввиду, что очень часто "байтовый огрызок", представляющий собой данные одной строки мапится на объект в сервере приложений. Данные проще получать из SP, а не из честного селекта, когда эта вызываемая SP содержит функционал, который может быть использован в другой процедуре. Вот оно, то самое уменьшение кода. Поэтому дублирование "честных селектов" и есть кривизна. Использование вьюшек - случай частный и примитивный, подходящий только к выборке данных. Возвращаясь к отчетности. Да, блокировки, в особенности RR - это клево, но когда необходимо сделать отчет, который требует времени, проще сделать snapshot данных и обработать его, нежели париться потом с deadlock'ами. И вообще, если СУБД не предоставляет возможности что-то сделать, почему надо это называть извращением? Из объектных знаком только с Cache. Но опять же, речь не о ней. Похоже пора закрывать топик. Пошел уже треп. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 14:45 |
|
TEMPORARY TABLE
|
|||
---|---|---|---|
#18+
Да не, не треп. Просто подходы и взгляд на разработку приложений у нас разный. По мне так если что-то можно вытянуть одним селектом - то уж лучше одним слектом, чем писать ХП. Если ХП используется в нескольких местах, и нужно в ней что-то подправить, значит изменения нужно учесть везде. Вот и получается что ХП где почти один и тот же код - целая куча. На ином серваке MSSQL этих ХП уже столько, что замучаешься их классифицировать. Короче говоря то, что применение ХП уменьшает количество кода - неправда. Или по крайней мере - не совсем правда. Вообще, как на ваш взгляд, как легче поддерживать приложение, когда весь код в одном месте, или когда код поделен попалам - половина на сервере в ХП (где куча своих завязок) а половина в исходниках на с++ или еще каком языке? Работа с ХП на MSSQL выгодна прежде всего производительностью. потому, что все что нужно уже откомпилировано. Конечно кому-то это облегчает задачу с той стороны, что не надо всякий раз перекомпилировать приложение, а достаточно поменять код на сервере. Да вот, только не всегда это получается безболезненно. вот мне, например, очень жаль когда разработчики для DB2 отказывается от вложенного SQL. такой огроменный кусок вкусностей от IBM просто выкидывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2005, 15:08 |
|
|
start [/forum/topic.php?fid=43&fpage=144&tid=1605834]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
33ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 269ms |
total: | 424ms |
0 / 0 |