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

Откуда:
Сообщений: 96
kDnZP, респект.


Mnior,

1. много чего написали, эмоциально, но мало что по существу.

Итак, я утвержал что
aleonov
.. обработка строк и работа с памятью в CLR на порядок быстрее.
и показал на конкректном коде с использованием SQL функций (substring, charindex) против CLR (спасибо kDnZP), что CLR выигрывает минимум в два раза на задаче парсинга строки.
Разница в разы проявляется на решении задачи нахождения long common sequence. Я специально не углублялся в детали этой задачи, поскольку потратил достаточно много времени, на изучение, анализ, поиск наилучшего решения и т.п. и не хотел отнимать много времени у участников форума. То что задача сформулирована для строк не должно смущать, поскольку речь идет о маскимальной подпоследовательности коей, например, может являться задача сравнения данных в двух таблицах, или нахождении неких шаблонов внутри одной таблицы.
Специально для вас привожу ссылку на Википедию, посмотрите внимательно на алгоритм решения и подумайте каким образом индексы могут вам помочь.

Mnior
2. Допустим в CLR строки работают быстрее чем в SQL (это не так, там просто больше функционал), но из этого не следует что нужно в них преобразовывать. Структурированные типы быстрее строковых (тупо нет преобразований) независимо от системы.
3. XML это не строка это сложная структура.


См. выше тест структурированный тип XML vs строка с разделителями.

Mnior
В итоге уже 2 дня срача прошли, а завтра можно уже самому взять скуль и все проверить и показать.


Ну так возьмите же наконец-то и проверьте сами, или не царское это дело.

Mnior
aleonov, как вы думаете, боюсь ли я оказаться "неправым"?


конечно, боитесь иначе бы давно уже сами все проверили и не писали бы
Mnior
У кого там сервер под рукой - проверяйте.


Mnior
Только всё это тщетно, не получится через SqlString передать строку более 4K символов. Тут нужен SqlChars.


см. еще раз тесты, думайте, размышляйте.

Mnior
1. Императивист?


спасибо за комплимент.


Mnior
aleonov, знаете что вы не учитываете, когда сравниваете с Longest common subsequence problem (LCSSP)?
Что данные уже заранее могут быть подготовлены специальным образом и обработаны. Наличие индекса об этом и говорит.



прочитайте , как реализован алгоритм по той ссылке что я дал, обращая особое внимание на детали.

Если кому интересно, могу запостить данные в топик с ответом. Заранее предупреждаю что задача не из простых.
Всем за спасибо за внимание. Отдельный респект, участникам потратившим свое личное время на тестирование.
21 май 12, 12:58    [12587846]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
kDnZP
Я проверил. Результат не обрадовал.
Согласен CTE тормознее в 8 раз (у меня). Мда, и здесь CTE убого медленен.
Даже банальный парс выровненой строки быстрее, также примерно в 8 раз:
+
DECLARE  @Value	VarChar(max)
	,@Limit	Int	= 500

SELECT	 @Value	= (
	SELECT	',',Str(v1.number + v2.number * 2048)
	FROM	master.dbo.spt_values v1, master.dbo.spt_values v2
	WHERE	    v1.number < @Limit
		AND v1.type = 'P'
		AND v2.type = 'P'
FOR XML Path(''),Type).value('text()[1]','VarChar(max)')
SET STATISTICS TIME ON
SELECT	SubString(@Value,N.N * 11 + 2,10) AS Value
INTO	#T1
FROM	(SELECT	Top(Len(@Value)/11) Row_Number()OVER(ORDER BY (SELECT NULL))-1 FROM
		 master.dbo.spt_values v1
		,master.dbo.spt_values v2) N(N)
SET STATISTICS TIME OFF
затраченное время = 10 390 мс.

kDnZP, другая оплошность:
+
DECLARE  @XML	XML
	,@Limit	Int	= 500 -- <2048

;WITH Numbers (Number) AS (
	SELECT	Convert(VarChar,v1.number + v2.number * 2048)
	FROM	master.dbo.spt_values v1, master.dbo.spt_values v2
	WHERE	    v1.number < @Limit
		AND v1.type = 'P'
		AND v2.type = 'P'
)
SELECT	 @Value	= Stuff((SELECT ',',Number AS [*] FROM Numbers FOR XML Path('' ),Type).value('text()[1]','VarChar(max)'),1,1,'')
	,@XML	=       (SELECT     Number AS [*] FROM Numbers FOR XML Path('X'),Type)
SET STATISTICS TIME ON
SELECT	X.X.value('text()[1]','NVarChar(15)') AS Value
INTO	#T1
FROM	@XML.nodes('/X') X(X)
SET STATISTICS TIME OFF

SET STATISTICS TIME ON
SELECT	X.X.value('.','NVarChar(15)') AS Value
INTO	#T2
FROM	@XML.nodes('/X') X(X)
SET STATISTICS TIME OFF
затраченное время = 9 322 мс.
затраченное время = 13 668 мс.
И всё, ваш вариант "выигрывает". Чтож вы так не вдаётесь в детали. А где-то Type пропустили.

kDnZP
На вашем тесте TVF_SQL функия в 3 раза медленнее.
У меня опять же в 8 раз. В 3 если на очень малых данных (в начале нелинейно). Так что да, практически на порядок.
Но если поставить не один вызов функций, а многократно, то скалярка (и CLR) с количеством вызовов отстаёт всё больше и больше.

Осталось посмотреть сколько будет работать CLR функция с прямым чтением из запроса.
И соотношение вызова функции SubString с CLR_SubString.

И это всё равно сравнение тёплого с мягким.

Соотношение затраченых ресурсов:
Генерация строки2 523
Парсинг (+ вставка)10 390
Вставка в таблу1 443
Пренебречь нельзя.
21 май 12, 13:16    [12588000]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Mnior,

Мне, если честно, вас даже немножко жалко. Вы подставляетесь конкретно, больно бить не буду (в фигуральном смысле), лишь мягко укажу Вам на игнорирование некоторых деталей, а именно, тот код который Вы написали, работает на порядки быстрее моего, спору нет вот статистика:



SQL Server Execution Times:
CPU time = 13447 ms, elapsed time = 13704 ms. -мой код

(1024000 row(s) affected)
stats1

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 827 ms, elapsed time = 851 ms. - ваш.. скорость космического корабля, молодец! но! Ваш код ничего не возвращает ! Т.е. элементарно и банально не работает!!

(0 row(s) affected)
stats2

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

(10 row(s) affected)

(0 row(s) affected)

(1 row(s) affected)


Если я ничего не перепутал, то с Вашими с изменениями это должно выглядеть, так:

DECLARE @tst1 NVARCHAR(MAX)
DECLARE @tst2 XML
DECLARE @limit INT=500 -- <2048

SELECT @tst1=Stuff((
SELECT ','+LTRIM(STR(v1.number + v2.number * 2048))
FROM master..spt_values v1
INNER JOIN master..spt_values v2 ON v2.number < @limit
AND v2.type = 'P'
WHERE v1.type = 'P'
FOR XML Path(''),Type).value('text()[1]','VarChar(max)'),1,1,'') -- Быстрее не бывает
, @tst2=(
SELECT CAST(v1.number + v2.number * 2048 AS NVARCHAR(MAX)) c
FROM master..spt_values v1
INNER JOIN master..spt_values v2 ON v2.number < @limit
AND v2.type = 'P'
WHERE v1.type = 'P'
FOR XML Path('')
)

SET STATISTICS TIME ON
SELECT *
INTO #tst1
FROM fn_parse(@tst1,',') t1
print 'stats1'
SET STATISTICS TIME OFF

SET STATISTICS TIME ON
SELECT X.X.value('text()[1]','NVarChar(15)') AS rn
-- X.X.value('.','NVarChar(15)') AS rn
INTO #tst2
FROM @tst2.nodes('/X') X(X)
print 'stats2'
SET STATISTICS TIME OFF

SELECT TOP 10 * FROM #tst1 ORDER BY id
SELECT TOP 10 * FROM #tst2 ORDER BY rn

DROP TABLE #tst1
DROP TABLE #tst2

SELECT @@VERSION
21 май 12, 13:52    [12588293]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Mnior, с генерацией я честно говоря вообще не заморачивался, т.е. предполагал, что данные вроде как уже есть где-то в системе, соответственно и оптимизацией не занимался.

Что же касается приведений типов, то тут у меня полное непонимание(((. Т.е. я тупо не могу догнать что вообще происходит в методе value()

'.' == '.[1]' == 'xs:string(.[1])' ?
Так чтоль? Тогда почему:
'text()' нельзя, а надо 'text()[1]', т.е. указывать явно, иначе:
Msg 2389, Level 16, State 1, Line 15
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

Да и вообще, где прочитать про функции преобразования, более того в какой оно тип преобразовывает?
А так в какой: 'data(.[1])' или опять нетипизировано?

Вобщем местами эта хрень у меня загадочная по самое немогу. Но за 'text()[1]' спасибо, а за ссылку на описание почему именно так будет отдельное спасибо, потому как что-то с навыками поиска в msdn плохо складывается... нифига полезного по преобразованиям найти не могу.

** И Mnior NVarChar(15) != NVarChar(max), нечего тута дурить.
21 май 12, 14:26    [12588742]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
aleonov, ну терь очередь Mnior глумиться, он вам раскажет чем <c>трум-пум-пум</c> от <X>трум-пум-пум</X> отличается. Но это без меня развлекайтесь.

DECLARE  @XML	XML
	,@Limit	Int	= 500 -- <2048
	,@Value VARCHAR(max)
;WITH Numbers (Number) AS (
	SELECT	Convert(VarChar,v1.number + v2.number * 2048)
	FROM	master.dbo.spt_values v1, master.dbo.spt_values v2
	WHERE	    v1.number < @Limit
		AND v1.type = 'P'
		AND v2.type = 'P'
)
SELECT	 @Value	= Stuff((SELECT ',',Number AS [*] FROM Numbers FOR XML Path('' ),Type).value('text()[1]','VarChar(max)'),1,1,'')
	,@XML	=       (SELECT     Number AS [*] FROM Numbers FOR XML Path('X'),Type)


SET STATISTICS TIME ON
SELECT	ROW_NUMBER() OVER (ORDER BY (SELECT 1)) id,
X.X.value('text()[1]','NVarChar(max)') AS Value
INTO	#T2
FROM	@XML.nodes('/X') X(X)
SET STATISTICS TIME OFF

SET STATISTICS TIME ON
SELECT	ROW_NUMBER() OVER (ORDER BY (SELECT 1)) id,
X.X.value('.','NVarChar(max)') AS Value
INTO	#T1
FROM	@XML.nodes('/X') X(X)
SET STATISTICS TIME OFF

SELECT TOP 10 * FROM #T1
SELECT TOP 10 * FROM #T2

DROP TABLE #T1
DROP TABLE #T2
21 май 12, 14:37    [12588852]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
[quot kDnZP]aleonov, ну терь очередь Mnior глумиться, он вам раскажет чем <c>трум-пум-пум</c> от <X>трум-пум-пум</X> отличается. Но это без меня развлекайтесь.


kDnZP, как всегда на высоте. :-)) я заметил, свою оплошность (кто ни без греха), но специально не постил, интересно было почитать очередной коммент на 2 страницы. Ну что ж, в дискусии рождается истина. Я взял себе на заметку, несколько решений.

Со всеми поправками решение c XML получилось действительно быстрым.
21 май 12, 15:01    [12589100]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Mnior,

утешьтесь, Вы победили :-)
21 май 12, 15:09    [12589198]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleonov почуя, что запахло жареным, написал ещё парачку или лживых или неверных или сомнительных утерждений, и смылся.
Видимо на форуме если и будет появится то очень редко.

Ладно, не хочет он признавать, что не понимает участников. Не хочет понимать как работают запросы и индексы. Ок.
Давайте хоть замерим как сработает запрос с поиском на скуле.
+
USE tempdb
GO
CREATE TABLE dbo.Tbl1 (
	 ID	Int
	 CONSTRAINT [PK_Tbl1] PRIMARY KEY
	,Value	Int	NOT NULL
);CREATE INDEX IX_Tbl1_Value ON dbo.Tbl1 (Value);
CREATE TABLE dbo.Tbl2 (
	 ID	Int
	 CONSTRAINT [PK_Tbl2] PRIMARY KEY
	,Value	Int	NOT NULL
);CREATE INDEX IX_Tbl2_Value ON dbo.Tbl2 (Value);
GO
CREATE VIEW dbo.vwSubSequence WITH SCHEMABINDING AS
SELECT	 Count_Big(*)	AS [Count]
	,T1.ID - T2.ID	AS Shift
FROM	     dbo.Tbl1 T1
	JOIN dbo.Tbl2 T2 ON T2.Value = T1.Value
GROUP BY T1.ID - T2.ID
GO
CREATE UNIQUE CLUSTERED INDEX PK_vwSubSequence ON dbo.vwSubSequence ([Shift])
CREATE UNIQUE INDEX IX_vwSubSequence ON dbo.vwSubSequence ([Count],[Shift])
GO
-------------------------------------------------------------------------------------
INSERT	dbo.Tbl1 (ID, Value)
SELECT	Top(1000000)
	 Row_Number()OVER(ORDER BY (SELECT NULL))
	,CheckSum(NewID())
FROM	 master.dbo.spt_values v1
	,master.dbo.spt_values v2
	,master.dbo.spt_values v3

INSERT	dbo.Tbl2 (ID, Value)
SELECT	 Row_Number()OVER(ORDER BY (SELECT NULL))
	,Value
FROM	dbo.Tbl1
ORDER BY CheckSum(NewID())
-------------------------------------------------------------------------------------
GO
SELECT	 Top(1) WITH TIES T1.[Value]
	,T1.ID - T2.ID	AS Offset
	,Count(*)OVER(PARTITION BY T1.ID - T2.ID)
FROM	     dbo.Tbl1 T1
	JOIN dbo.Tbl2 T2 ON T2.[Value] = T1.[Value]
ORDER BY Count(*)OVER(PARTITION BY T1.ID - T2.ID) DESC
	,T1.ID - T2.ID
-------------------------------------------------------------------------------------
GO
SELECT Top(1) * FROM dbo.vwSubSequence ORDER BY [Count] DESC
GO
DROP VIEW dbo.vwSubSequence
DROP TABLE dbo.Tbl1
DROP TABLE dbo.Tbl2
Лимон на лимон, отрабатывает за секунду, полторы.
ValueOffsetCount
572915598-1300529
912702604-1300529
-126644897-1300529
-783718110-1300529
-1196729084-1300529
-1150207238-1300529
421408485-1300529
1391979537-1300529
1170469489-1300529
Через представление ещё в 10 раз быстрее.
SELECT	*
FROM	(SELECT	Top(1) * FROM dbo.vwSubSequence ORDER BY [Count] DESC)S
	CROSS JOIN dbo.Tbl1 T1
	      JOIN dbo.Tbl2 T2 ON T2.ID = T1.ID - S.Shift AND T2.Value = T1.Value

Но это всё на рандомных данных.
21 май 12, 15:38    [12589521]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleonov
Mnior, утешьтесь
Вообще то нечем..
CTE тормозит и замены не всегда найдётся.
Вы "на диалог" "не выходите". И не особо рвётесь желанием формально написать здесь на форуме в чём сыр бор и соль. Не мы одни тут, форум общественен.
Остались несколько вопросов при котором не видно консенсус.

1. Колэйшин строк
2. В чём основной тормоз в скуле и почему
3. Описание работы алгоритмов поиска подпоследовательности и как он работает в скуле.
4. Сколько стоит вызов CLR объекта
5. На сколько в CLR выгодно считывать данные через котекст, чем передовать "запакованный".
Например, есть особенность: в 2008м в табличных CLR функций контекст вызова сохраняется только на момент вызова. А в 2005м можно было и в функции FillRow читать из коннекта.

aleonov
Я взял себе на заметку, несколько решений.
Значит не зря тут всё было.

Конечно можно ещё на оракакле померять, там должно быть намного быстрее. Но лучше не надо.
21 май 12, 15:56    [12589692]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
ProbationerORA
Member

Откуда:
Сообщений: 22
а почему нельзя обратиться к этим таблицам внутри самой ассембли?
21 май 12, 16:02    [12589758]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ProbationerORA, ну скрипт был приведён: 12583859
Только лично как-то лень с CLR возиться.
21 май 12, 16:12    [12589860]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Mnior
aleonov
Mnior, утешьтесь
Вообще то нечем..
CTE тормозит и замены не всегда найдётся.
Вы "на диалог" "не выходите". И не особо рвётесь желанием формально написать здесь на форуме в чём сыр бор и соль. Не мы одни тут, форум общественен.
Остались несколько вопросов при котором не видно консенсус.

1. Колэйшин строк
2. В чём основной тормоз в скуле и почему
3. Описание работы алгоритмов поиска подпоследовательности и как он работает в скуле.
4. Сколько стоит вызов CLR объекта
5. На сколько в CLR выгодно считывать данные через котекст, чем передовать "запакованный".
Например, есть особенность: в 2008м в табличных CLR функций контекст вызова сохраняется только на момент вызова. А в 2005м можно было и в функции FillRow читать из коннекта.

aleonov
Я взял себе на заметку, несколько решений.
Значит не зря тут всё было.

Конечно можно ещё на оракакле померять, там должно быть намного быстрее. Но лучше не надо.



Mnior,

Хоть вас и заносит, но похоже что вы умеете и нормальный тон в дискусии держать, надеюсь что я не ошибаюсь.
1. Колэйшин строк - ни причем
2. Работа с массивом памяти и строками. ок, со строками разобрались, отлично, xml может парсить не хуже (лучше ) CLR.
Память - если все же перейдете по ссылке на википедию и почитаете реализацию алгоритма поиска подпоследовательности, то поймете что нужен массив, коим с определенными оговорками является табличная переменная, так вот при решении возникает необходимость обновлять последовательно большой массив данных в табличной переменной и вот здесь то наступает жуткий тормоз. Статистику я уже приводил несколькими постами выше. 7 мин на 24 процессорах на сравнении двух массивов по 10000 записей в каждом.
3. Если интересно, могу скинуть только неотлаженный код, поскольку я забросил его ввиду бесперспективности.
4. +
+ Тут гора кода
Вырезано. Переехало в 12592852


SQL Server Execution Times:
CPU time = 2464 ms, elapsed time = 5980 ms на SQL Expresse, рабочий сервер даже не замечает этого запроса.

Можно сделать и быстрее, но пока с этим не заморачивался нужны хоть какие-нибудь правильные результаты

5. Пока не пробовал, собираюсь опробовать на задаче 3, которую даже боюсь сюда выкладывать иначе времени на разработку не останется :-)

Сообщение было отредактировано: 22 май 12, 13:32
21 май 12, 16:41    [12590071]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
2aleonov: имейте совесть, убирайте ваши портянки или в тег spoiler, или, что еще лучше, в аттач.
21 май 12, 16:49    [12590143]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Я извиняюсь за длинный текст предыдущего поста, к сожалению не смог найти опцию редактирования. ткните если есть такая возможность..

кому интересно, это результат сравнения предыдущего примера.
+
+ Опять простыня
Вырезано. Простыни надо аккуратно укладывать в аттач.


Сообщение было отредактировано: 22 май 12, 13:33
21 май 12, 16:51    [12590170]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Гавриленко Сергей Алексеевич
2aleonov: имейте совесть, убирайте ваши портянки или в тег spoiler, или, что еще лучше, в аттач.



буду иметь ввиду.. встречное предложение, добавьте опцию редактирование собственного поста.
21 май 12, 16:55    [12590210]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
aleonov
к сожалению не смог найти опцию редактирования. ткните если есть такая возможность..

Есть опция Предварительный просмотр
21 май 12, 16:57    [12590227]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
aleonov
буду иметь ввиду.. встречное предложение, добавьте опцию редактирование собственного поста.

Почитайте FAQ
21 май 12, 16:57    [12590234]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
aleonov
Я извиняюсь за длинный текст предыдущего поста,
<.. и ещё 10 км текста ..>


