Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Bug (оконные функции+nolock?) в 2008-ом.  [new]
MSSQLBug
Guest
В продолжение темы:
https://www.sql.ru/forum/actualthread.aspx?tid=987349

Вроде удалось воспроизвести ошибку на 2008.
Подготовка данных:
select *, 1 as RestQ into dbo.GenRestA
from
	(
	select 'i'+v1.num+v2.num+v3.num as Itemid
	from 
	 (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0')) v1 (num)
	 INNER JOIN 
	 (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0')) v2 (num)
	 ON 1=1
	 INNER JOIN 
	 (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0')) v3 (num)
	 ON 1=1	 
	 ) as items,
	(
	select 'l'+v1.num+v2.num as Inventlocationid
	from 
	 (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0')) v1 (num)
	 INNER JOIN 
	 (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0')) v2 (num)
	 ON 1=1
	 ) as locs,
	(
	select CAST('20010101' as smalldatetime)+10*v1.num+v2.num as RDate
	from 
	 (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (0)) v1 (num)
	 INNER JOIN 
	 (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (0)) v2 (num)
	 ON 1=1
	 ) as dates
	 
CREATE UNIQUE CLUSTERED INDEX idx_main ON GenRestA(Inventlocationid, Itemid, RDate desc)	 

select Itemid into dbo.Items
from (values ('i000'), ('i001')) v1 (Itemid)

CREATE UNIQUE CLUSTERED INDEX idx1 ON Items(Itemid)

select Inventlocationid into dbo.InvLocs
from (values ('l00'), ('l01')) v1 (Inventlocationid)

CREATE UNIQUE CLUSTERED INDEX idx1 ON InvLocs(Inventlocationid)


Далее выполнить запрос с HINT-ами и без (например, (OPTION (MERGE JOIN)):
select *
from (
SELECT Itemid, Inventlocationid, RestQ,
       ROW_NUMBER() OVER (PARTITION BY Inventlocationid, Itemid ORDER BY RDate DESC) Rnk
FROM dbo.GenRestA (nolock)
where RDate<='2001-02-10'
) as one
WHERE Rnk = 1 and RestQ<>0
  and exists (select 1 from InvLocs as il (nolock) where one.Inventlocationid=il.Inventlocationid)
  and exists (select 1 from Items as it (nolock) where one.Itemid=it.Itemid)
order by Itemid


Ещё я заметил, что, если убрать HINT-ы (nolock) и выполнять на уровне READ COMMITED, баг проявляется, а если на READ UNCOMMITTED --- то нет, причём даже при том же самом плане запроса.
3 дек 12, 14:58    [13568824]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
Crimean
Member

Откуда:
Сообщений: 13147
как-то не очень результаты отличаются. что не так делаю?
3 дек 12, 16:09    [13569467]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
MSSQLBug
Guest
Crimean, а какая у Вас версия SQL Server и планы запросов?

У меня:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)   Apr  2 2010 15:53:02   Copyright (c) Microsoft Corporation  Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) 


Запроса без HINT-ов:
  |--Sort(ORDER BY:([AxPan].[dbo].[GenRestA].[Itemid] ASC))
       |--Hash Match(Inner Join, HASH:([it].[Itemid])=([AxPan].[dbo].[GenRestA].[Itemid]), RESIDUAL:([AxPan].[dbo].[GenRestA].[Itemid]=[AxPan].[dbo].[Items].[Itemid] as [it].[Itemid]))
            |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[Items].[idx1] AS [it]))
            |--Merge Join(Inner Join, MERGE:([il].[Inventlocationid])=([AxPan].[dbo].[GenRestA].[Inventlocationid]), RESIDUAL:([AxPan].[dbo].[GenRestA].[Inventlocationid]=[AxPan].[dbo].[InvLocs].[Inventlocationid] as [il].[Inventlocationid]))
                 |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[InvLocs].[idx1] AS [il]), ORDERED FORWARD)
                 |--Filter(WHERE:([Expr1003]=(1) AND [AxPan].[dbo].[GenRestA].[RestQ]<>(0)))
                      |--Sequence Project(DEFINE:([Expr1003]=row_number))
                           |--Segment
                                |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[GenRestA].[idx_main]), WHERE:([AxPan].[dbo].[GenRestA].[RDate]<='2001-10-02 00:00:00.000'))


