Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
я новичок в MS SQL, поэтому прошу сильно не пинать

передо мной такая задача стоит, что я должен много раз просмотреть большой объем данных (несколько миллионов строк, разбитый на маленькие кусочки (несколько строк), каждый маленький кусочек обрабатывается (склеиваются строки и прочее разное). Вызывать каждый раз весь этот объем - нереально

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

так вот вопрос в чем: где этот курсор лежит? если для каждого FETCH придется к базе обращаться и все равно перелопачивать все строки - то ничего я не выиграю (как мне кажется)

и вообще может я велосипед изобретаю? вдруг GROUP BY примерно так и работает и стоит в этом направлении покопать?

я способ с агрегатными функциями немножко потестил вообще-то, получается фигня - 20 строк результата (т.е. примерно 200 строк исходного запроса) обрабатывается 40 секунд, по всем прикидкам так не должно быть, почему решил повозиться с курсором
15 сен 12, 05:34    [13168414]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
У гуманитариев всегда большая фантазия, и они любят поболтать.
А вот у технаря море любопыства, взять да покопаться и разобраться что к чему, самому, молча.
Но процедурномыслие вроде как не лечится. Понятие декларативности для них не постижим.

PS: План запроса и говорит что происходит в реале.
Хотя курсоры разные бывают, но это не повод ими пользоваться.
А лежат они что-то типа в темповых таблах (или копия всех данных или копия ключей или идентификатор текущей строки)
15 сен 12, 06:21    [13168420]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
Mnior
У гуманитариев всегда большая фантазия, и они любят поболтать.
А вот у технаря море любопыства, взять да покопаться и разобраться что к чему, самому, молча.
Но процедурномыслие вроде как не лечится. Понятие декларативности для них не постижим.
кто технарь, кто гуманитарий? зачем этот пост?
ничего не понял... намеки, экивоки
кто после этого гуманитарий?
15 сен 12, 06:36    [13168423]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
pgiw99oeo
Mnior
У гуманитариев всегда большая фантазия, и они любят поболтать.
А вот у технаря море любопыства, взять да покопаться и разобраться что к чему, самому, молча.
Но процедурномыслие вроде как не лечится. Понятие декларативности для них не постижим.
кто технарь, кто гуманитарий? зачем этот пост?
ничего не понял... намеки, экивоки
кто после этого гуманитарий?
А мы тоже знаете ли не много поняли в вашем посте. Текста много, толку ноль.
16 сен 12, 02:40    [13170782]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
Mind
А мы тоже знаете ли не много поняли в вашем посте. Текста много, толку ноль.
кто это - "мы"? говорите за себя
один гуманитарием называет, другой вместо "я" говорит "мы"

ситуацию более-менее вынужден описывать, потому что все равно будут спрашивать
16 сен 12, 05:44    [13170886]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
не вовремя тему создал
в рабочие дни надо было создать
работающих побольше, поэтому и помощь быстрей можно было бы получить
ну и фиг с ним
16 сен 12, 05:55    [13170888]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
pgiw99oeo
в рабочие дни надо было создать
работающих побольше, поэтому и помощь быстрей можно было бы получить
Нифига себе, мене чем за час ответили и это типа не оперативно. Это форум а не чат.
Ну а в "рабочие дни" вас бы распяли за упоминание слова "курсор".
Но самое главное, вы вместо того чтобы спрашивать чё непонятно, только бучу поднимаете. Поменьше эмоций. Или вас больше интересует "кто на ком стоял" и сам вопрос вам не важен?
Или вы привыкли что за вас всё разжуют, прочитают невнятные мысли и ещё кофе в постель ...?!
Давайте хватит этот детский сад. Хотите фансервис - платите баблом, а то привыкли к халяве, так ещё и возмущаются.

Уважение получают только за профессионализм, дикое желание понимать и ювелирное отношение к деталям. И тогда с радостью поделятся ценными знаниями бесплатно и спасибо скажут.

А вот ваши фантазии как оно там "внутрях" происходит и на основании каких вещей вы сделали выводы - только курам на смех. Дело не в том что вы ошибаетесь, а в чём конкретно. Если не знать какие-то локальные тематические вещи это одно, а вот подход, логика и стратегия решения задач и мышления - это ошибка возведённая в степень.

Ключевые слова вам были сказаны:
План запроса. Можно плохо знать синтаксис и набор функционала. Но не знать что такое план запроса, как его читать и каков смысл - это значит ничего не знать. В плане написано как оно там и работает со всеми деталями. На него надо молится, при каждом запросе.
А про курсоры, и про отношение к ним и почему оно так - вам намекнули.
А цитировать вам мануалы тоннами никто не будет.
Чем меньше вы знаете базовых основ, тем меньше желания вам что-либо отвечать.

pgiw99oeo
если для каждого FETCH придется к базе обращаться
Бредятина. Попытайтесь правильно понять как оно работает, где что обрабатывается и как оно называется.
pgiw99oeo
я способ с агрегатными функциями немножко потестил вообще-то, получается фигня
Первое впечатление может всё испортить и запутать. Не делайте поспешных выводов. Копайте до самых костей. Иначе не то что сказать, вы подумать не имеете права что оно плохо/хорошо.

А теперь на счёт правил форума. Вы обязаны (кстати именно у ТС больше всего обязанностей, а прав столько же) предоставлять подробные тестовые скрипты и результаты (тексты ошибок, показания и как вы их получали), не говоря о версиях продукта. А все эти бла-бла-бла можно и до бана довести.
16 сен 12, 21:01    [13172712]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
pgiw99oeo,

У вас слишком общий вопрос.

Курсор лежит в зависимости от его опций, но в любом случае данные в базе, как и всё в MSSSQL.

Запрос будет быстрее курсора, так как логика будет выполняться ядром субд, а не интерпретатором TSQL. Но нужно его правильно сформировать, и нужно, что бы логика выполнения была оптимальная (иначе даже курсор может выполняться быстрее).

Короче, слишком абстрактно получается.
16 сен 12, 21:34    [13172812]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
pgiw99oeo,
Большинство задач решается с помощью операций над наборами данных. Советую копать в этом направлении.
И опишите задачу подробнее.
17 сен 12, 09:51    [13174040]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
опишу подробнее. есть таблица. надо выделить в ней строки и сделать другую таблицу
вот таким образом
-----  БЫЛО (zzIshodnayaTablica) -----------
ID	Number	Numbers
1	5	1
1	6	1..7
1	6	1,2
1	9	1..7
1	12	11..14
1	12	1..10
2	2	1
2	10	1..9
2	38	5
2	38	3
2	38	2,3
2	38	8
2	38	9
2	38	1,7
2	38	4
2	38	8
3	26	1..9
3	26	3,5,6,9
3	27	1..9

-----  СТАЛО -----------
ID	Number	NumbersConcat
1	5	,1,
1	6	,1..7,1,2,
1	9	,1..7,
1	12	,11..14,1..10,
2	2	,1,
2	10	,1..9,
2	38	,5,3,2,3,8,9,1,7,4,8,
3	26	,1..9,3,5,6,9,
3	27	,1..9,
т.е., например, группа строк с признаками (ID=2, Number=38)превращается в одну строку
-----  БЫЛО (zzIshodnayaTablica) -----------
ID	Number	Numbers
. . . . . . . . . . 
2	38	5
2	38	3
2	38	2,3
2	38	8
2	38	9
2	38	1,7
2	38	4
2	38	8
. . . . . . . . . . 

-----  СТАЛО -----------
ID	Number	NumbersConcat
. . . . . . . . . . 
2	38	,5,3,2,3,8,9,1,7,4,8,
. . . . . . . . . . 

встроенной агрегатной функции, которая бы склеивала строки. - нету
ну нашел я в интернете код, подстрогал его как мне надо
вот такая функция получилась
-- создание функции соединяющей строки
USE Baza
IF OBJECT_ID('zzSumStr') IS NOT NULL
DROP FUNCTION zzSumStr
go
CREATE FUNCTION dbo.zzSumStr(@ID BIGINT,@Number BIGINT)
returns varchar(1000)
AS
BEGIN
  DECLARE @RET varchar(1000)
  SET @RET=''
  SELECT @RET=@RET+','+Numbers 
  FROM Baza.dbo.zzTablica
  WHERE ID=@ID AND @Number=Number
  SET @RET=@RET+','
  return(@ret)
END

но когда я эту функцию в запросе использую (GROUP BY и прочее), то работает очень медленно - 200 строк - 40 секунд (подозреваю, что записей много и идет тупой просмотр всех записей)

тогда решил с курсором сделать, чтобы было упорядочЕние и можно было не просматривать всю таблицу, вот такой курсор
DECLARE TOP 20000
     zzMojKursor SCROLL CURSOR FOR 
     SELECT   ID, Number, Numbers
     FROM     Baza.dbo.zzIshodnayaTablica 
     ORDER BY ID, Number

тогда получается, что если я выделяю группы строк, то мне не надо пробегать весь курсор
если пошли строки отличающиеся от предыдущих, то (в силу упорядоченности) текущий блок закончился, и начался новый
текущий блок накапливаю во временную таблицу, применяю к ней функцию, очищаю временную таблицу, накапливаю в ней следующий блок... ну и так далее
с курсором я сделал и теперь получается, что за те же 40 секунд обрабатывается 20000 строк (в 100 раз быстрее и час за полтора таблица обработается)

вот как запросом сделать - я не знаю

зы. немножко в сторону замечание. когда я с курсором возиться начал, я думал что изобретаю велосипед, что микрософт уже обо всем позаботился... хотя, может я что-то делаю не так
17 сен 12, 15:55    [13176917]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
_djХомяГ
Guest
for xml path
17 сен 12, 15:58    [13176936]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
_djХомяГ
Guest
тут
если версия позволяет
17 сен 12, 16:01    [13176971]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Боже, попахивает PHP. Структура таблиц не нормализована. Нет нормального PK.
SELECT	 ID, Number
	,Stuff((SELECT	',' + Numbers
		FROM	dbo.zzIshodnayaTablica S
		WHERE	S.ID = T.ID AND S.Number = T.Number	-- Need Index {ID, Number}
		FOR XML Path(''),Type).value('text()[1]','VarChar(max)'),1,1,'')
FROM	dbo.zzIshodnayaTablica T
Нормализуете базу будет всё летать.

PS: Яжеж предупреждал. Если звездец, то тотально.
17 сен 12, 16:05    [13177003]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT ID,Number
,Numbers=STUFF((SELECT ','+Numbers FROM zzIshodnayaTablica TT WHERE TT.ID=T.ID AND TT.Number=T.Number FOR XML PATH('')),1,1,'')
FROM zzIshodnayaTablica T
GROUP BY ID,Number
ORDER BY ID,Number;
И всё. Никакого курсора
17 сен 12, 16:09    [13177030]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Забыл
Mnior
SELECT	 ID, Number
	,Stuff((SELECT	',' + Numbers
		FROM	dbo.zzIshodnayaTablica S
		WHERE	S.ID = T.ID AND S.Number = T.Number	-- Need Index {ID, Number}
		FOR XML Path(''),Type).value('text()[1]','VarChar(max)'),1,1,'')
FROM	dbo.zzIshodnayaTablica T
GROUP BY ID, Number
PS: Калированный гуманитарий.
17 сен 12, 16:10    [13177043]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior
Забыл
Mnior
SELECT	 ID, Number
	,Stuff((SELECT	',' + Numbers
		FROM	dbo.zzIshodnayaTablica S
		WHERE	S.ID = T.ID AND S.Number = T.Number	-- Need Index {ID, Number}
		FOR XML Path(''),Type).value('text()[1]','VarChar(max)'),1,1,'')
FROM	dbo.zzIshodnayaTablica T
GROUP BY ID, Number
PS: Калированный гуманитарий.
TYPE в данном случае лишнее, не? :))
17 сен 12, 16:11    [13177054]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
SELECT ID,Number
,Numbers=STUFF((SELECT ','+Numbers FROM dbo.zzIshodnayaTablica TT WHERE TT.ID=T.ID AND TT.Number=T.Number FOR XML PATH('')),1,1,'')
FROM dbo.zzIshodnayaTablica T
GROUP BY ID,Number
ORDER BY ID,Number;
Ай-яй-яй. :)
17 сен 12, 16:11    [13177056]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior
iap
SELECT ID,Number
,Numbers=STUFF((SELECT ','+Numbers FROM dbo.zzIshodnayaTablica TT WHERE TT.ID=T.ID AND TT.Number=T.Number FOR XML PATH('')),1,1,'')
FROM dbo.zzIshodnayaTablica T
GROUP BY ID,Number
ORDER BY ID,Number;
Ай-яй-яй. :)
А откуда известно имя схемы?
17 сен 12, 16:12    [13177069]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Mnior
пропущено...
Ай-яй-яй. :)
А откуда известно имя схемы?
Прошу прощения - там где-тот проскакивало, оказывается
17 сен 12, 16:14    [13177094]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
TYPE в данном случае лишнее, не? :))
Да, просто не люблю делать исключения, т.к. если в команде работать, то обычно бывает так:

В 100500 местах с Type, а в одном месте без (экономия на спичках)
Через месяц весь новый код содержит без Type и выдаёт ошибочные данные.
При этом вопят - "вот у тебя так было написано". Бить бестолковых кодеров по рукам бесполезно - нет мозгов, значит мозгов нет.
Поэтому никаких исключений.
17 сен 12, 16:18    [13177145]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
база вообще-то не мной сделана
индексы и прочее - далекая от меня вещь
я типа продвинутый пользователь
попробую запросы, какие тут написаны
как они по быстродействию окажутся посмотрю, быстрей курсора или нет
может вообще работать не будут, прав не будет каких-нибудь у меня
17 сен 12, 16:29    [13177270]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
pgiw99oeo
база вообще-то не мной сделана
я типа продвинутый пользователь
То кто писал сеё тоже типа "прадвинутый".

Лимонов расплодилось, блин.
17 сен 12, 17:31    [13177893]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
pgiw99oeo
Member

Откуда:
Сообщений: 2646
iap,
запрос работает просто замечательно, огромное спасибо

alexeyvg,
да запрос работает значительно быстрее курсора, раз в 100 быстрее :)
20 сен 12, 16:21    [13197322]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
pgiw99oeo
iap,
запрос работает просто замечательно, огромное спасибо

alexeyvg,
да запрос работает значительно быстрее курсора, раз в 100 быстрее :)

Человек открыл для себя set based подход. Всегда приятно на это смотреть!

п.с.
А на самом деле, чем больше вникаешь в "декларативность" sql server, тем больше приходится задумываться об императивных действиях которые он предпринимает. Имхо, это самый большой крючок на который MS и прочие производители субд всех поймали!
А-ля: мы сделали за вас как надо, а вы теперь учите как мы сделали. И чем ближе к истине (которую не раскрывают) ты подберешься, тем круче, и тем лучше ты сможешь использовать то, что реализовано. На деле это выливается в то, что когда пишешь (псевдо)декларативный код, лучше всегда думать императивно, как он будет исполняться. Этакое изощренное извращение.
И в целом, для простых случаев, это работает! И т.к. простых случаев over 9000 это работает исправно и долгие годы. Но как только начинаются сложности - начинаются вопросы к сообществу. Тут в дело вступают гуру, которые познали императивную импликацию декларативных выражений, всплывают понятия плана, сиика, скана, спилла и т.д. Хотя, с точки зрения конечного пользователя декларативности должно быть пофиг. И чем дальше в лес, тем толще партизаны. Т.к. я сам глубоко в теме и иногда мыслю, то осознаю комичность. В то же время, такие ситуации - мой хлеб. Так что, апплодирую поставщикам СУБД стоя! Молодцы!
20 сен 12, 19:21    [13198315]     Ответить | Цитировать Сообщить модератору
 Re: где хранится курсор?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
SomewhereSomehow
А на самом деле, чем больше вникаешь в "декларативность" sql server, тем больше приходится задумываться об императивных действиях которые он предпринимает.
Ну да, потому что ничто в мире несовершенно и человеческую мысль не заменит.

Скажем, точно так же для .NET или C++ программисту высокого уровня тоже надо примерно понимать, что будет делать ОС и процессор для написанного кода, и соответственно хотя бы в общем представлять его архитектуру (хотя бы не конкретный процессор, а общие принципы - знать, что такое регистры, память, команды, как передаются параметры, как выделяется память).
20 сен 12, 19:36    [13198372]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить