Конференция "Базы" » Запрос на SQL для выборки иерархического списка [MSSQL]
 
  • stas © (20.06.08 11:12) [20]
    она не станет копией справочника. Она станет копией результата отработки рекурсивной ХП
  • Fin (20.06.08 11:14) [21]

    > Ega23 ©   (20.06.08 10:30) [9]
    > > Кстати вариант с триггером ИМХО очень перспективный вариант.
    > От ситуации зависит. Может быть и перспективным. А может
    > - и нет.

    Согласен, но я не уточнил что относительно моих задач, где таблица пополняется крайне редко (единичные случаи в месяц), а вот выборка при расчете в основном и "загружает" сервак.
  • MsGuns © (20.06.08 11:15) [22]
    >stud ©   (20.06.08 11:05) [15]
    >ну тут наверное типа временная таблица с тими триггерами (есть такое в 2005?) и при >добавлении записи в нее триггер вытаскивает типа "детей", добавляет их в нее и

    Вы, извиняюсь, вообще представляете себе, для чего используются триггери и как они работают ?

    >получается в общем и целом бред,

    вот это уже ближе к истине

    >хотя работать будет

    Угу, и подвесит нафиг сервер к чертовой матери.
  • stas © (20.06.08 11:15) [23]
    MsGuns ©   (20.06.08 11:11) [19]
    в MSSQL в хранимках есть 1 минус, результат не так уж просто объеденить с другой таблицей.
  • MsGuns © (20.06.08 11:17) [24]
    >stas ©   (20.06.08 11:15) [23]
    >в MSSQL в хранимках есть 1 минус, результат не так уж просто объеденить с другой >таблицей.

    Сами придумали или кто вумный поделился "опытом" ?
  • stas © (20.06.08 11:17) [25]
    MsGuns ©   (20.06.08 11:15) [22]
    У меня наоборот вешался, пока не перешли на таблицы.
  • stas © (20.06.08 11:21) [26]
    MsGuns ©   (20.06.08 11:17) [24]
    у вас есть простое решение?
  • Правильный-Вася (20.06.08 11:25) [27]

    > наполняется триггерами, таким образом при выборке используется
    > таблица, без всяких функций и рекурсий.

    это и есть завуалированная рекурсия, если ты не догадался
    только рекурсия наполнения, а не чтения
  • stas © (20.06.08 11:26) [28]
    Правильный-Вася   (20.06.08 11:25) [27]

    Читаем жирным
    >таким образом при выборке используется
    > таблица, без всяких функций и рекурсий.
  • stud © (20.06.08 11:32) [29]

    > Вы, извиняюсь, вообще представляете себе, для чего используются
    > триггери и как они работают ?

    очень смутно))
    есть таблица, в нее запросом добавляется запись с ид узла. далее срабатывает триггер на вставку, который ищет "детей" для добавленной записи, вставляет их в эту же таблицу, опять срабатывает (получается аналог рекурсии) или пардон с триггерами есть другой вариант?


    > Она станет копией результата отработки рекурсивной ХП

    это в случае если данные из нее после получения удаляются.
  • Fin (20.06.08 11:48) [30]

    > stud ©   (20.06.08 11:32) [29]
    > > есть таблица,
    >  в нее запросом добавляется запись с ид узла. далее срабатывает
    > триггер на вставку, который ищет "детей" для добавленной
    > записи, вставляет их в эту же таблицу, опять срабатывает
    > (получается аналог рекурсии)


    На сколько я понимаю триггер наложен на основную таблицу и перестраивает служебную в которой в упрошенном варианте тригерров нету.
  • stas © (20.06.08 11:50) [31]
    stud ©   (20.06.08 11:32) [29]
    Напишу только про Insert
    при добавлении записи в основную таблицу срабатывает триггер, который рекурсивно либо каким-то другим способом находит всех родителей только на вставленную запись, и заполняет другую таблицу. Таким образом у нас рекурсия работает, только на корректировку таблицы и только по тем записям которые связаны с редактируемой.
    Это повшает производительность и не тянет много ресурсов при выборке, но снижает при корректировке таблицы.
  • Ega23 © (20.06.08 12:01) [32]
    Я всё равно продолжаю не понимать, нафига нужен триггер и особенно - временная таблица?
    Если есть такая таблица, которая изменяется крайне редко, но оттуда частые селекты идут - ну и заточи её под селекты изначально. Сделай какой-нибудь AbsoluteLevel и какой-нибудь ChildCount и AllChilsCount (тут можно подумать да в сети почитать).

    А временная таблица в данной ситуации - это вообще жесть. В MSSQL их 2 типа - одни с # - на конкретный spid со временем жизни <= времени жизни spid. Второй тип - с двумя ## - в рамках сервера со временем жизни <= времени жизни самого сервера.
    При разрыве соединения в первом случае и остановке (перезапуске) сервера во втором - ТАБЛИЦЫ БУДУТ ГРОХНУТЫ.

    А в первом случае такая временная таблица будет создаваться для КАЖДОГО КЛИЕНТА.
  • stas © (20.06.08 12:03) [33]
    Ega23 ©   (20.06.08 12:01) [32]
    Ты ничего непонял...
  • stas © (20.06.08 12:06) [34]
    триггер+временная таблица такого нет!
    есть триггер+постоянная таблица это 1 вариант
    есть Multi statement function, которая по своей структуре подразумевает временную таблицу и возвращает ее результат это 2 -й вариант.
  • Ega23 © (20.06.08 12:06) [35]

    > Ega23 ©   (20.06.08 12:01) [32]
    > Ты ничего непонял...
    >


    Я понял всё прекрасно. И вообще, за последние 2.5 года 70% времени программирования серверной части уходило на работу с иерархическими структурами под MSSQL.
    Так что не надо мне тут...  :)
  • stas © (20.06.08 12:08) [36]
    аналагично :)
  • stud © (20.06.08 12:40) [37]

    > при добавлении записи в основную таблицу срабатывает триггер,
    >  который рекурсивно либо каким-то другим способом находит
    > всех родителей только на вставленную запись, и заполняет
    > другую таблицу.

    так это получается для каждого узла своя таблица????
    и если нужно получить на клиента только потомков начиная с текущего узла?
    чето логика пользования такого варианта не совсем понятна.....
  • MsGuns © (20.06.08 12:57) [38]
    Чет его знает, как ты умудряешься повесить сервер..
    У меня разузлование выполняется на "деревянной" таблице с 5 млн.записей, причем вместо ид-ра используются нативные стринги, а кроме того еще из 5 разных таблиц берутся уточняющие данные (замены, техотход, позаказная расцеховка, наименования и прочий "интерьер"). "Дерево" из 30 000 узлов выгребается за 4 мин. Из 10 000 - за 30 сек. MS SQL 2000

    Воистину рыба портится с головы ;)
  • stas © (20.06.08 13:07) [39]
    MsGuns ©   (20.06.08 12:57) [38]
    Сколько пользователей юзает одновременно эти деревья?

    stud ©   (20.06.08 12:40) [37]
    нет.
 
Конференция "Базы" » Запрос на SQL для выборки иерархического списка [MSSQL]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]