С OPTION(MERGE JOIN):
  |--Sort(ORDER BY:([AxPan].[dbo].[GenRestA].[Itemid] ASC))
       |--Merge Join(Inner Join, MERGE:([il].[Inventlocationid])=([AxPan].[dbo].[GenRestA].[Inventlocationid]), RESIDUAL:([AxPan].[dbo].[GenRestA].[Inventlocationid]=[AxPan].[dbo].[InvLocs].[Inventlocationid] as [il].[Inventlocationid]))
            |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[InvLocs].[idx1] AS [il]), ORDERED FORWARD)
            |--Sort(ORDER BY:([AxPan].[dbo].[GenRestA].[Inventlocationid] ASC))
                 |--Merge Join(Inner Join, MERGE:([it].[Itemid])=([AxPan].[dbo].[GenRestA].[Itemid]), RESIDUAL:([AxPan].[dbo].[GenRestA].[Itemid]=[AxPan].[dbo].[Items].[Itemid] as [it].[Itemid]))
                      |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[Items].[idx1] AS [it]), ORDERED FORWARD)
                      |--Sort(ORDER BY:([AxPan].[dbo].[GenRestA].[Itemid] ASC))
                           |--Filter(WHERE:([Expr1003]=(1) AND [AxPan].[dbo].[GenRestA].[RestQ]<>(0)))
                                |--Sequence Project(DEFINE:([Expr1003]=row_number))
                                     |--Segment
                                          |--Clustered Index Scan(OBJECT:([AxPan].[dbo].[GenRestA].[idx_main]),  WHERE:([AxPan].[dbo].[GenRestA].[RDate]<='2001-10-02 00:00:00.000') ORDERED FORWARD)


Кстати, я перепутал уровни изоляции в предыдущем сообщении --- на UNCOMMITTED проявляется, на READ COMMITTED --- нет.
3 дек 12, 16:30    [13569682]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2806.0 (X64)
3 дек 12, 16:39    [13569749]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
MSSQLBug
Guest
Crimean, а вот ссылка, там воспроизводится: http://sqlfiddle.com/#!3/221df/2/1
(Пробовать с OPTION и без). А у Вас какие планы запросов?
3 дек 12, 16:53    [13569904]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
Crimean
Member

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

ну так там тоже непатченый. на нем и онлайн индексация базу разваливала и чо теперь?
3 дек 12, 16:56    [13569942]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> причём даже при том же самом плане запроса

совсем-совсем том же самом? мой хрустальный шар говорит, что для
read committed у скана

Clustered Index Scan(OBJECT:([AxPan].[dbo].[GenRestA].[idx_main]), WHERE:([AxPan].[dbo].[GenRestA].[RDate]<='2001-10-02 00:00:00.000'))

появляется свойство ORDERED FORWARD. нет?
3 дек 12, 17:00    [13569995]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ок, получил я разницу в планах:

                           |--Sequence Project(DEFINE:([Expr1003]=row_number))
                                |--Segment
                                     |--Sort(ORDER BY:([a1].[dbo].[GenRestA].[Inventlocationid] ASC, [a1].[dbo].[GenRestA].[Itemid] ASC, [a1].[dbo].[GenRestA].[RDate] DESC))
                                          |--Clustered Index Scan(OBJECT:([a1].[dbo].[GenRestA].[idx_main]), WHERE:([a1].[dbo].[GenRestA].[RDate]<='2001-02-10 00:00:00.000'))

                           |--Sequence Project(DEFINE:([Expr1003]=row_number))
                                |--Segment
                                     |--Clustered Index Scan(OBJECT:([a1].[dbo].[GenRestA].[idx_main]),  WHERE:([a1].[dbo].[GenRestA].[RDate]<='2001-02-10 00:00:00.000') ORDERED FORWARD)


только данные опять одинаковые
3 дек 12, 17:10    [13570081]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
MSSQLBug
Guest
Crimean, и ничо, спасибо за проверку. ;) У нас я нашёл только эту версию 2008-го, DBA "вовремя" обновляют, что тут скажешь. В общем, проблема, очевидно, уже решена в SP1 для 2008. Похоже на: http://support.microsoft.com/kb/2546901
Жаль, что для 2005-го исправления, видимо, нет. :(
3 дек 12, 17:24    [13570189]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ага. либо ордеред скан, либо сортировка. а у автора в первом плане (без HINT-ов) ни того, ни другого.
ну да - была, видимо, в rtm бага. но уж сколько тому rtm-у.
3 дек 12, 17:25    [13570190]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
MSSQLBug
Guest
daw, хрустальный шар врёт! ;) Планы идентичны, ничего не появляется.
3 дек 12, 17:32    [13570264]     Ответить | Цитировать Сообщить модератору
 Re: Bug (оконные функции+nolock?) в 2008-ом.  [new]
Maxx
Member [скрыт]

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

вы последнее сообщение от Crimean прочитаейте внимательно..до конца всмысле :)
4 дек 12, 12:19    [13574197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить