Манические таблицы MS SQL

User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle wrote:Где я в своих рассуждениях ошибся?

Коротко - нигде. Дело в том, что sys.fn_indexinfo возвращает количество leaf pages. Так что это баг в этой функции. Она должна либо возвращать полное количество страниц (тогда бы Вы и увидели разницу), либо колонка должна называться leaf_pages, а не просто pages. Кстати, спасибо за вопрос - Вы первый, кто это заметил. Во всяком случае я не нашёл, чтобы этот баг уже был зафайлен. Так что завтра "обрадую" теперешнего владельца этого кода (3 года назад это был частично мой код - но это точно не мой баг :) ).

А вот sys.sysindexes действительно показывает больше информации. dpages - это leaf pages, а used = dpages + internal pages. Откуда internal pages = used - dpages. Разница небольшая потому, что, во-первых у Вас varchar (50), который на самом деле занимает ровно столько, сколько символов в NewID(). Замените его на fixed length char (800) и сразу увидите другие результаты. Во-вторых, fanout внутренней страницы индекса не бывает меньше 8-9, то есть в самом худшем случае, overhead на внутренние страницы не может быть больше, чем примерно 12-13% от общего объёма данных. Т.е. не стоит расчитыват на то, что выйгрыш от include будет больше этого значения.

Но для очень больших объёмов данных, эти десять процентов могут быть критичны.
Cheers
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

А вот еще бага
При попытке изменить пароль пользователя (не под sa) если активирована approle, выдается ошибка (у меня по фр) что "не могу использовать USE если активирована approle". Пароль при этом меняется.

Вскрытие показало что ошибка возникает в месте помеченном ***, то есть ПОСЛЕ смены пароля
Насколько эту ошибку можно игнорировать ?

Code: Select all

    -- CHANGE THE PASSWORD --
    update master.dbo.sysxlogins
   set password = convert(varbinary(256), pwdencrypt(@new)), xdate2 = getdate(), xstatus = xstatus & (~2048)
   where name = @loginame and srvid IS NULL

   -- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --
   exec('use master grant all to null') -- ***********************************

Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Dmitry67 wrote:А вот еще бага...
Спасибо, я перешлю и это тоже.
Cheers
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

tengiz wrote:Дело в том, что sys.fn_indexinfo возвращает количество leaf pages. Так что это баг в этой функции. Она должна либо возвращать полное количество страниц (тогда бы Вы и увидели разницу), либо колонка должна называться leaf_pages, а не просто pages.

Update: согласно владельцу, в документации к sys.fn_indexinfo однозначно сказано, что речь идёт о data pages. Поэтому формально всё в порядке. Но они рассмотрят вариант добавления колонки с полным количеством страниц.
Cheers
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

Спасибо Tengiz, а то я уже начал сомневаться... ;)
Понятно, что боее-менее заметный эффект от использования index include будет только на больших объемах, но не обнаружив вообще никаких отличий, на вообщем-то не маленькой табличке, я уже не знал что и думать..
К тому же сбило с толку, что старая табличка sysindexes что-то все же показывает, а новая - sys.indexes - нет...

Return to “Вопросы и новости IT”