Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Сравнение механизмов хинтования.  [new]
Ggg_old
Member

Откуда: Одесса
Сообщений: 1342
Вопрос по мотивам топика: https://www.sql.ru/forum/actualthread.aspx?tid=950804 ( В каких СУБД хинты носят чисто директивный характер? )

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

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

Насколько я слышал, что у DB2 прямых хинтов нет, т.к. считается что оптимизатор шибко умный, но ямогу ошибаться либо мои знания устарели.
У мсскл/азе точно есть хинтование индексов, про возможности хинтования остального не знаю.
У оракла вроде как богатые возможности, но деталей и возможностей не знаю совсем. Про информикс тоже ничего не знаю.
Файрбёрд - ничего не знаю.
26 июн 12, 16:46    [12777927]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
AmKad
Member

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

В Oracle хинты синтаксически оформляются как комментарии, при этом если Вы неправильно написали хинт, оптимизатор (компилятор) вам об этом не скажет, а просто проигнорирует его. В Oracle очень богатые возможности хинтования: индексы, способ сканирования индекса, порядок и способ соединения таблиц, трансформации запросов, параллелелизм, проталкивание предикатов, кеширование, возможность задавать параметры оптимизатора и т.д. А так же, что интересно, есть три хинта, меняющих логику выполнения запросов.
26 июн 12, 17:18    [12778171]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
логику выполнения запросов
Guest
AmKad
Ggg_old,

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

А что это за хинты меняющие логику выполнения запросов и следовательно меняющие результат выполнения запросов?
26 июн 12, 17:32    [12778316]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
AmKad
Member

Откуда:
Сообщений: 5344
логику выполнения запросов,

CHANGE_DUPKEY_ERROR_INDEX
IGNORE_ROW_ON_DUPKEY_INDEX
RETRY_ON_ROW_CHANGE
26 июн 12, 17:35    [12778349]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
AmKad
Member

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

Правда первый работает с некоторыми недокументированными ограничениями. CHANGE_DUPKEY_ERROR_INDEX. Update
26 июн 12, 17:37    [12778369]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
Ggg_old
Member

Откуда: Одесса
Сообщений: 1342
Проталкивание предикатов и вышеназванные опции влияющие на логику выполнения не отностяся к хинтам оптимизатора, а скорее являются свойством навороченности оптимизмтора вообще (проталкивание предиктов) и возможностей ядра субд. Мне бы хотелось в этом топике сконцентрироваться только на инструментах хинтования.
Я еще слышал, что в оракле админ может навзятать план выполнения запроса, не трогая его текст.
26 июн 12, 17:43    [12778421]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
AmKad
Member

Откуда:
Сообщений: 5344
Ggg_old
Проталкивание предикатов и вышеназванные опции влияющие на логику выполнения не отностяся к хинтам оптимизатора
Да ладно? Разве это
PUSH_PRED
NO_PUSH_PRED
RESULT_CACHE
NO_RESULT_CACHE
DYNAMIC_SAMPLING
CACHE
MONITOR
NO_XML_QUERY_REWRITE
и то что я привел выше, не хинты?
26 июн 12, 17:53    [12778524]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
навзятать план
Guest
Ggg_old
Я еще слышал, что в оракле админ может навзятать план выполнения запроса, не трогая его текст.

А указать тип соединения таблиц это навязать план? Если да, то в оракле это можно. Вопрос остается в том обязательно ли оракл будет выполнять этот хинт, т.е. является ли он директивным.
Если имеется ввиду указать непосредственно весь план выполнения запроса, то в ORACLE и MSSQL нельзя, но можно в Firebird.
26 июн 12, 18:07    [12778666]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
Ggg_old
Member

Откуда: Одесса
Сообщений: 1342
2AmCad: После изучения док про хинты push_pred, cache и прочее - согласен, это хинты оптимизатора, влияющие на стратегию.
Просто в SA протокалкивание предиката это часть возможности оптимизмтора и не хинтуется.
А вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.
26 июн 12, 18:16    [12778702]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
Ggg_old
Member

Откуда: Одесса
Сообщений: 1342
а вообще список хинтов оптимизатора оракла впечатляет:
http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#autoId3
26 июн 12, 18:18    [12778711]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
AmKad
Member

Откуда:
Сообщений: 5344
Ggg_old
А вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.
Согласно доке, это все-таки хинты. Но если Вы не согласны, я не хочу об этом спорить. Чем они отличаются от остальных - я уже написал. А понятие ядро - для меня несколько абстрактно.
26 июн 12, 18:20    [12778718]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3910
Ggg_old
2AmCad: После изучения док про хинты push_pred, cache и прочее - согласен, это хинты оптимизатора, влияющие на стратегию.
Просто в SA протокалкивание предиката это часть возможности оптимизмтора и не хинтуется.
А вот CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE все-таки параметры скорее ядра а не оптимизмтора.

В Оракле это тоже возможность оптимизатора. Вообще, почти все, что можно сделать хинтом, Оракловый оптимизатор способен сделать самостоятельно. Хинты вроде как задумывались на крайний случай.

Ggg_old
а вообще список хинтов оптимизатора оракла впечатляет

Это потому, что нет ни одного серьезного приложения, которое бы обходилось без хинтов, оракловый оптимизатор, как впрочем и сам оракл, очень богат на баги, хинты в оракле - суровая необходимость.
26 июн 12, 18:28    [12778754]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение механизмов хинтования.  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3148
Блог
Ggg_old
В качестве собственной ликвидации безграмотности и расширения кругозора хотелось бы узнать в каких рсубд какие есть возможности хинтования. Например: хинтовать нельзя вообще, можно указывать только индексы, можно хинтовать еще план выполнения (стратегию соединений итп.).
Если можно, то вкратце хотелось бы что-бы каждый поделился возможностяим по своей субд, с которой работает.
Жаль, что Вы сузили круг допущенных к рассмотрению типов СУБД лишь реляционными.

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

  • Query Optimization Options
  • ExtentSize and Selectivity
  • 26 июн 12, 18:32    [12778774]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Ggg_old
    Member

    Откуда: Одесса
    Сообщений: 1342
    2servit: да, интерисует именно рсубд, как реализующие идею декларативного программирования и имеющие массовое распространение. Да и сравнивать их между собой имеет смысл, а вот с каше как бы нет, т.к. продукты разные.
    26 июн 12, 18:36    [12778786]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Favn
    Member

    Откуда:
    Сообщений: 585
    Ggg_old
    Насколько я слышал, что у DB2 прямых хинтов нет, т.к. считается что оптимизатор шибко умный, но ямогу ошибаться либо мои знания устарели.
    Ну, скажем так, есть, но не хинты :)
    В самих запросах хинты не указываются. Обычно, если что-то не так, разбираются почему и, например, меняют уровень оптимизации, от которого зависит "вдумчивость" работы оптимизатора.
    Если все совсем плохо, можно написать optimization profile, который "рекомендует" желаемый план выполнения, не меняя самих запросов/программ. Но это - "последний довод", обычно достаточно разобраться (db2advise, например), почему план оптимизатора плохой.
    А так да, действительно "шибко умный", я этими хинтами ни разу не пользовался.
    26 июн 12, 18:39    [12778796]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Ggg_old
    Member

    Откуда: Одесса
    Сообщений: 1342
    а подскажет кто-то ссылочку на аналогичный ДБ2-шному механизму указания плана из-вне у оракла?
    26 июн 12, 19:01    [12778858]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Yo.!
    Guest
    Ggg_old
    а подскажет кто-то ссылочку на аналогичный ДБ2-шному механизму указания плана из-вне у оракла?


    механизм заветься stored outlines
    вкратце о нем тут: http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-sql-plan-management-11gr2-133099.pdf
    26 июн 12, 19:37    [12778948]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Ну, что ж, начнем..

    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 
    } 
    
    27 июн 12, 01:22    [12779747]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    <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'
    
    27 июн 12, 01:36    [12779755]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Plan Guides

    Собственно:
    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''))';
    
    27 июн 12, 01:43    [12779763]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
    INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
        ON h.SalesOrderID = d.SalesOrderID
    WHERE h.SalesOrderID = 45639;
    



    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)';
    


    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)';
    
    27 июн 12, 02:01    [12779771]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    --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';
    
    27 июн 12, 02:04    [12779773]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Ggg_old
    Member

    Откуда: Одесса
    Сообщений: 1342
    Ага пока выходит такая картина, если есть замечания, дпололняйте:

    ORACLE...: индекс(+), стратегия соединения(+), внешний план(+), Метахинты: [статистика(?), параллельность(+), допхинты(см.ссылку) ]
    DB2:.....: индекс(-), стратегии соединения(-), внешний план(+), Метахинты: [статистика(?), параллельность(?), допхинты(уровень глубины оптимизации) ]
    SybaseSA.: индекс(+), стратегия соединения(-), внешний план(-), Метахинты: [статистика(+), параллельность(+), допхинты(тип нагрузки запроса, уровень глубины оптимизации) ]
    MSSQL....: индекс(+), стратегия соединения(+), внешний план(+), Метахинты: [статистика(?), параллельность(?), допхинты(?) ]
    Firebird.: индекс(-), стратегия соединения(-), внешний план(+), Метахинты: [?]

    27 июн 12, 11:53    [12781383]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    Ggg_old
    Member

    Откуда: Одесса
    Сообщений: 1342
    Под метахинтами понимаются хинты, которые не указывают оптимизатору напрямую что именно делать, а декларативно описывают некие свойства запроса, на основании которых оптимизатор может выбирать стратегию своей работы. Пример: уровень параллельности запроса, уровень "заумности" оптимизатора на конкретном запросе, хинты кардинальности значения в колонке итп.
    27 июн 12, 11:59    [12781469]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение механизмов хинтования.  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Ggg_old
    параллельность(?)


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

    MAXDOP number_of_processors 
    


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


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


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


    А можно на примерах показать планы запросов при таких хинтах и без оных?
    27 июн 12, 12:04    [12781526]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
    Все форумы / Сравнение СУБД Ответить