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

Откуда:
Сообщений: 7
Есть View с единственным полем типа varchar(40), в нем около 70'000 записей. Есть ли способ построить индекс по этому полю для ускорения поиска?
Просто создать индекс не получается, система требует иметь уникальный кластерный ключ. Добавил поле типа Binary(16), и пробую по нему сделать такой индекс, система тоже не позволяет его сделать, ругается на наличие полей типа Text, Ntext, XML, Image. Я так понимаю, что c VarChar(30) это тоже не получится сделать

Вообще, как можно оптимизировать поиск по текстовому полю? Важно наличие или отсутствие строки для поиска в данной view
3 ноя 15, 12:42    [18363693]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
adrond
Есть ли способ построить индекс по этому полю для ускорения поиска?

Индекс по представлению или по таблице ?
И как выглядит ваш "поиск" в TSQL ?

adrond
Просто создать индекс не получается, система требует иметь уникальный кластерный ключ.

Ну так в хелпе написаны все условия для создания индекса для представления.
3 ноя 15, 12:44    [18363707]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
Glory
Индекс по представлению или по таблице ?


Индекс по представлению

Glory
И как выглядит ваш "поиск" в TSQL?


Есть небольшая программа на С#
SqlCommand MySqlCommand = new SqlCommand("select count(*) from EmailView where emailstr ="+"'" + RecMail+ "'" ,myConnection);


Glory
Ну так в хелпе написаны все условия для создания индекса для представления.


В том то и проблема, что прочитав Help я не очень понимаю, как ускорить поиск в моем случае
Надеюсь, что индекс поможет ускорить выполнение запроса выше
3 ноя 15, 12:58    [18363809]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
adrond
Надеюсь, что индекс поможет ускорить выполнение запроса выше

Создайте индекс по полю таблицы
3 ноя 15, 13:02    [18363847]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
adrond
Индекс по представлению или по таблице ?

Индекс по представлению



CREATE VIEW .... WITH SCHEMABINDING


Но на вопрос "а как сделать конкретно" вы будете посланы в HELP.
Или дальше, в случае особенного упорства
3 ноя 15, 13:03    [18363855]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
adrond
в нем около 70'000 записей.

Это ж копейки!
Неужели так долго выполняется запрос подсчета записей?
Что-за система такая?
На 386SX наверно?
3 ноя 15, 13:09    [18363887]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
Отвечу сразу на все вопросы

1.
Glory
Создайте индекс по полю таблицы

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

2.
SQL2008
CREATE VIEW .... WITH SCHEMABINDING

Именно так представление и было создано

3.
SQL2008
Это ж копейки!

Действительно копейки. SQL показывает, что время выполнения этого запроса 0 сек. Но когда таких запросов несколько десятков в секунду, да и сам сервер реально нагружен, бывает, что раз в день программа на C# не дождавшись ответа от SQL закрывает запрос по timeout. Поэтому и встал вопрос ускорения, на мой взгляд присутствие индекса должно существенно ускорить выполнение запроса.
3 ноя 15, 13:42    [18364167]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
adrond
Если ничего не получится, то наверное так и сделаю. Просто эта View удобна тем, что существенно сокращает выборку (на 2 порядка) и сразу делает несколько промежуточных действий, т.е. в результирующее представление попадают не все записи первоначальной таблицы

Если вы не в курсе, запрос все равно будет к таблице
Для индексированных представлений есть ограниченное число случаев применения
И ваш в их число не входит.

adrond
Действительно копейки. SQL показывает, что время выполнения этого запроса 0 сек. Но когда таких запросов несколько десятков в секунду, да и сам сервер реально нагружен, бывает, что раз в день программа на C# не дождавшись ответа от SQL закрывает запрос по timeout. Поэтому и встал вопрос ускорения, на мой взгляд присутствие индекса должно существенно ускорить выполнение запроса.

Для этого сначала выясняют причины, а не бросаются сразу строить индексированные представления.
3 ноя 15, 13:46    [18364199]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
adrond,

А вы не хотите приделать второе поле -- хеш от строки и сделать по нему индекс? Сей фрагмент указывает на то, что с хешом будет лучше.

where emailstr ="+"'" + RecMail+ "'"
3 ноя 15, 13:46    [18364202]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
как можно оптимизировать
Guest
adrond,

автор
Добавил поле типа Binary(16), и пробую по нему сделать такой индекс, система тоже не позволяет его сделать, ругается на наличие полей типа Text, Ntext, XML, Image

автор
Просто эта View удобна тем, что существенно сокращает выборку (на 2 порядка) и сразу делает несколько промежуточных действий

есть предположение, что источник проблем - не отсутствие индекса по какому-то конкретному полю
3 ноя 15, 13:49    [18364217]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
adrond
Но когда таких запросов несколько десятков в секунду, да и сам сервер реально нагружен, бывает, что раз в день программа на C# не дождавшись ответа от SQL закрывает запрос по timeout. Поэтому и встал вопрос ускорения, на мой взгляд присутствие индекса должно существенно ускорить выполнение запроса.

Может быть вам имеет смысл посмотреть в сторону блокировок?
Изменить тип изоляции, проверить какой рекордсет используется в C# коде...
Мне почему-то кажется, что в вашем случае индексы не сильно вам помогут.
Если помогут вообще...
3 ноя 15, 13:53    [18364255]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
a_voronin
adrond,

А вы не хотите приделать второе поле -- хеш от строки и сделать по нему индекс? Сей фрагмент указывает на то, что с хешом будет лучше.

where emailstr ="+"'" + RecMail+ "'"


Кстати это идея, надо будет попробовать
3 ноя 15, 13:56    [18364281]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
SQL2008
adrond
Но когда таких запросов несколько десятков в секунду, да и сам сервер реально нагружен, бывает, что раз в день программа на C# не дождавшись ответа от SQL закрывает запрос по timeout. Поэтому и встал вопрос ускорения, на мой взгляд присутствие индекса должно существенно ускорить выполнение запроса.

Может быть вам имеет смысл посмотреть в сторону блокировок?
Изменить тип изоляции, проверить какой рекордсет используется в C# коде...
Мне почему-то кажется, что в вашем случае индексы не сильно вам помогут.
Если помогут вообще...


Это понятно, просто сперва хотел пойти по простому пути
3 ноя 15, 13:58    [18364291]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
adrond
Это понятно, просто сперва хотел пойти по простому пути

Т.е. строить индексы методом случайного тыка - это простой путь ?
3 ноя 15, 13:59    [18364300]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
Glory
adrond
Это понятно, просто сперва хотел пойти по простому пути

Т.е. строить индексы методом случайного тыка - это простой путь ?


При чем здесь простой тык?
Вообще одно из предназначений индекса это ускорение времени выполнения запроса, или я не прав?
3 ноя 15, 14:03    [18364332]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
adrond
При чем здесь простой тык?

При том, что вы ничего не знаете о причинах таймаута.
Вы просто так "тыкнули" пальцем в небо - авось индекс поможет

adrond
Вообще одно из предназначений индекса это ускорение времени выполнения запроса, или я не прав?

Ага. Универсальный рецепт - при любом падении производительности строй индекс. Причем на представлении.
3 ноя 15, 14:07    [18364354]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
Adx
Guest
adrond,
У Вас 7 млн. уникальных e-mail? Неплохая база. Уж не спамерская ли она случайно?
3 ноя 15, 19:04    [18366120]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
adrond
Есть View с единственным полем типа varchar(40), в нем около 70'000 записей. Есть ли способ построить индекс по этому полю для ускорения поиска?
Просто создать индекс не получается, система требует иметь уникальный кластерный ключ.
А эти строки уникальны? Почему бы не построить уникальный индекс по нему?

Если неуникальны, то добавьте во вьюху поле COUNT_BIG(*), и группировку по строке.
3 ноя 15, 20:01    [18366258]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
adrond
Member

Откуда:
Сообщений: 7
alexeyvg
adrond
Есть View с единственным полем типа varchar(40), в нем около 70'000 записей. Есть ли способ построить индекс по этому полю для ускорения поиска?
Просто создать индекс не получается, система требует иметь уникальный кластерный ключ.
А эти строки уникальны? Почему бы не построить уникальный индекс по нему?

Если неуникальны, то добавьте во вьюху поле COUNT_BIG(*), и группировку по строке.


Строки уникальны, проблема только в том, что я не могу строить индекс по varchar в представлении
5 ноя 15, 11:57    [18372332]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
adrond
alexeyvg
пропущено...
А эти строки уникальны? Почему бы не построить уникальный индекс по нему?

Если неуникальны, то добавьте во вьюху поле COUNT_BIG(*), и группировку по строке.


Строки уникальны, проблема только в том, что я не могу строить индекс по varchar в представлении
А я смог.

"Не смог" - можно точнее? Типа, совесть не позволила, сервер ответил ошибкой, кнопка задизейблена?

use tempdb
go
create table cu(c_id int, m_id int)
create table ma(m_id int, mail varchar(30))
go
insert cu values(1, 1), (2, 1), (3, 2)
insert ma values(1, 'mail1'), (2, 'mail2')
go
create view v
with schemabinding
as
select m.mail,  COUNT_BIG(*) as cnt
from dbo.cu as c 
	join dbo.ma as m 
	on m.m_id = c.m_id
group by m.mail
go
create unique clustered index i_v on v(mail)
go
SET SHOWPLAN_XML ON
go
select * from v where mail = 'mail1'
go
SET SHOWPLAN_XML OFF
go
drop view v
go
drop table ma
go
drop table cu
6 ноя 15, 11:00    [18377092]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к спецам по MS SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
alexeyvg
А я смог.
Это я даже продемонстрировал случай с неуникальными строками, с неуникальными ещё проще.
6 ноя 15, 11:01    [18377099]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить