Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
maxandsoft
Member

Откуда:
Сообщений: 343
Имеется процедура

ALTER PROCEDURE [dbo].[SetSMSResult_1](@XML XML)
AS
BEGIN
	SET NOCOUNT ON;   
	SET ARITHABORT ON;   
	SET DATEFORMAT dmy;   
	SET TRANSACTION ISOLATION LEVEL SNAPSHOT;      
	DECLARE @RowCount INT   
	SET @RowCount = 0   
	SELECT list.Row.value('@id', 'int') [id],
	       list.Row.value('@status', 'int') [status],
	       list.Row.value('@dt', 'datetime') [dt],
	       list.Row.value('@code', 'int') [code]
	       INTO #debt_sms
	FROM   @XML.nodes('/ROWS/row') AS list(Row)
	
	CREATE CLUSTERED INDEX #IX_debt_sms ON #debt_sms(id);    
	
	DECLARE @MaxID INT   
	DECLARE @DID INT
	DECLARE @cnt INT   
	SET @cnt = 0;     
	SET @MaxID = (
	        SELECT MAX(id)
	        FROM   #debt_sms
	    )
	
	SET @DID = 0         
	WHILE @DID < @MaxID
	BEGIN
	    SELECT @cnt = COUNT(*)
	    FROM   (
	               SELECT TOP 100 * 
	               FROM   #debt_sms
	           ) AS hui
	    --PRINT @cnt
	    UPDATE dbo.debt_sms
	    SET    debt_sms.[dt] = ds.[dt],
	           debt_sms.[status] = ds.[status],
	           debt_sms.[code] = ds.[code] 
	           --   , debt_sms.[text]   = xmldoc.[text] /*CONVERT(varchar(10),getdate(),104)+' '+CONVERT(varchar(8),getdate(),114)+' '+*/
	    FROM   (
	               SELECT TOP 100 *
	               FROM   #debt_sms
	           ) AS ds
	    WHERE  debt_sms.id = ds.id
	    
	    SELECT TOP 100 *
	    FROM   #debt_sms
	    
	    SET @RowCount = @RowCount + @cnt              
	    
	    DELETE TOP(99)
	    FROM   #debt_sms
	    
	    
	    SET @DID = (
	            SELECT TOP 1 id
	            FROM   #debt_sms
	        ) -1
	    
	    DELETE TOP(1)
	    FROM   #debt_sms
	           
	END 
	
	RETURN(@RowCount)
END   


Если читать инструкцию TSQL то TOP возвращает произвольно записи, но тестируя данную процедуру он выдает именно последовательно возрастанием по ID

Имеет ли смысл ее переписывать или оставить как есть? ести ли подводные камни с TOP?
13 июл 12, 16:32    [12864197]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
maxandsoft
Если читать инструкцию TSQL то TOP возвращает произвольно записи, но тестируя данную процедуру он выдает именно последовательно возрастанием по ID

Потому что у вас единственный кластерный индекс.
Будут другие индексы и не * в запросе - можете получить и другие результаты
13 июл 12, 16:35    [12864221]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
Glory
maxandsoft
Если читать инструкцию TSQL то TOP возвращает произвольно записи, но тестируя данную процедуру он выдает именно последовательно возрастанием по ID

Потому что у вас единственный кластерный индекс.
Будут другие индексы и не * в запросе - можете получить и другие результаты

и даже при Кластеред Индекс Скан может идти не с "начала" а с "середины"....
читаем карусельное чтение
13 июл 12, 16:46    [12864312]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
maxandsoft
Member

Откуда:
Сообщений: 343
Ivan Durak
Glory
пропущено...

Потому что у вас единственный кластерный индекс.
Будут другие индексы и не * в запросе - можете получить и другие результаты

и даже при Кластеред Индекс Скан может идти не с "начала" а с "середины"....
читаем карусельное чтение


То есть данная процедура не корректна и в итоге может привести к некорректности UPDATE?

А ORDER BY если добавить, то соответственно увеличится скорость выполнения. Особенно если на подаче будет объем строк а у нас в среднем более 100000 строк подаеться
13 июл 12, 17:16    [12864518]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
maxandsoft
Ivan Durak
пропущено...

и даже при Кластеред Индекс Скан может идти не с "начала" а с "середины"....
читаем карусельное чтение


То есть данная процедура не корректна и в итоге может привести к некорректности UPDATE?

А ORDER BY если добавить, то соответственно увеличится скорость выполнения. Особенно если на подаче будет объем строк а у нас в среднем более 100000 строк подаеться

Да, логика на TOP без ордера - в принципе не корректна.
Но если добавить ORDER BY по кластерному индексу скорость не пострадает!!!
13 июл 12, 17:18    [12864533]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по поводу использования TOP в SELECT и UPDATE  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ivan Durak
Но если добавить ORDER BY по кластерному индексу скорость не пострадает!!!
Для данного случая возможно, но в общем может и пострадать.
13 июл 12, 20:15    [12865161]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить