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

Откуда: Москва
Сообщений: 59
Имеется таблица со следующей структурой:
CREATE TABLE [dbo].[fas_common_type](
	[ObjectID] [uniqueidentifier] NOT NULL,
	[ts] [bigint] NOT NULL,
	[MagicBit] [tinyint] NOT NULL,
	[ID] [int] NULL,
	[G021] [varchar](20) NULL,
	[G022] [varchar](150) NULL,
	[G023] [varchar](80) NULL,
	[G081] [varchar](20) NULL,
	[G0822] [varchar](150) NULL,
	[G083] [varchar](80) NULL,
	[GD0] [varchar](20) NULL,
	[ID] [int] NULL,
	[G011] [varchar](20) NULL,
	[G31_1] [varchar](250) NULL,
	[G31_11] [varchar](150) NULL,
	[G31_7] [money] NULL,
	[G31_71] [varchar](13) NULL,
	[G33] [varchar](100) NULL,
	[G38] [money] NULL,
	[G42] [money] NULL,
	[G46] [money] NULL,
	[GD0] [varchar](20) NULL,
	[DSTAT] [datetime] NULL,
	[d41e9bfdaa8_CreationDate] [datetime] NULL,
	[d41e9bfdaa8_IsNotCons] [tinyint] NULL,
	[d41e9bfdaa8_IsNotConsPrt] [tinyint] NULL,
	[d41e9bfdaa8_Duplicate] [tinyint] NULL,
	[d41e9bfdaa8_CoordStatus] [tinyint] NULL,
 CONSTRAINT [PK_common_type] PRIMARY KEY CLUSTERED 
(
	[ObjectID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


В ней порядка 55 миллионов записей.
К ней делаются запросы следующего вида:
Select  * from where G0822 like "%123%" and G022 like "asd%" or G023="ter"


Условия запроса могут быть разными в разном количестве и с разными разделителями т.е. OR AND. Но точно, что будут применяться только like к текстовым полям или равенство.

Подскажите пожалуйста, я новичок в SQL Sever, с подобными запросами тоже не приходилось сталкиваться, возможно ли это оптимизировать с помощью индексов? Или как-нибудь еще?

Поможет ли повесить индекс на каждое текстовое поле?
1 окт 12, 20:23    [13252301]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
QwerTech,
Можно с помощью индексов, только надо определиться с запросами.
Желательно получить весь список возможных условий.
Возможно там есть какая-то закономерность, например всегда есть поиск по полю G023 или типа того.
Select  * from where G0822 like "%123%" and G022 like "asd%" or G023="ter"

а для данного запроса нужен индекс.
create index IDX_fas_common_type_G023_G022 on dbo.GO882 ( G023, G022 ) include ( G0822 );
1 окт 12, 21:48    [13252581]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
ой очепятка

create index IDX_fas_common_type_G023_G022 on dbo.fas_common_type ( G023, G022 ) include ( G0822 );
1 окт 12, 21:49    [13252584]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
Владимир Затуливетер,

спасибо за советы.

Ситуация слудующая:

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

Поэтому никакой закономерности по колонкам быть не может.
1 окт 12, 23:03    [13252872]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
QwerTech
Есть программа, в которой отображаются данные из этой таблицы, так же на странице с таблицей имеются фильтры по всем полям этой таблицы, т.е. пользователь может заполнить любые фильтры и хочет увидеть результат быстро.

Поэтому никакой закономерности по колонкам быть не может.
Тогда нужно построить индексы для всех сочетаний полей.

Так как это неоптимально по некоторым причинам, то обычно набирают статистику условий запросов, и для самых частых делают индексы, да ещё с учётом того, что для некоторых полей индексы будут неэффективны.

То есть используют тот факт, что закономерности в реальной жищзни и в бизнесе есть, несмотря на эти ваши утверждения.
1 окт 12, 23:14    [13252943]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
[quot alexeyvg]
QwerTech
То есть используют тот факт, что закономерности в реальной жищзни и в бизнесе есть, несмотря на эти ваши утверждения.


Я не спорю, но такими данными не располагаю. Буду выпытывать у заказчика.
2 окт 12, 00:22    [13253194]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
QwerTech
Я не спорю, но такими данными не располагаю.
Ну да, нужно выпытывать.

Можно с помощью профайлера, в том числе, например, встроенных в новые версии отчётов по тяжёлым запросам.
2 окт 12, 00:35    [13253220]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
Владимир Затуливетер
Member

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

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

К примеру поля по которым делаются фильтры G021, G022, G023, G024.
Тогда сделать индексы:
create index IDX_fas_common_type_G021 on dbo.fas_common_type ( G021 ) include  ( G022, G023, G024 );
create index IDX_fas_common_type_G022 on dbo.fas_common_type ( G022 ) include  ( G021, G023, G024 );
create index IDX_fas_common_type_G023 on dbo.fas_common_type ( G023 ) include  ( G022, G021, G024 );
create index IDX_fas_common_type_G024 on dbo.fas_common_type ( G024 ) include  ( G022, G023, G021 );

Т.е. делается индекс на каждое поле + включаются все оставшиеся столбцы по которым возможны фильтры.
Но опять таки это решение с потолка, общее, но для начала думаю сойдет.
Анализируйте запросы и меняйте индексы.

ps:
Можете как вариант добавить модуль статистики в программу, где бы вы могли посмотреть какие фильтры пользователи чаще всего использует.
2 окт 12, 09:55    [13253817]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Владимир Затуливетер
ps:
Можете как вариант добавить модуль статистики в программу
Собственно, есть три способа сбора статистики:
1. Использоовать "Динамические административные представления и функции, связанные с выполнением"
2. Сохранить трассу от профайлера и проанализировать
3. Вести лог в саму программу

Нужно выбрать, что проще, с учётом того, что программа эксплуатируется заказчиками, а не QwerTech.
2 окт 12, 10:22    [13253962]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
QwerTech
Member

Откуда: Москва
Сообщений: 59
Кстати о профайлере, как его настроить только для запросов только к одной БД и только к одной таблице?

Пробовал его запускать, но так и не понял как настроить чтобы отлавливать запросы.

В нете тоже покопался не смог ничего найти. Буду признателен за ссылки на учебную литературу.
3 окт 12, 15:51    [13262688]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
QwerTech
Кстати о профайлере, как его настроить только для запросов только к одной БД и только к одной таблице?
Поставьте фильтр по имени БД и по включению в текст имени таблицы.


QwerTech
Буду признателен за ссылки на учебную литературу.
В BOL же всё написано, да и интерфейс там простой, можно без документации разобраться. Ловите события T-SQL Batch Completed
3 окт 12, 16:55    [13263100]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли оптимизировать с помощью индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
QwerTech
Кстати о профайлере
Кстати, о других способах, про которые я говорил :-)

Посмотрите всё таки "Динамические административные представления и функции, связанные с выполнением"

Допустим, в sys.dm_db_missing_index_details будет список и состав индексов, которые неплохо бы создать для ваших запросов :-)
3 окт 12, 17:01    [13263141]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить