powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнение механизмов хинтования.
25 сообщений из 60, страница 1 из 3
Сравнение механизмов хинтования.
    #37855472
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по мотивам топика: http://www.sql.ru/forum/actualthread.aspx?tid=950804 ( В каких СУБД хинты носят чисто директивный характер? )

В качестве собственной ликвидации безграмотности и расширения кругозора хотелось бы узнать в каких рсубд какие есть возможности хинтования. Например: хинтовать нельзя вообще, можно указывать только индексы, можно хинтовать еще план выполнения (стратегию соединений итп.).
Если можно, то вкратце хотелось бы что-бы каждый поделился возможностяим по своей субд, с которой работает.

В Sybase SA можно хинтовать индексы, задавать вручную статистику распределения значения - хинтовать статистику, менять уровень "заумности" оптимизатора и косвенно влиять на стратегию выполнения (план) запроса через опцию "оптимизировать для OLTP/OLAP/Смешанный режим".

Насколько я слышал, что у DB2 прямых хинтов нет, т.к. считается что оптимизатор шибко умный, но ямогу ошибаться либо мои знания устарели.
У мсскл/азе точно есть хинтование индексов, про возможности хинтования остального не знаю.
У оракла вроде как богатые возможности, но деталей и возможностей не знаю совсем. Про информикс тоже ничего не знаю.
Файрбёрд - ничего не знаю.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855550
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old,

В Oracle хинты синтаксически оформляются как комментарии, при этом если Вы неправильно написали хинт, оптимизатор (компилятор) вам об этом не скажет, а просто проигнорирует его. В Oracle очень богатые возможности хинтования: индексы, способ сканирования индекса, порядок и способ соединения таблиц, трансформации запросов, параллелелизм, проталкивание предикатов, кеширование, возможность задавать параметры оптимизатора и т.д. А так же, что интересно, есть три хинта, меняющих логику выполнения запросов.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855595
AmKadGgg_old,

В Oracle хинты синтаксически оформляются как комментарии, при этом если Вы неправильно написали хинт, оптимизатор (компилятор) вам об этом не скажет, а просто проигнорирует его. В Oracle очень богатые возможности хинтования: индексы, способ сканирования индекса, порядок и способ соединения таблиц, трансформации запросов, параллелелизм, проталкивание предикатов, кеширование, возможность задавать параметры оптимизатора и т.д. А так же, что интересно, есть три хинта, меняющих логику выполнения запросов.
А что это за хинты меняющие логику выполнения запросов и следовательно меняющие результат выполнения запросов?
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855612
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
логику выполнения запросов,

CHANGE_DUPKEY_ERROR_INDEX
IGNORE_ROW_ON_DUPKEY_INDEX
RETRY_ON_ROW_CHANGE
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855618
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Правда первый работает с некоторыми недокументированными ограничениями. CHANGE_DUPKEY_ERROR_INDEX. Update
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855632
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проталкивание предикатов и вышеназванные опции влияющие на логику выполнения не отностяся к хинтам оптимизатора, а скорее являются свойством навороченности оптимизмтора вообще (проталкивание предиктов) и возможностей ядра субд. Мне бы хотелось в этом топике сконцентрироваться только на инструментах хинтования.
Я еще слышал, что в оракле админ может навзятать план выполнения запроса, не трогая его текст.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855649
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldПроталкивание предикатов и вышеназванные опции влияющие на логику выполнения не отностяся к хинтам оптимизатораДа ладно? Разве это
PUSH_PRED
NO_PUSH_PRED
RESULT_CACHE
NO_RESULT_CACHE
DYNAMIC_SAMPLING
CACHE
MONITOR
NO_XML_QUERY_REWRITE
и то что я привел выше, не хинты?
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855682
Ggg_oldЯ еще слышал, что в оракле админ может навзятать план выполнения запроса, не трогая его текст.
А указать тип соединения таблиц это навязать план? Если да, то в оракле это можно. Вопрос остается в том обязательно ли оракл будет выполнять этот хинт, т.е. является ли он директивным.
Если имеется ввиду указать непосредственно весь план выполнения запроса, то в ORACLE и MSSQL нельзя, но можно в Firebird.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855694
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2AmCad: После изучения док про хинты push_pred, cache и прочее - согласен, это хинты оптимизатора, влияющие на стратегию.
Просто в SA протокалкивание предиката это часть возможности оптимизмтора и не хинтуется.
А вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855698
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще список хинтов оптимизатора оракла впечатляет:
http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#autoId3
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855701
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldА вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.Согласно доке, это все-таки хинты. Но если Вы не согласны, я не хочу об этом спорить. Чем они отличаются от остальных - я уже написал. А понятие ядро - для меня несколько абстрактно.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855714
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old2AmCad: После изучения док про хинты push_pred, cache и прочее - согласен, это хинты оптимизатора, влияющие на стратегию.
Просто в SA протокалкивание предиката это часть возможности оптимизмтора и не хинтуется.
А вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.
В Оракле это тоже возможность оптимизатора. Вообще, почти все, что можно сделать хинтом, Оракловый оптимизатор способен сделать самостоятельно. Хинты вроде как задумывались на крайний случай.

Ggg_oldа вообще список хинтов оптимизатора оракла впечатляет
Это потому, что нет ни одного серьезного приложения, которое бы обходилось без хинтов, оракловый оптимизатор, как впрочем и сам оракл, очень богат на баги, хинты в оракле - суровая необходимость.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855722
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldВ качестве собственной ликвидации безграмотности и расширения кругозора хотелось бы узнать в каких рсубд какие есть возможности хинтования. Например: хинтовать нельзя вообще, можно указывать только индексы, можно хинтовать еще план выполнения (стратегию соединений итп.).
Если можно, то вкратце хотелось бы что-бы каждый поделился возможностяим по своей субд, с которой работает.Жаль, что Вы сузили круг допущенных к рассмотрению типов СУБД лишь реляционными.

Хотя в других - не РСУБД - тоже есть хинты, например:

Query Optimization Options

ExtentSize and Selectivity
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855728
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2servit: да, интерисует именно рсубд, как реализующие идею декларативного программирования и имеющие массовое распространение. Да и сравнивать их между собой имеет смысл, а вот с каше как бы нет, т.к. продукты разные.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855733
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldНасколько я слышал, что у DB2 прямых хинтов нет, т.к. считается что оптимизатор шибко умный, но ямогу ошибаться либо мои знания устарели.Ну, скажем так, есть, но не хинты :)
В самих запросах хинты не указываются. Обычно, если что-то не так, разбираются почему и, например, меняют уровень оптимизации, от которого зависит "вдумчивость" работы оптимизатора.
Если все совсем плохо, можно написать optimization profile , который "рекомендует" желаемый план выполнения, не меняя самих запросов/программ. Но это - "последний довод", обычно достаточно разобраться ( db2advise , например), почему план оптимизатора плохой.
А так да, действительно "шибко умный", я этими хинтами ни разу не пользовался.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855763
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а подскажет кто-то ссылочку на аналогичный ДБ2-шному механизму указания плана из-вне у оракла?
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37855812
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldа подскажет кто-то ссылочку на аналогичный ДБ2-шному механизму указания плана из-вне у оракла?

механизм заветься stored outlines
вкратце о нем тут: http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-sql-plan-management-11gr2-133099.pdf
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856060
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, что ж, начнем..

Код: sql
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.
WITH ( <table_hint> [ [ , ]...n ] )

<table_hint> ::= 
[ NOEXPAND ] { 
    INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )
  | FASTFIRSTROW 
  | FORCESEEK
  | HOLDLOCK 
  | NOLOCK 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | READUNCOMMITTED 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
} 

<table_hint_limited> ::=
{
    KEEPIDENTITY 
  | KEEPDEFAULTS 
  | FASTFIRSTROW 
  | HOLDLOCK 
  | IGNORE_CONSTRAINTS 
  | IGNORE_TRIGGERS 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
} 
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856064
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<query_hint > ::= 
{ { HASH | ORDER } GROUP 
  | { CONCAT | HASH | MERGE } UNION 
  | { LOOP | MERGE | HASH } JOIN 
  | EXPAND VIEWS 
  | FAST number_rows 
  | FORCE ORDER 
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN 
  | KEEPFIXED PLAN
  | MAXDOP number_of_processors 
  | MAXRECURSION number 
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN 
  | USE PLAN N'xml_plan'
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856066
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Plan Guides

Собственно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
sp_create_plan_guide 
@name = N'Guide1',
@stmt = N'SELECT *FROM Sales.SalesOrderHeader AS h,
        Sales.Customer AS c,
        Sales.SalesTerritory AS t
        WHERE h.CustomerID = c.CustomerID 
            AND c.TerritoryID = t.TerritoryID
            AND CountryRegionCode = @Country_region',
@type = N'OBJECT',
@module_or_batch = N'Sales.GetSalesOrderByCountry',
@params = NULL,
@hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856069
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45639;




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
sp_create_plan_guide 
    @name = N'TemplateGuide1',
    @stmt = N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
              INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
                  ON h.SalesOrderID = d.SalesOrderID
              WHERE h.SalesOrderID = @0',
    @type = N'TEMPLATE',
    @module_or_batch = NULL,
    @params = N'@0 int',
    @hints = N'OPTION(PARAMETERIZATION FORCED)';



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template 
    N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
      INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
          ON h.SalesOrderID = d.SalesOrderID
      WHERE h.SalesOrderID = 45639;',
    @stmt OUTPUT, 
    @params OUTPUT
EXEC sp_create_plan_guide N'TemplateGuide1', 
    @stmt, 
    N'TEMPLATE', 
    NULL, 
    @params, 
    N'OPTION(PARAMETERIZATION FORCED)';
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856070
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
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.
--Create a procedure on which to define the plan guide.
IF OBJECT_ID(N'Sales.GetSalesOrderByCountry', N'P') IS NOT NULL
    DROP PROCEDURE Sales.GetSalesOrderByCountry;
GO
CREATE PROCEDURE Sales.GetSalesOrderByCountry 
    (@Country nvarchar(60))
AS
BEGIN
    SELECT *
    FROM Sales.SalesOrderHeader AS h 
    INNER JOIN Sales.Customer AS c ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country;
END
GO
--Create the plan guide.
EXEC sp_create_plan_guide N'Guide3',
    N'SELECT *
    FROM Sales.SalesOrderHeader AS h 
    INNER JOIN Sales.Customer AS c ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country',
    N'OBJECT',
    N'Sales.GetSalesOrderByCountry',
    NULL,
    N'OPTION (OPTIMIZE FOR (@Country = N''US''))';
GO
--Disable the plan guide.
EXEC sp_control_plan_guide N'DISABLE', N'Guide3';
GO
--Enable the plan guide.
EXEC sp_control_plan_guide N'ENABLE', N'Guide3';
GO
--Drop the plan guide.
EXEC sp_control_plan_guide N'DROP', N'Guide3';
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856578
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага пока выходит такая картина, если есть замечания, дпололняйте:
Код: plaintext
1.
2.
3.
4.
5.
6.
ORACLE...: индекс(+), стратегия соединения(+), внешний план(+), Метахинты: [статистика(?), параллельность(+), допхинты(см.ссылку) ]
DB2:.....: индекс(-), стратегии соединения(-), внешний план(+), Метахинты: [статистика(?), параллельность(?), допхинты(уровень глубины оптимизации) ]
SybaseSA.: индекс(+), стратегия соединения(-), внешний план(-), Метахинты: [статистика(+), параллельность(+), допхинты(тип нагрузки запроса, уровень глубины оптимизации) ]
MSSQL....: индекс(+), стратегия соединения(+), внешний план(+), Метахинты: [статистика(?), параллельность(?), допхинты(?) ]
Firebird.: индекс(-), стратегия соединения(-), внешний план(+), Метахинты: [?]

...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856603
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под метахинтами понимаются хинты, которые не указывают оптимизатору напрямую что именно делать, а декларативно описывают некие свойства запроса, на основании которых оптимизатор может выбирать стратегию своей работы. Пример: уровень параллельности запроса, уровень "заумности" оптимизатора на конкретном запросе, хинты кардинальности значения в колонке итп.
...
Рейтинг: 0 / 0
Сравнение механизмов хинтования.
    #37856618
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldпараллельность(?)

Почему знак вопроса?

Код: sql
1.
MAXDOP number_of_processors 



Ggg_old[статистика(?)

Покрывается этим:
Код: sql
1.
2.
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN



Ggg_oldдопхинты(тип нагрузки запроса, уровень глубины оптимизации)

А можно на примерах показать планы запросов при таких хинтах и без оных?
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнение механизмов хинтования.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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