Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Индексирование / 25 сообщений из 27, страница 1 из 2
17.07.2002, 14:15:24
    #32037179
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Различные эксперементы с индексированием таблиц дают определенное снижение времени выполнения запроса, но ве эти эксперементы делаются всеж методом подбора.
Где пожно найти инфу по правилам индексирования? Чтоб хоть знать, что надо индексировать в тех или иных случаях?
...
Рейтинг: 0 / 0
17.07.2002, 17:04:07
    #32037253
sFx
sFx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
вот несколько рекомендаций:
1. поля с типом Date обычно не индексируют.
2. Индексировать надо поля которые участвуют в Join
3. Индексировать надо поля в большой селективностью ( то есть те которые выводят мало повторяющихся значений
4. Primary and Foreigh keys
5. На те столбцы, которые часто используются в группировках при аггрегировании

При каких условия не использовать индексы:

1. Редко используемые в запросах
2. Содержащие мало уникальных значений(например на поле содержащее пол: м или ж)
2. на столбцы с типом text ntext и image

Есть еще кластерные индексы, составные индексы.

В общем вам в BOL - Designing an index
...
Рейтинг: 0 / 0
17.07.2002, 17:14:18
    #32037257
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Вообщем была таблица, к ней еще несколько подключалось. Работал запрос секунд 16. Прондексировал, стал работать больше секунды. После этого я добавлял индексы другим таблицам в базе, затем попробовал отработать тот запрос, а он у меня начал отрабатывать ровно минуту, через некоторое время стал отрабатываться минуту и одну секунду, причем стабильно.
Что могло произойти? Мотут ли индексы увеличивать время выполнения запроса?
...
Рейтинг: 0 / 0
17.07.2002, 17:33:56
    #32037263
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
может обновить статистику ?
...
Рейтинг: 0 / 0
17.07.2002, 17:37:38
    #32037265
Alexander_Chepack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Вот про неиндексирование по Date - это Вы где такие рекомендации нашли? У меня без таких индексов некотрые запросы раз эдак в сто медленнее работать будут.
...
Рейтинг: 0 / 0
17.07.2002, 17:50:58
    #32037268
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Что значит обновить статистику?
...
Рейтинг: 0 / 0
17.07.2002, 17:57:11
    #32037272
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
выполнит sp_updatestats
...
Рейтинг: 0 / 0
17.07.2002, 18:02:49
    #32037276
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
при изменении значений индексов иногда не происходит
обновление статистики - таблица начинает тормозть
спасает:

sp_updatestats (T-SQL)
Runs UPDATE STATISTICS against all user-defined tables in the current database.

Syntax
sp_updatestats

Return Code Values
0 (success) or 1 (failure)

а еще надо проверить ( или удалить и снова создать) наличие индексов по полям по которым идет join и where в запросах (бывает отваливаются)
...
Рейтинг: 0 / 0
17.07.2002, 18:04:36
    #32037277
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Не помогло.

Собственно тормоза пропадают после того, как убираешь пару фильтров, хотя рядом два аналогичных фильтра. Проверка происходит по датам, которые берутся из подзапросов.
...
Рейтинг: 0 / 0
17.07.2002, 18:06:29
    #32037278
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Хотелось бы уточнть на счет отваливающихся индексов.
Часто ли это происходит, как можно узнать? Ведь у меня таблиц немало.
...
Рейтинг: 0 / 0
17.07.2002, 18:08:57
    #32037281
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
можно попробовать проанализировать план выполнения запроса
...
Рейтинг: 0 / 0
17.07.2002, 18:21:09
    #32037286
Alexander_Chepack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
А нельзя больше информации привести о таблицах, индексах, запросах - а то мы как-то абстрактно все обсуждаем....
...
Рейтинг: 0 / 0
17.07.2002, 18:30:46
    #32037294
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Большой очень запрос, с достаточно извращенными подзапросами.

В плане выполнения запроса есть одна ветка, если тот "тормозящий" фильтр убрать, показывает что подключена таблица с Row count 3518. Если фильтр вернуть, Row count равен 5269964
...
Рейтинг: 0 / 0
17.07.2002, 18:34:27
    #32037296
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
текст запроса плз....
скорее всего там и собака ....
...
Рейтинг: 0 / 0
17.07.2002, 18:35:42
    #32037297
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
что же это за фильтр едреный, аж интересно стало
...
Рейтинг: 0 / 0
17.07.2002, 18:40:21
    #32037299
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Вообщем вот запрос, упростить я его и сам бы рад, да нужно было получить данные из нескольких таблиц одним запросом. В конце заремлены две строки, которые тормоза и вызывают.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
	SELECT TOP  1000 
		journal_service.UID,
		journal_service.UIDOwner,
		journal_service.DTInsert,
		journal_service.DTUpdate,
		journal_service.UIDService,
		journal_service.UIDBill,
		list_service.Caption AS CaptionService,
		list_unit.Caption AS CaptionUnit,
		journal_service.Quantity,
		journal_service.Lag,
		journal_service.Discount,
		journal_service.Taxrate,
		journal_service.Caption,
		CASE WHEN (sum_charge.UIDPayer IS NOT NULL) THEN sum_charge.UIDPayer
			ELSE sum_pay.UIDPayer
		END AS UIDPayer,
		CASE WHEN (sum_charge.UIDRecipient IS NOT NULL) THEN sum_charge.UIDRecipient
			ELSE sum_pay.UIDRecipient
		END AS UIDRecipient,
		journal_service.UIDManPay,
		journal_service.UIDManCharge,
		journal_service.UIDManClient,
		CASE WHEN (sum_pay.SumPay IS NULL) THEN NULL
							    ELSE journal_service.DTPay
		END AS DTPay,
		CASE WHEN (sum_charge.SumCharge IS NULL) THEN NULL
							    ELSE journal_service.DTCharge
		END AS DTCharge,
		sum_pay.SumPay,
		sum_charge.SumCharge,
		CASE WHEN (sum_charge.SumCharge IS NULL) THEN  1 
								 ELSE  2 
		END AS Charge,
		CASE WHEN (sum_pay.SumPay IS NULL) THEN  1 
							    ELSE  2 
		END AS Pay
	FROM 
		journal_service
		LEFT OUTER JOIN list_service ON  journal_service.UIDService = list_service.UID
		LEFT OUTER JOIN list_unit ON list_service.UIDUnit = list_unit.UID
		LEFT OUTER JOIN (SELECT DISTINCT UIDService, max(DTActual) AS MaxDate
			FROM journal_service_taxrate
			GROUP BY UIDService) AS max_date ON list_service.UID=max_date.UIDService
		LEFT OUTER JOIN journal_service_taxrate ON ((max_date.UIDService=journal_service_taxrate.UIDService) and (max_date.MaxDate=journal_service_taxrate.DTActual))
		LEFT OUTER JOIN (SELECT bind_amount_service.UIDJournalService, journal_amount.UIDPayer, journal_amount.UIDRecipient, sum(journal_amount.Amount) AS SumCharge
			FROM	journal_amount
				LEFT OUTER JOIN bind_amount_service ON journal_amount.UID=bind_amount_service.UIDAmount
				LEFT OUTER JOIN journal_service ON bind_amount_service.UIDJournalService=journal_service.UID
			WHERE journal_amount.UIDRecipient=journal_service.UIDPayer
			GROUP BY bind_amount_service.UIDJournalService, journal_amount.UIDPayer, journal_amount.UIDRecipient) AS sum_charge ON journal_service.UID=sum_charge.UIDJournalService
		LEFT OUTER JOIN (SELECT bind_amount_service.UIDJournalService,  journal_amount.UIDPayer, journal_amount.UIDRecipient, sum(journal_amount.Amount) AS SumPay
			FROM	journal_amount
				LEFT OUTER JOIN bind_amount_service ON journal_amount.UID=bind_amount_service.UIDAmount
				LEFT OUTER JOIN journal_service ON bind_amount_service.UIDJournalService=journal_service.UID
			WHERE journal_amount.UIDPayer=journal_service.UIDPayer
			GROUP BY bind_amount_service.UIDJournalService, journal_amount.UIDPayer, journal_amount.UIDRecipient) AS sum_pay ON journal_service.UID=sum_pay.UIDJournalService
	WHERE 
		((@UIDService=journal_service.UIDService) or (@UIDService IS NULL)) and
		((@UIDBill=journal_service.UIDBill) or (@UIDBill IS NULL)) and
		((@UIDManPay=journal_service.UIDManPay) or (@UIDManPay IS NULL)) and
		((@UIDManCharge=journal_service.UIDManCharge) or (@UIDManCharge IS NULL)) and
		((@UIDManClient=journal_service.UIDManClient) or (@UIDManClient IS NULL)) and
		(((sum_pay.SumPay IS NOT NULL) and (@Pay= 2 )) or
		((sum_pay.SumPay IS NULL) and (@Pay= 1 )) or
		(@Pay= 0 )) and
		(((sum_charge.SumCharge IS NOT NULL) and (@Pay= 2 )) or
		((sum_charge.SumCharge IS NULL) and (@Pay= 1 )) or
		(@Pay= 0 )) and
		((@UIDPayer=journal_service.UIDPayer) or (@UIDPayer IS NULL))and
		((sum_pay.UIDPayer=@UIDPayer) or (sum_charge.UIDPayer=@UIDPayer) or (@UIDPayer IS NULL)) and
		((sum_pay.UIDRecipient=@UIDRecipient) or (sum_charge.UIDRecipient=@UIDRecipient) or (@UIDRecipient IS NULL)) and
		(((sum_pay.SumPay IS NOT NULL) and (@DTPayBegin<=DTPay)) or (@DTPayBegin IS NULL)) and
		(((sum_pay.SumPay IS NOT NULL) and (@DTPayEnd>=DTPay)) or (@DTPayEnd IS NULL))  --and
 
 --		(((sum_charge.SumCharge IS NOT NULL) and (@DTChargeBegin<=DTCharge)) or (@DTChargeBegin IS NULL)) and
 
--		(((sum_charge.SumCharge IS NOT NULL) and (@DTChargeEnd>=DTCharge)) or (@DTChargeEnd IS NULL))
...
Рейтинг: 0 / 0
17.07.2002, 18:45:41
    #32037301
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Да, вот переменные, участвующие в запросе.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE JournalServiceSelect
	@UIDService int = NULL,
	@UIDBill int = NULL,
	@UIDPayer int = NULL,
	@UIDRecipient int = NULL,
	@Pay int = NULL,
	@Charge int = NULL,
	@DTPayBegin datetime = NULL,
	@DTPayEnd datetime = NULL,
	@DTChargeBegin datetime = NULL,
	@DTChargeEnd datetime = NULL,
	@UIDManPay int = NULL,
	@UIDManCharge int = NULL,
	@UIDManClient int = NULL
...
Рейтинг: 0 / 0
17.07.2002, 18:48:43
    #32037303
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
ну наворотил....
разбей запрос на несколько...
и объединяй по UNION ALL
...
Рейтинг: 0 / 0
17.07.2002, 18:54:36
    #32037305
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Ну разбивать надо было сразу, навено. :)
Он работает, правда без индексов не так быстро, но проиндексировав таблицы он работал 2 -3 секунды. А затем вдруг резко начал тормозить, при этом сам запрос я не трогал.
...
Рейтинг: 0 / 0
17.07.2002, 19:04:06
    #32037310
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
тогда смотри в индексах....
статистику посмотри....
в общем индекс тюнинг!
как раскинуты индексы... параметры индексов...
базу сожми...
...
Рейтинг: 0 / 0
17.07.2002, 19:13:31
    #32037313
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Я тольк столкнулся с первыми проблемами с индексами, можно чуть подробней по поводу статистики, индекс тюнинга, параметров индексов.
...
Рейтинг: 0 / 0
18.07.2002, 11:25:55
    #32037392
sFx
sFx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
2Alexander_Chepack: я же говорю "обычно". это из опыта людей.
если хотите, что бы еще быстрее было, храните дату в числовом формате, вообще все летать будет.
...
Рейтинг: 0 / 0
18.07.2002, 12:57:52
    #32037430
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Всеж вопрос на засыпку, могут ли повлиять на время выполнения запроса индексы в таблицах, не участвующих в данном запросе?
...
Рейтинг: 0 / 0
18.07.2002, 13:55:10
    #32037451
Сат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Напрямую не могут.. Косвенно - да... мало ли, может у тебя там индексов образовывается на несколько гиг и места на винте не остается...(одна из причин и к тому же самая маловероятная..)
...
Рейтинг: 0 / 0
18.07.2002, 14:05:16
    #32037454
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексирование
Статья "Что быстрее: индексный доступ или сканирование таблицы?" . Тут много интересного насчет индексов.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Индексирование / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]