классная шутка.

опции редактирования своих постов на этом форуме нет. есть опция предварительного просмотра и тег spoiler
21 май 12, 16:57    [12590235]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
aleonov
буду иметь ввиду.. встречное предложение, добавьте опцию редактирование собственного поста.
Я не являюсь разработчиком этого форума, чтобы что-то сюда добавлять. А вот теги, как и кнопку "предварительный просмотр", рекомендую освоить. Потому что в следующий раз я такую простыню просто удалю.
21 май 12, 17:06    [12590340]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Shakill
aleonov
Я извиняюсь за длинный текст предыдущего поста,
<.. и ещё 10 км текста ..>


классная шутка.

опции редактирования своих постов на этом форуме нет. есть опция предварительного просмотра и тег spoiler


шутка, то что редактирование недоступно, а также то что нигде нет ссылок на правила использования.
21 май 12, 17:40    [12590562]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
aleonov
шутка, то что редактирование недоступно, а также то что нигде нет ссылок на правила использования.


правила нашел в списке форумов, неплохо было поместить на главную страницу.
21 май 12, 17:46    [12590586]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleonov
1. Колэйшин строк - ни причем
Ну имелось ввиду что некоторые не учитывают, что при передачи строк между системами (типами переменных) происходит не тупо предача ссылки на кусок памяти, а посимвольное перекодирование из колейшина одной среды (типа переменной) в колэйшн другой (не говоря о копировании). И это тоже ест ресурсы. Если передаётся VarChar SQL в String C# к примеру. Разве что не помню совпадает ли колешн уникодов (SQL и C#).
aleonov
если все же перейдете по ссылке на википедию и почитаете реализацию алгоритма поиска подпоследовательности
Да заходил, как только упомянули в первый раз, не бойтесь.
aleonov
то поймете что нужен массив
Нет. Не обязательно. Алгоритмы не передают суть задачи. Аллритм это компиляция задачи под конкретную среду и начальные условия. Для декларативиста алгоритм это поверхостный взгляд.
Массив есть - тот же индекс это массив.
aleonov
при решении возникает необходимость обновлять последовательно большой массив данных
Да, так работает тот алгоритм. Он не идеален и разрабатывался под специфические условия. Там даётя начальные голые массивы.

Основной задачей оптимизации эффективной разработки системы это правильное распределение нагрузки во времени и по месту. Мы может регулироват памятью, CPU, местом и временем при решении задач. В зависимости от начальных данных мы и регулирум перенося нагрузку с одного показателя на другой. Мы мошем кегировать вичисления (CPU) на диск, или наоборот, освобождая память на перевычисления. Делая вычисления заранее или оставляя на "последный момент".

--------------------------------------------------------------------------------------------------------------------
Ну на вашем примере через представление отрабатывает всё мгновенно. Это понятно.
Смещение = -89, Количество = 2081.
Но это не интересно. Надо же поисследовать.

Что вставка в эти 4 индекса (2 из которых лишних) вставляет гдето 23 секунды. Дело не в индексах, они отрабатывают доли секунды, дело в подсчёте представления.
Что запрос в лоб (не через представления) отрабатывает где-то за 26 секунд. Жрёт памяти жутко, т.к. для каждой комбины хранится все её значение. Оптимистическая стратения.

Если убрать индексацию представления (или поставить Expand Views), то запрос отрабатывает за 5 секунд (вставка данных конечно мгновенно). Пессимистический вариант, сначала находится комбина, и лишь потом выдаются по ней список элементов. Память зря не ест.

Что показалось странным. Данный случай данных вырожденный. В нём только около 20ти значений, многократно продублированный на 10тыс строк. Комбинаций порядка 18 лямов. Притом первые 6 значений занимают 95%, а перные 3 около 60%.
Находить комбинацию на этих данных не вижу никого практического смысла.

Не сходится с результатом TC. Значит или задача поставлена не верно. Или что-то тут не то.
Что в принципе ожидаемо, чел же невнимателен и не хочет читать чужое. Это нормально с такнкистами всегда так.
Моя невнимательность (очевидно что "подпоследовательность по смещению" алгоритмически меньше чем "подпоследовательность по ряду") и ошибка в предположении (какое условие такие и предположения). Ссори.
Хотя я всё ещё считаю, что представленный алгоритм не есть лучший.

Ок. Значит это задача подобие "Расстояния Левенштейна". Довольно сложная задача для быстрого поиска.
Не думаю что на скуле такую задачу можно решить, сиквненсы это слабое место. Но подуммаю.
Жаль что 2012 нет под рукой.
--------------------------------------------------------------------------------------------------------------------

Гавриленко Сергей Алексеевич, можете вырезать из текстов простыню. В приложенном файле всё есть.

К сообщению приложен файл (Ins.zip - 12Kb) cкачать
22 май 12, 11:16    [12592852]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Mnior
Если передаётся VarChar SQL в String C# к примеру. Разве что не помню совпадает ли колешн уникодов (SQL и C#).


для юникодов коллейшн не важен, и поэтому перекодирования не происходит.

Mnior
Аллритм это компиляция задачи под конкретную среду и начальные условия. Для декларативиста алгоритм это поверхостный взгляд.
Массив есть - тот же индекс это массив.
aleonov
при решении возникает необходимость обновлять последовательно большой массив данных
Да, так работает тот алгоритм. Он не идеален и разрабатывался под специфические условия. Там даётя начальные голые массивы.


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

Mnior
Основной задачей оптимизации эффективной разработки системы это правильное распределение нагрузки во времени и по месту. Мы может регулироват памятью, CPU, местом и временем при решении задач. В зависимости от начальных данных мы и регулирум перенося нагрузку с одного показателя на другой. Мы мошем кегировать вичисления (CPU) на диск, или наоборот, освобождая память на перевычисления. Делая вычисления заранее или оставляя на "последный момент".


ну, с этим вряд ли кто поспорит.

Mnior
Что показалось странным. Данный случай данных вырожденный. В нём только около 20ти значений, многократно продублированный на 10тыс строк. Комбинаций порядка 18 лямов. Притом первые 6 значений занимают 95%, а перные 3 около 60%.
Находить комбинацию на этих данных не вижу никого практического смысла.

Не сходится с результатом TC. Значит или задача поставлена не верно. Или что-то тут не то.
Что в принципе ожидаемо, чел же невнимателен и не хочет читать чужое. Это нормально с такнкистами всегда так.
Моя невнимательность (очевидно что "подпоследовательность по смещению" алгоритмически меньше чем "подпоследовательность по ряду") и ошибка в предположении (какое условие такие и предположения). Ссори.
Хотя я всё ещё считаю, что представленный алгоритм не есть лучший.

Ок. Значит это задача подобие "Расстояния Левенштейна". Довольно сложная задача для быстрого поиска.
Не думаю что на скуле такую задачу можно решить, сиквненсы это слабое место. Но подуммаю.
Жаль что 2012 нет под рукой.



интересно посмотреть на результаты, что-то очень похожее на результаты третьей задачи, которой занимаюсь в данный момент. те наборы чисел, это выбор конкретного пользователя ссылки на вебсайте. задача найти определенные шаблоны(последовательные) действий пользователя.
22 май 12, 13:30    [12594184]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Mnior
Гавриленко Сергей Алексеевич, можете вырезать из текстов простыню. В приложенном файле всё есть.
Убрал.
22 май 12, 13:34    [12594221]     Ответить | Цитировать Сообщить модератору
 Re: Передача табличной переменной в assembly процедуру  [new]
aleonov
Member

Откуда:
Сообщений: 96
Mnior
Ок. Значит это задача подобие "Расстояния Левенштейна". Довольно сложная задача для быстрого поиска.
Не думаю что на скуле такую задачу можно решить, сиквненсы это слабое место. Но подуммаю.
Жаль что 2012 нет под рукой.



Желательно с разумным объяснением, почему такую задачку нельзя решить на скуле.

Возможные варианты ответов:
1. Скуль тормозит.
2. Отсутствие функционала/типа данных.
3. Не позволяет декларативный подход
......
22 май 12, 16:31    [12595858]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить