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

Откуда:
Сообщений: 692
Привет всем!

Подскажите плз, какие нужно создать индексы на таблицах. Привожу скрипт создания табличной функции, которая использует таблицы, где пока нет индексов:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[ubki_transpose] (@StatementID varchar(36), @rowbeg int, @rowend int, @Ref varchar(40))
RETURNS @Result TABLE
(StatementID varchar(36), [1] int, [2] int, [3] int, [4] int, [5] int, [6] int)
AS
BEGIN
    insert into @Result 
select StatementID, [1], [2], [3], [4], [5], [6] from (
 select ranks, id, StatementID from (
  select rank() OVER (order by u.Year, u.Month, u.id asc) as ranks, u.id, u.StatementID, u.Year, u.Month, 
  rtrim(convert(varchar,COALESCE (u.Year, '')) + convert(varchar,COALESCE (u.Month, ''))) 
  as period from 
    (select y.rankd, y.id, y.StatementID, y.Year, y.Month from
      (select rank() OVER (order by t.Year, t.Month, t.id asc) as rankd, 
       t.id, t.StatementID, t.Year, t.Month from (
          select d.id, d.StatementID, d.Year, d.Month, count(1) as cnt
          from vUbkiR_R6 as d where (StatementID = CONVERT(varchar(36), @StatementID) 
           and (Reference = CONVERT(varchar(40),substring(@Ref+'                                        ',1,40))))
          group by d.id, d.StatementID, d.Year, d.Month) 
       as t) as y
  where y.rankd between @rowbeg and @rowend) as u) as j) as k
PIVOT (max(id) for ranks in ([1], [2], [3], [4], [5], [6])) as s
RETURN 
END
GO

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO


В SQL Server я новичёк, помогите кто может плз.
29 мар 13, 16:52    [14113970]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
только для начала на табличную функцию перейти
create FUNCTION [dbo].[ubki_transpose] (@StatementID varchar(36), @rowbeg int, @rowend int, @Ref varchar(40))
RETURNS TABLE

AS

return   
select StatementID, [1], [2], [3], [4], [5], [6] from (
 select ranks, id, StatementID from (
  select rank() OVER (order by u.Year, u.Month, u.id asc) as ranks, u.id, u.StatementID, u.Year, u.Month, 
  rtrim(convert(varchar,COALESCE (u.Year, '')) + convert(varchar,COALESCE (u.Month, ''))) 
  as period from 
    (select y.rankd, y.id, y.StatementID, y.Year, y.Month from
      (select rank() OVER (order by t.Year, t.Month, t.id asc) as rankd, 
       t.id, t.StatementID, t.Year, t.Month from (
          select d.id, d.StatementID, d.Year, d.Month, count(1) as cnt
          from vUbkiR_R6 as d where (StatementID = CONVERT(varchar(36), @StatementID) 
           and (Reference = CONVERT(varchar(40),substring(@Ref+'                                        ',1,40))))
          group by d.id, d.StatementID, d.Year, d.Month) 
       as t) as y
  where y.rankd between @rowbeg and @rowend) as u) as j) as k
PIVOT (max(id) for ranks in ([1], [2], [3], [4], [5], [6])) as s
29 мар 13, 17:07    [14114060]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
нифига себе функции создают новички
29 мар 13, 17:09    [14114074]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
ecivgamer
Member

Откуда:
Сообщений: 692
Паганель
нифига себе функции создают новички


Да на оракле уже некоторое время говнокодирую, а в sql server действительно новичёк.

Уточню вопрос:

по ходу видно, что индексы нужны по колонкам StatementID, Reference вьюхи vUbkiR_R6, однако не знаю как создать индексы с учётом того, что обращение WHERE идёт вот так:

CONVERT(varchar(36), @StatementID)
CONVERT(varchar(40),substring(@Ref+' ',1,40))

Есть идеи?
29 мар 13, 17:14    [14114096]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
ecivgamer
Паганель
нифига себе функции создают новички


Да на оракле уже некоторое время говнокодирую, а в sql server действительно новичёк.

Уточню вопрос:

по ходу видно, что индексы нужны по колонкам StatementID, Reference вьюхи vUbkiR_R6, однако не знаю как создать индексы с учётом того, что обращение WHERE идёт вот так:

CONVERT(varchar(36), @StatementID)
CONVERT(varchar(40),substring(@Ref+' ',1,40))

Есть идеи?

это для индексов не проблема
create index myindex  on  vUbkiR_R6 (StatementID,Reference ) include(year,month,id)
29 мар 13, 17:17    [14114109]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
и кстати StatementID и reference это это поля varchar типа? Если так, то
автор
CONVERT(varchar(36), @StatementID)
CONVERT(varchar(40),substring(@Ref+' ',1,40))
не проблема
29 мар 13, 17:20    [14114114]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ecivgamer
CONVERT(varchar(36), @StatementID)

Несколько странное преобразование, учитывая, что @StatementID и так имеет тип varchar(36).

ecivgamer
CONVERT(varchar(40),substring(@Ref+'                                        ',1,40))

А это для чего?

ecivgamer
по ходу видно, что индексы нужны по колонкам StatementID, Reference вьюхи vUbkiR_R6, однако не знаю как создать индексы с учётом того, что обращение WHERE идёт вот так:

Почему-то я так и подумал, что vUbkiR_R6 — это представление :-)
Создавайте индексы так, как будто обращение WHERE идёт "как обычно", т.е. "WHERE StatementID = @A AND Reference = @B". Вот если бы вы применяли какие-то функции/преобразования к StatementID и Reference, тогда надо было бы думать.
29 мар 13, 17:22    [14114124]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Мистер Хенки
это для индексов не проблема
create index myindex  on  vUbkiR_R6 (StatementID,Reference ) include(year,month,id)

Не пройдёт, если vUbkiR_R6 — неиндексированная вьюха :)
29 мар 13, 17:29    [14114156]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Гость333
Мистер Хенки
это для индексов не проблема
create index myindex  on  vUbkiR_R6 (StatementID,Reference ) include(year,month,id)

Не пройдёт, если vUbkiR_R6 — неиндексированная вьюха :)

ну так автор собрался ее индексировать, следовательно у нас индексированная вьюха.
29 мар 13, 17:34    [14114172]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
ecivgamer
Member

Откуда:
Сообщений: 692
Гость333
ecivgamer
CONVERT(varchar(40),substring(@Ref+'                                        ',1,40))

А это для чего?


Там особый случай, когда длина колонки больше, чем 40 символов, однако оговоренная длина значения именно 40. Обезопасились, так сказать.
29 мар 13, 17:48    [14114221]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ecivgamer
Там особый случай, когда длина колонки больше, чем 40 символов, однако оговоренная длина значения именно 40. Обезопасились, так сказать.

Ничего не понял. Длина колонки Reference больше, чем 40 символов? А что такое "оговоренная длина значения"?

Подсказка: две строки в T-SQL считаются равными, если они отличаются только количеством конечных пробелов.
29 мар 13, 18:20    [14114353]     Ответить | Цитировать Сообщить модератору
 Re: создание индексов  [new]
ecivgamer
Member

Откуда:
Сообщений: 692
Гость333
ecivgamer
Там особый случай, когда длина колонки больше, чем 40 символов, однако оговоренная длина значения именно 40. Обезопасились, так сказать.

Ничего не понял. Длина колонки Reference больше, чем 40 символов? А что такое "оговоренная длина значения"?


То есть существует таблица для разного рода параметров, значения одних параметров могуть быть длиной 100 символов, соответственно макс.длина колонки - 100 символов. Но нужные в данный момент значения параметров могут быть длиной макс 40 символов. А так как таблица позволяет вбить бОльшее значение, то таким образом обезопасились от человеческого фактора. Хотя на оракле я бы это сделал через констрейнт для конкретного параметра. А mssql просто не знаю на достаточном уровне.


Подсказка: две строки в T-SQL считаются равными, если они отличаются только количеством конечных пробелов.


Это для меня новость, спасибо.
29 мар 13, 18:51    [14114469]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить