Сообщение Re[35]: В России опять напишут новый объектно-ориентированны от 16.03.2018 21:41
Изменено 16.03.2018 23:36 vdimas
Re[35]: В России опять напишут новый объектно-ориентированны
Здравствуйте, Sinclair, Вы писали:
V>>Твоя "локальная информация" имеет строгую иерархическую природу.
S>(facepalm)/
V>>Так КАК она будет хранится?
S>Это как раз неважно.
Тогда зачем ты сюда пишешь если не разобрался?
Тебе самому скучно и ты решил сделать скучно другим?
S>>>Грубо говоря, мы можем использовать любой из 5-6 индексов по Manager, потому что а вдруг там в where что-то особенно селективное написано
V>>Прикольный залет, причём, ты уже вроде бы 3-й раз одинаково залетаешь.
S>Это не залёт, это невнимательность с твоей стороны.
Типа, лучшая оборона — это нападение?
V>>Ведь не "вдруг", а на руках полная комбинация всех where.
S>Это в конкретном запросе. С конкретными значениями параметров.
Пофик. Речь шла о полном наборе планов.
Т.е. твои возражения НЕ релевантны обсуждаемому и являются, по-сути, подлогом/жульничеством.
А выдаваемые таким тоном если, то это еще и показуха получается, работа на публику.
Ну или ты действительно ни черта не понимаешь.
V>>Эти where часто образуют иерархию, например, where x>100, а потом еще where x>100 and x<1000 и т.д.
S>Вот это место не имеет физического смысла. Даже если у нас есть много предикатов на один и тот же атрибут, то никакой иерархии они не образуют.
Мде...
Например, движок оптимизации того же MySQL использует библиотеки Буста Graph и Geometry.
И если насчёт graph понятно, как ты думаешь, зачем там geometry? Что именно используется?
V>>За 10-15 индексов по order положено расстреливать, ну пусть даже 10-15 индексов.
S>Твои представления о том, за что положено расстреливать, а за что — увольнять, выдают малый опыт в обсуждаемой теме.
Ты сказал конкретно order, вот и отвечай за order.
А натягивать "почти OLAP" я же первый не рекомендовал сразу же, бо там ДРУГОЙ сценарий.
Я сразу же оговорился, что для оперативных и исторических данных используют РАЗНЫЕ подходы.
Исторические данные неизменны.
Оперативные — наоборот.
Смешивать их и при этом заявлять о своём "опыте" — это нагло врать.
Врать или о своём опыте или о своей претензии на честность дискуссии.
Ну реально, ты такой бежишь размахивать 15-ю индексами.
Это для частоизменяемых данных? ))
ОМГ...
Уволить. Расстрелять.
Это не инженерия, это вредительство.
"Куда вы все лезете, там Ад и Израиль!!!"
Мол, "я же не лезу, вот и вы не лезьте".
V>>Сколько всего таблиц навроде "order" в средней системе?
S>Смотря что считать "средней системой".
В средней современной системе в р-не 800-1000 таблиц.
Но ты опять пустословишь вместо разговора по-существу, заметь.
S>>>Итого получаем от полусотни до сотни вариантов исполнения этого join.
V>>И это для самой индексированной таблице, аналогов которой единицы штук даже в самых крупных учётных системах.
S>Это мы говорим про 1 джойн. В самой средней учётной системе мы регулярно имеем запросы с 5-10 джойнами.
Из которых тяжелый join один, редко два.
Остальные — по данным справочного типа прямо по кластерному ключу из таблиц с весьма конечным кол-вом редкоизменяемых записей.
Это как оно в реальных системах, а именно — в бухгалтериях, складах (в любой торговле, в том числе интернетной), в банковском опердне, на биржах (фондовых и товарных) и даже в учётных системах, скажем, библиотек и музеев. А не в твоих фантазиях из параллельной реальности, которые мне уже откровенно лень разбирать...
Ну найдешь ты какой-нить уникальный ЖУТКО РЕДКИЙ сценарий, который не ляжет гладко на предполагаемую систему.
Ну и на здоровье, возьми более подходящий для такой уникальной задачи инструмент, какие проблемы?
Ты инженер или где? )))
S>Потому как схемы высоконормализованные
Для высоконормализованных схем не будет такой ширины таблицы, чтобы по 15 индексов лепить.
S>И как раз обычно в них ровно одна такая "самая индексированная" таблица.
Видели, знаем, выжигали калёным железом.
Это тот самый широко известный в узких кругах OLAP для бедных.
Кароч, откройте для себя репликацию и OLAP для взрослых.
Стоило один раз показать и взрослые люди радовались как малые дети.
Самые существенные изменения в БД за последние лет 20 — они как раз в плане репликаций.
Их появилось столько режимов и столько инструментов под них — у-у-у.
Но, судя по 15-ти индексам, это всё каким-то чудесным образом тебя не коснулось.
Абсолютно во всех перечисленных типах систем главная таблица одна — это таблица движений.
Денег ли по счетам или товаров по складам.
Или две таблицы для склада, когда приход и расход разделены.
Абсолютно во всех без исключения таких системах серьезного уровня строго разделяют оперативные данные и исторические.
Причём, для опердня историческими данными является уже вчерашнее число.
Для склада или бухгалтерии чаще прошлый месяц.
Так вот, в чём суть твоего мухлежа:
— для оперативных данных много индексов не надо, их обычно ровно 3 во всех перечисленных типах систем (для упомянутой основной таблицы движений);
— для исторических данных не надо много динамических планов, бо данные неизменяемые, индексы априори пересчитаны, как я предлагал т.н. "профилирование по реальным данным" — оно вполне может быть частью операции "закрытие периода" — это одна из самых важных операций ЛЮБЫХ учётных систем более-менее серьезного уровня.
V>>При том, что про полусотню враки — большая часть вариантов откидываются как заведомо худшие еще на этапе построения всего набора планов.
S>(facepalm) с чего бы это они будут отброшены?
Да бывает такая хрень в алгоритмах Uniform Cost Search или Topological Sort.
Смирись. ))
S>Для каждого из них бывает такая комбинация параметров запроса и набора данных в таблице, когда именно этот вариант плана выиграет.
Бывает. Но это должен быть запрос соответствующий. А все запросы заранее известны. А таких специфических запросов и 1% не будет.
И про размен явной параметризации на эффективность я тебе уже говорил.
Вполне можно настраивать пороги, когда мы еще можем позволить себе генерить код вширь (распространение подстановок), а когда уже хватит.
Похоже, ты не понимаешь, как такие вещи работают.
Сначала происходит "распознавание" похожих мест — т.е. из вообще всех таблиц и всех запросов.
Если интересует конкретно — спроси меня как.
Я когда-то писал часть системы по распознаванию смысла текстов.
Тоже относительно несложные алгоритмы на графах и подобиях.
Семантику языков программирования (даже 4-го уровня) "распознавать" еще проще.
Не синтаксис, а именно семантику — т.е. "что конкретно ты имел ввиду".
Т.е. по набору примитивных операций выходить на более высокий "смысл" происходящего.
И здесь уже производить преобразования подобия.
V>>Это если плавать в предмете, сорри.
S>Сорри, нет.
V>>Если на основании предикатов exists, any/all, not in и т.д. — то та же херня что join, вид сбоку, они все через join выразимы.
S>Отож.
Ну т.е. понимаешь, что пример был не в кассу после обсуждения join?
V>>А если на основании агрегирующих математических ф-ий — то кол-во вариантов планов падает на порядок-другой сразу, бо опять же получается иерархия исполнения всех (сколько бы ни было уровней вложенности) подзапросов.
S>Возрастает. На порядок возрастает. Потому что возникают варианты "сначала join, потом агрегация", либо "агрегация, потом join".
Вот, опять нечестная манипуляция.
Я верю что ты не понимаешь, что это зависит от конкретного запроса, т.е. где конкретно происходит агрегация и по чему именно происходит join.
Т.е. "возрастает" там только в смысле мощности порождаемых языком комбинаций, но никак не в смысле множества вариантов исполнения конкретного такого выражения. Потому для каждого конкретного выражения — многократно падает. Сама операция агрегации отрезает нахрен кучу потенциальных планов, которые имели право на жизнь в отсутствии такой агрегации. Потому что дело не в том "сначала агрегация, потом join", а в том — какие таблицы сначала сканить, именно такой выбор сужается многократно.
V>>Всё, я сдаюсь.
V>>Коллега, ну это уже упоротость какая-то. ))
S>Нет, это близкое знакомство с предметом.
В кач-ве юзверя некоей системы.
Но обсуждается принципиально другая.
V>>План запроса не хранится в виде данных.
V>>Он хранится как код, как ф-ия с параметрами.
V>>Для этого всё и затевалось.
S>Очень хорошо.
V>>Степень повторного использования можно регулировать через связывания аргументов с константами, т.е. еще на этапе бета-редукции.
V>>При минимальном связывании будет минимальный бинарник, но макимальное кол-во параметров у каждой ф-ии, при максимальном связывании — наоборот.
S>Нам не так важно, как это хранится.
Важно.
S>SQL-сервер хранит это в виде дерева физических операций, при исполнении — интерпретирует.
Верно, в современных серваках это всегда хранится как скриптовая программа — в виде AST или p-кода некоторой абстрактной машинки.
Разница тут в том, что в динамике твой сервак ну никак не может находить идентичные ветки AST или подпрограмм p-кода.
S>Ок, мы можем "улучшить" ситуацию путём генерации не объектов-описаний, а, к примеру, Expression<>. Или байткода в стиле MSIL, LLVM, или Java.
Дык, дотнет и джаву ругают как раз за то, что они принципиально не в состоянии производить описанные оптимизации.
Поэтому, их бинарник в памяти после джита занимает какое-то совсем уж неприличное кол-во байт, что джаве даже пришлось ввести сборку мусора для кода, ы-ы-ы (привет из 90-х, когда память стоила дороже золота).
Зато .Net Native — запросто может.
Стирание типов — великая весчь.
S>Или сразу вообще скомпилировать бинарь. Это повлияет только на скорость исполнения этого плана. На место, которое он занимает, это повлияет в плохую сторону.
Скажи, ты знал о том факте, что первые компляторы С++, поддерживающие шаблоны, генерили какой-то совсем уж распухший бинарник?
А знал ли ты, что когда компиляторы С++ научились склеивать шаблонный код, то почему-то под этот механизм попал и вовсе не шаблонный, а вообще весь код и это сжало бинарник средней программы (даже без всяких шаблонов) примерно втрое? А знал ли ты, что в сравнении с теми самыми первыми компиляторами с шаблонами но без сжатия, размер генерируемого бинарника ужался более чем на порядок?
А сравнение со сриптовым языком после джита я тебе уже приводил — разница до 50-ти раз.
А кеш проца ведь не бесконечный. Чем реже оттуда вытесняется код, тем эффективнее вся система.
V>>Взял бы ручками да раписал планы вокруг одной и той же комбинации join.
V>>Ты ведь никогда этого не делал, верно?
S>Зачем? Мне их сервер выписывал, когда я занимался оптимизацией SQL.
Верно. Он ведь может вообще все планы дать.
Так сколько он в среднем даёт планов по одному join?
V>>При исполнении плана дерево тут строго в другую сторону растёт — от примитивных листьев-операций к конкретной сложной операции.
V>>То бишь, каждый лист (в том числе параметрический) принадлежит куче "деревьев"-конкретных планов.
S>В том-то и дело, что нет, не принадлежит.
Давай мы сделаем паузу, пока ты не поймешь этот момент.
Потому что иначе выходит что мы обсуждаем разные предполагаемые системы.
V>>Твоя "локальная информация" имеет строгую иерархическую природу.
S>(facepalm)/
V>>Так КАК она будет хранится?
S>Это как раз неважно.
Тогда зачем ты сюда пишешь если не разобрался?
Тебе самому скучно и ты решил сделать скучно другим?
S>>>Грубо говоря, мы можем использовать любой из 5-6 индексов по Manager, потому что а вдруг там в where что-то особенно селективное написано
V>>Прикольный залет, причём, ты уже вроде бы 3-й раз одинаково залетаешь.
S>Это не залёт, это невнимательность с твоей стороны.
Типа, лучшая оборона — это нападение?
V>>Ведь не "вдруг", а на руках полная комбинация всех where.
S>Это в конкретном запросе. С конкретными значениями параметров.
Пофик. Речь шла о полном наборе планов.
Т.е. твои возражения НЕ релевантны обсуждаемому и являются, по-сути, подлогом/жульничеством.
А выдаваемые таким тоном если, то это еще и показуха получается, работа на публику.
Ну или ты действительно ни черта не понимаешь.
V>>Эти where часто образуют иерархию, например, where x>100, а потом еще where x>100 and x<1000 и т.д.
S>Вот это место не имеет физического смысла. Даже если у нас есть много предикатов на один и тот же атрибут, то никакой иерархии они не образуют.
Мде...
Например, движок оптимизации того же MySQL использует библиотеки Буста Graph и Geometry.
И если насчёт graph понятно, как ты думаешь, зачем там geometry? Что именно используется?
V>>За 10-15 индексов по order положено расстреливать, ну пусть даже 10-15 индексов.
S>Твои представления о том, за что положено расстреливать, а за что — увольнять, выдают малый опыт в обсуждаемой теме.
Ты сказал конкретно order, вот и отвечай за order.
А натягивать "почти OLAP" я же первый не рекомендовал сразу же, бо там ДРУГОЙ сценарий.
Я сразу же оговорился, что для оперативных и исторических данных используют РАЗНЫЕ подходы.
Исторические данные неизменны.
Оперативные — наоборот.
Смешивать их и при этом заявлять о своём "опыте" — это нагло врать.
Врать или о своём опыте или о своей претензии на честность дискуссии.
Ну реально, ты такой бежишь размахивать 15-ю индексами.
Это для частоизменяемых данных? ))
ОМГ...
Уволить. Расстрелять.
Это не инженерия, это вредительство.
"Куда вы все лезете, там Ад и Израиль!!!"
Мол, "я же не лезу, вот и вы не лезьте".
V>>Сколько всего таблиц навроде "order" в средней системе?
S>Смотря что считать "средней системой".
В средней современной системе в р-не 800-1000 таблиц.
Но ты опять пустословишь вместо разговора по-существу, заметь.
S>>>Итого получаем от полусотни до сотни вариантов исполнения этого join.
V>>И это для самой индексированной таблице, аналогов которой единицы штук даже в самых крупных учётных системах.
S>Это мы говорим про 1 джойн. В самой средней учётной системе мы регулярно имеем запросы с 5-10 джойнами.
Из которых тяжелый join один, редко два.
Остальные — по данным справочного типа прямо по кластерному ключу из таблиц с весьма конечным кол-вом редкоизменяемых записей.
Это как оно в реальных системах, а именно — в бухгалтериях, складах (в любой торговле, в том числе интернетной), в банковском опердне, на биржах (фондовых и товарных) и даже в учётных системах, скажем, библиотек и музеев. А не в твоих фантазиях из параллельной реальности, которые мне уже откровенно лень разбирать...
Ну найдешь ты какой-нить уникальный ЖУТКО РЕДКИЙ сценарий, который не ляжет гладко на предполагаемую систему.
Ну и на здоровье, возьми более подходящий для такой уникальной задачи инструмент, какие проблемы?
Ты инженер или где? )))
S>Потому как схемы высоконормализованные
Для высоконормализованных схем не будет такой ширины таблицы, чтобы по 15 индексов лепить.
S>И как раз обычно в них ровно одна такая "самая индексированная" таблица.
Видели, знаем, выжигали калёным железом.
Это тот самый широко известный в узких кругах OLAP для бедных.
Кароч, откройте для себя репликацию и OLAP для взрослых.
Стоило один раз показать и взрослые люди радовались как малые дети.
Самые существенные изменения в БД за последние лет 20 — они как раз в плане репликаций.
Их появилось столько режимов и столько инструментов под них — у-у-у.
Но, судя по 15-ти индексам, это всё каким-то чудесным образом тебя не коснулось.
Абсолютно во всех перечисленных типах систем главная таблица одна — это таблица движений.
Денег ли по счетам или товаров по складам.
Или две таблицы для склада, когда приход и расход разделены.
Абсолютно во всех без исключения таких системах серьезного уровня строго разделяют оперативные данные и исторические.
Причём, для опердня историческими данными является уже вчерашнее число.
Для склада или бухгалтерии чаще прошлый месяц.
Так вот, в чём суть твоего мухлежа:
— для оперативных данных много индексов не надо, их обычно ровно 3 во всех перечисленных типах систем (для упомянутой основной таблицы движений);
— для исторических данных не надо много динамических планов, бо данные неизменяемые, индексы априори пересчитаны, как я предлагал т.н. "профилирование по реальным данным" — оно вполне может быть частью операции "закрытие периода" — это одна из самых важных операций ЛЮБЫХ учётных систем более-менее серьезного уровня.
V>>При том, что про полусотню враки — большая часть вариантов откидываются как заведомо худшие еще на этапе построения всего набора планов.
S>(facepalm) с чего бы это они будут отброшены?
Да бывает такая хрень в алгоритмах Uniform Cost Search или Topological Sort.
Смирись. ))
S>Для каждого из них бывает такая комбинация параметров запроса и набора данных в таблице, когда именно этот вариант плана выиграет.
Бывает. Но это должен быть запрос соответствующий. А все запросы заранее известны. А таких специфических запросов и 1% не будет.
И про размен явной параметризации на эффективность я тебе уже говорил.
Вполне можно настраивать пороги, когда мы еще можем позволить себе генерить код вширь (распространение подстановок), а когда уже хватит.
Похоже, ты не понимаешь, как такие вещи работают.
Сначала происходит "распознавание" похожих мест — т.е. из вообще всех таблиц и всех запросов.
Если интересует конкретно — спроси меня как.
Я когда-то писал часть системы по распознаванию смысла текстов.
Тоже относительно несложные алгоритмы на графах и подобиях.
Семантику языков программирования (даже 4-го уровня) "распознавать" еще проще.
Не синтаксис, а именно семантику — т.е. "что конкретно ты имел ввиду".
Т.е. по набору примитивных операций выходить на более высокий "смысл" происходящего.
И здесь уже производить преобразования подобия.
V>>Это если плавать в предмете, сорри.
S>Сорри, нет.
V>>Если на основании предикатов exists, any/all, not in и т.д. — то та же херня что join, вид сбоку, они все через join выразимы.
S>Отож.
Ну т.е. понимаешь, что пример был не в кассу после обсуждения join?
V>>А если на основании агрегирующих математических ф-ий — то кол-во вариантов планов падает на порядок-другой сразу, бо опять же получается иерархия исполнения всех (сколько бы ни было уровней вложенности) подзапросов.
S>Возрастает. На порядок возрастает. Потому что возникают варианты "сначала join, потом агрегация", либо "агрегация, потом join".
Вот, опять нечестная манипуляция.
Я верю что ты не понимаешь, что это зависит от конкретного запроса, т.е. где конкретно происходит агрегация и по чему именно происходит join.
Т.е. "возрастает" там только в смысле мощности порождаемых языком комбинаций, но никак не в смысле множества вариантов исполнения конкретного такого выражения. Потому для каждого конкретного выражения — многократно падает. Сама операция агрегации отрезает нахрен кучу потенциальных планов, которые имели право на жизнь в отсутствии такой агрегации. Потому что дело не в том "сначала агрегация, потом join", а в том — какие таблицы сначала сканить, именно такой выбор сужается многократно.
V>>Всё, я сдаюсь.
V>>Коллега, ну это уже упоротость какая-то. ))
S>Нет, это близкое знакомство с предметом.
В кач-ве юзверя некоей системы.
Но обсуждается принципиально другая.
V>>План запроса не хранится в виде данных.
V>>Он хранится как код, как ф-ия с параметрами.
V>>Для этого всё и затевалось.
S>Очень хорошо.
V>>Степень повторного использования можно регулировать через связывания аргументов с константами, т.е. еще на этапе бета-редукции.
V>>При минимальном связывании будет минимальный бинарник, но макимальное кол-во параметров у каждой ф-ии, при максимальном связывании — наоборот.
S>Нам не так важно, как это хранится.
Важно.
S>SQL-сервер хранит это в виде дерева физических операций, при исполнении — интерпретирует.
Верно, в современных серваках это всегда хранится как скриптовая программа — в виде AST или p-кода некоторой абстрактной машинки.
Разница тут в том, что в динамике твой сервак ну никак не может находить идентичные ветки AST или подпрограмм p-кода.
S>Ок, мы можем "улучшить" ситуацию путём генерации не объектов-описаний, а, к примеру, Expression<>. Или байткода в стиле MSIL, LLVM, или Java.
Дык, дотнет и джаву ругают как раз за то, что они принципиально не в состоянии производить описанные оптимизации.
Поэтому, их бинарник в памяти после джита занимает какое-то совсем уж неприличное кол-во байт, что джаве даже пришлось ввести сборку мусора для кода, ы-ы-ы (привет из 90-х, когда память стоила дороже золота).
Зато .Net Native — запросто может.
Стирание типов — великая весчь.
S>Или сразу вообще скомпилировать бинарь. Это повлияет только на скорость исполнения этого плана. На место, которое он занимает, это повлияет в плохую сторону.
Скажи, ты знал о том факте, что первые компляторы С++, поддерживающие шаблоны, генерили какой-то совсем уж распухший бинарник?
А знал ли ты, что когда компиляторы С++ научились склеивать шаблонный код, то почему-то под этот механизм попал и вовсе не шаблонный, а вообще весь код и это сжало бинарник средней программы (даже без всяких шаблонов) примерно втрое? А знал ли ты, что в сравнении с теми самыми первыми компиляторами с шаблонами но без сжатия, размер генерируемого бинарника ужался более чем на порядок?
А сравнение со сриптовым языком после джита я тебе уже приводил — разница до 50-ти раз.
А кеш проца ведь не бесконечный. Чем реже оттуда вытесняется код, тем эффективнее вся система.
V>>Взял бы ручками да раписал планы вокруг одной и той же комбинации join.
V>>Ты ведь никогда этого не делал, верно?
S>Зачем? Мне их сервер выписывал, когда я занимался оптимизацией SQL.
Верно. Он ведь может вообще все планы дать.
Так сколько он в среднем даёт планов по одному join?
V>>При исполнении плана дерево тут строго в другую сторону растёт — от примитивных листьев-операций к конкретной сложной операции.
V>>То бишь, каждый лист (в том числе параметрический) принадлежит куче "деревьев"-конкретных планов.
S>В том-то и дело, что нет, не принадлежит.
Давай мы сделаем паузу, пока ты не поймешь этот момент.
Потому что иначе выходит что мы обсуждаем разные предполагаемые системы.
Re[35]: В России опять напишут новый объектно-ориентированны
Здравствуйте, Sinclair, Вы писали:
V>>Твоя "локальная информация" имеет строгую иерархическую природу.
S>(facepalm)/
V>>Так КАК она будет хранится?
S>Это как раз неважно.
Тогда зачем ты сюда пишешь если не разобрался?
Тебе самому скучно и ты решил сделать скучно другим?
S>>>Грубо говоря, мы можем использовать любой из 5-6 индексов по Manager, потому что а вдруг там в where что-то особенно селективное написано
V>>Прикольный залет, причём, ты уже вроде бы 3-й раз одинаково залетаешь.
S>Это не залёт, это невнимательность с твоей стороны.
Типа, лучшая оборона — это нападение?
V>>Ведь не "вдруг", а на руках полная комбинация всех where.
S>Это в конкретном запросе. С конкретными значениями параметров.
Пофик. Речь шла о полном наборе планов.
Т.е. твои возражения НЕ релевантны обсуждаемому и являются, по-сути, подлогом/жульничеством.
А выдаваемые таким тоном если, то это еще и показуха получается, работа на публику.
Ну или ты действительно ни черта не понимаешь.
V>>Эти where часто образуют иерархию, например, where x>100, а потом еще where x>100 and x<1000 и т.д.
S>Вот это место не имеет физического смысла. Даже если у нас есть много предикатов на один и тот же атрибут, то никакой иерархии они не образуют.
Мде...
Например, движок оптимизации того же MySQL использует библиотеки Буста Graph и Geometry.
И если насчёт graph понятно, как ты думаешь, зачем там geometry? Что именно используется?
V>>За 10-15 индексов по order положено расстреливать, ну пусть даже 10-15 индексов.
S>Твои представления о том, за что положено расстреливать, а за что — увольнять, выдают малый опыт в обсуждаемой теме.
Ты сказал конкретно order, вот и отвечай за order.
А натягивать "почти OLAP" я же первый не рекомендовал сразу же, бо там ДРУГОЙ сценарий.
Я сразу же оговорился, что для оперативных и исторических данных используют РАЗНЫЕ подходы.
Исторические данные неизменны.
Оперативные — наоборот.
Смешивать их и при этом заявлять о своём "опыте" — это нагло врать.
Врать или о своём опыте или о своей претензии на честность дискуссии.
Ну реально, ты такой бежишь размахивать 15-ю индексами.
Это для частоизменяемых данных? ))
ОМГ...
Уволить. Расстрелять.
Это не инженерия, это вредительство.
"Куда вы все лезете, там Ад и Израиль!!!"
Мол, "я же не лезу, вот и вы не лезьте".
V>>Сколько всего таблиц навроде "order" в средней системе?
S>Смотря что считать "средней системой".
В средней современной системе в р-не 800-1000 таблиц.
Но ты опять пустословишь вместо разговора по-существу, заметь.
S>>>Итого получаем от полусотни до сотни вариантов исполнения этого join.
V>>И это для самой индексированной таблице, аналогов которой единицы штук даже в самых крупных учётных системах.
S>Это мы говорим про 1 джойн. В самой средней учётной системе мы регулярно имеем запросы с 5-10 джойнами.
Из которых тяжелый join один, редко два.
Остальные — по данным справочного типа прямо по кластерному ключу из таблиц с весьма конечным кол-вом редкоизменяемых записей.
Это как оно в реальных системах, а именно — в бухгалтериях, складах (в любой торговле, в том числе интернетной), в банковском опердне, на биржах (фондовых и товарных) и даже в учётных системах, скажем, библиотек и музеев. А не в твоих фантазиях из параллельной реальности, которые мне уже откровенно лень разбирать...
Ну найдешь ты какой-нить уникальный ЖУТКО РЕДКИЙ сценарий, который не ляжет гладко на предполагаемую систему.
Ну и на здоровье, возьми более подходящий для такой уникальной задачи инструмент, какие проблемы?
Ты инженер или где? )))
S>Потому как схемы высоконормализованные
Для высоконормализованных схем не будет такой ширины таблицы, чтобы по 15 индексов лепить.
S>И как раз обычно в них ровно одна такая "самая индексированная" таблица.
Видели, знаем, выжигали калёным железом.
Это тот самый широко известный в узких кругах OLAP для бедных.
Кароч, откройте для себя репликацию и OLAP для взрослых.
Стоило один раз показать и взрослые люди радовались как малые дети.
Самые существенные изменения в БД за последние лет 20 — они как раз в плане репликаций.
Их появилось столько режимов и столько инструментов под них — у-у-у.
Но, судя по 15-ти индексам, это всё каким-то чудесным образом тебя не коснулось.
Абсолютно во всех перечисленных типах систем главная таблица одна — это таблица движений.
Денег ли по счетам или товаров по складам.
Или две таблицы для склада, когда приход и расход разделены.
Абсолютно во всех без исключения таких системах серьезного уровня строго разделяют оперативные данные и исторические.
Причём, для опердня историческими данными является уже вчерашнее число.
Для склада или бухгалтерии чаще прошлый месяц.
Так вот, в чём суть твоего мухлежа:
— для оперативных данных много индексов не надо, их обычно ровно 3 во всех перечисленных типах систем (для упомянутой основной таблицы движений);
— для исторических данных не надо много динамических планов, бо данные неизменяемые, индексы априори пересчитаны, как я предлагал т.н. "профилирование по реальным данным" — оно вполне может быть частью операции "закрытие периода" — это одна из самых важных операций ЛЮБЫХ учётных систем более-менее серьезного уровня.
V>>При том, что про полусотню враки — большая часть вариантов откидываются как заведомо худшие еще на этапе построения всего набора планов.
S>(facepalm) с чего бы это они будут отброшены?
Да бывает такая хрень в алгоритмах Uniform Cost Search или Topological Sort.
Смирись. ))
S>Для каждого из них бывает такая комбинация параметров запроса и набора данных в таблице, когда именно этот вариант плана выиграет.
Бывает. Но это должен быть запрос соответствующий. А все запросы заранее известны. А таких специфических запросов и 1% не будет.
И про размен явной параметризации на эффективность я тебе уже говорил.
Вполне можно настраивать пороги, когда мы еще можем позволить себе генерить код вширь (распространение подстановок), а когда уже хватит.
Похоже, ты не понимаешь, как такие вещи работают.
Сначала происходит "распознавание" похожих мест — т.е. из вообще всех таблиц и всех запросов.
Если интересует конкретно — спроси меня как.
Я когда-то писал часть системы по распознаванию смысла текстов.
Тоже относительно несложные алгоритмы на графах и подобиях.
Семантику языков программирования (даже 4-го уровня) "распознавать" еще проще.
Не синтаксис, а именно семантику — т.е. "что конкретно ты имел ввиду".
Т.е. по набору примитивных операций выходить на более высокий "смысл" происходящего.
И здесь уже производить преобразования подобия.
V>>Это если плавать в предмете, сорри.
S>Сорри, нет.
V>>Если на основании предикатов exists, any/all, not in и т.д. — то та же херня что join, вид сбоку, они все через join выразимы.
S>Отож.
Ну т.е. понимаешь, что пример был не в кассу после обсуждения join?
V>>А если на основании агрегирующих математических ф-ий — то кол-во вариантов планов падает на порядок-другой сразу, бо опять же получается иерархия исполнения всех (сколько бы ни было уровней вложенности) подзапросов.
S>Возрастает. На порядок возрастает. Потому что возникают варианты "сначала join, потом агрегация", либо "агрегация, потом join".
Вот, опять нечестная манипуляция.
Я не верю что ты не понимаешь, что это зависит от конкретного запроса, т.е. где конкретно происходит агрегация и по чему именно происходит join.
Т.е. "возрастает" там только в смысле мощности порождаемых языком комбинаций, но никак не в смысле множества вариантов исполнения конкретного такого выражения. Потому для каждого конкретного выражения — многократно падает. Сама операция агрегации отрезает нахрен кучу потенциальных планов, которые имели право на жизнь в отсутствии такой агрегации. Потому что дело не в том "сначала агрегация, потом join", а в том — какие таблицы сначала сканить, именно такой выбор сужается многократно.
V>>Всё, я сдаюсь.
V>>Коллега, ну это уже упоротость какая-то. ))
S>Нет, это близкое знакомство с предметом.
В кач-ве юзверя некоей системы.
Но обсуждается принципиально другая.
V>>План запроса не хранится в виде данных.
V>>Он хранится как код, как ф-ия с параметрами.
V>>Для этого всё и затевалось.
S>Очень хорошо.
V>>Степень повторного использования можно регулировать через связывания аргументов с константами, т.е. еще на этапе бета-редукции.
V>>При минимальном связывании будет минимальный бинарник, но макимальное кол-во параметров у каждой ф-ии, при максимальном связывании — наоборот.
S>Нам не так важно, как это хранится.
Важно.
S>SQL-сервер хранит это в виде дерева физических операций, при исполнении — интерпретирует.
Верно, в современных серваках это всегда хранится как скриптовая программа — в виде AST или p-кода некоторой абстрактной машинки.
Разница тут в том, что в динамике твой сервак ну никак не может находить идентичные ветки AST или подпрограмм p-кода.
S>Ок, мы можем "улучшить" ситуацию путём генерации не объектов-описаний, а, к примеру, Expression<>. Или байткода в стиле MSIL, LLVM, или Java.
Дык, дотнет и джаву ругают как раз за то, что они принципиально не в состоянии производить описанные оптимизации.
Поэтому, их бинарник в памяти после джита занимает какое-то совсем уж неприличное кол-во байт, что джаве даже пришлось ввести сборку мусора для кода, ы-ы-ы (привет из 90-х, когда память стоила дороже золота).
Зато .Net Native — запросто может.
Стирание типов — великая весчь.
S>Или сразу вообще скомпилировать бинарь. Это повлияет только на скорость исполнения этого плана. На место, которое он занимает, это повлияет в плохую сторону.
Скажи, ты знал о том факте, что первые компляторы С++, поддерживающие шаблоны, генерили какой-то совсем уж распухший бинарник?
А знал ли ты, что когда компиляторы С++ научились склеивать шаблонный код, то почему-то под этот механизм попал и вовсе не шаблонный, а вообще весь код и это сжало бинарник средней программы (даже без всяких шаблонов) примерно втрое? А знал ли ты, что в сравнении с теми самыми первыми компиляторами с шаблонами но без сжатия, размер генерируемого бинарника ужался более чем на порядок?
А сравнение со сриптовым языком после джита я тебе уже приводил — разница до 50-ти раз.
А кеш проца ведь не бесконечный. Чем реже оттуда вытесняется код, тем эффективнее вся система.
V>>Взял бы ручками да раписал планы вокруг одной и той же комбинации join.
V>>Ты ведь никогда этого не делал, верно?
S>Зачем? Мне их сервер выписывал, когда я занимался оптимизацией SQL.
Верно. Он ведь может вообще все планы дать.
Так сколько он в среднем даёт планов по одному join?
V>>При исполнении плана дерево тут строго в другую сторону растёт — от примитивных листьев-операций к конкретной сложной операции.
V>>То бишь, каждый лист (в том числе параметрический) принадлежит куче "деревьев"-конкретных планов.
S>В том-то и дело, что нет, не принадлежит.
Давай мы сделаем паузу, пока ты не поймешь этот момент.
Потому что иначе выходит что мы обсуждаем разные предполагаемые системы.
V>>Твоя "локальная информация" имеет строгую иерархическую природу.
S>(facepalm)/
V>>Так КАК она будет хранится?
S>Это как раз неважно.
Тогда зачем ты сюда пишешь если не разобрался?
Тебе самому скучно и ты решил сделать скучно другим?
S>>>Грубо говоря, мы можем использовать любой из 5-6 индексов по Manager, потому что а вдруг там в where что-то особенно селективное написано
V>>Прикольный залет, причём, ты уже вроде бы 3-й раз одинаково залетаешь.
S>Это не залёт, это невнимательность с твоей стороны.
Типа, лучшая оборона — это нападение?
V>>Ведь не "вдруг", а на руках полная комбинация всех where.
S>Это в конкретном запросе. С конкретными значениями параметров.
Пофик. Речь шла о полном наборе планов.
Т.е. твои возражения НЕ релевантны обсуждаемому и являются, по-сути, подлогом/жульничеством.
А выдаваемые таким тоном если, то это еще и показуха получается, работа на публику.
Ну или ты действительно ни черта не понимаешь.
V>>Эти where часто образуют иерархию, например, where x>100, а потом еще where x>100 and x<1000 и т.д.
S>Вот это место не имеет физического смысла. Даже если у нас есть много предикатов на один и тот же атрибут, то никакой иерархии они не образуют.
Мде...
Например, движок оптимизации того же MySQL использует библиотеки Буста Graph и Geometry.
И если насчёт graph понятно, как ты думаешь, зачем там geometry? Что именно используется?
V>>За 10-15 индексов по order положено расстреливать, ну пусть даже 10-15 индексов.
S>Твои представления о том, за что положено расстреливать, а за что — увольнять, выдают малый опыт в обсуждаемой теме.
Ты сказал конкретно order, вот и отвечай за order.
А натягивать "почти OLAP" я же первый не рекомендовал сразу же, бо там ДРУГОЙ сценарий.
Я сразу же оговорился, что для оперативных и исторических данных используют РАЗНЫЕ подходы.
Исторические данные неизменны.
Оперативные — наоборот.
Смешивать их и при этом заявлять о своём "опыте" — это нагло врать.
Врать или о своём опыте или о своей претензии на честность дискуссии.
Ну реально, ты такой бежишь размахивать 15-ю индексами.
Это для частоизменяемых данных? ))
ОМГ...
Уволить. Расстрелять.
Это не инженерия, это вредительство.
"Куда вы все лезете, там Ад и Израиль!!!"
Мол, "я же не лезу, вот и вы не лезьте".
V>>Сколько всего таблиц навроде "order" в средней системе?
S>Смотря что считать "средней системой".
В средней современной системе в р-не 800-1000 таблиц.
Но ты опять пустословишь вместо разговора по-существу, заметь.
S>>>Итого получаем от полусотни до сотни вариантов исполнения этого join.
V>>И это для самой индексированной таблице, аналогов которой единицы штук даже в самых крупных учётных системах.
S>Это мы говорим про 1 джойн. В самой средней учётной системе мы регулярно имеем запросы с 5-10 джойнами.
Из которых тяжелый join один, редко два.
Остальные — по данным справочного типа прямо по кластерному ключу из таблиц с весьма конечным кол-вом редкоизменяемых записей.
Это как оно в реальных системах, а именно — в бухгалтериях, складах (в любой торговле, в том числе интернетной), в банковском опердне, на биржах (фондовых и товарных) и даже в учётных системах, скажем, библиотек и музеев. А не в твоих фантазиях из параллельной реальности, которые мне уже откровенно лень разбирать...
Ну найдешь ты какой-нить уникальный ЖУТКО РЕДКИЙ сценарий, который не ляжет гладко на предполагаемую систему.
Ну и на здоровье, возьми более подходящий для такой уникальной задачи инструмент, какие проблемы?
Ты инженер или где? )))
S>Потому как схемы высоконормализованные
Для высоконормализованных схем не будет такой ширины таблицы, чтобы по 15 индексов лепить.
S>И как раз обычно в них ровно одна такая "самая индексированная" таблица.
Видели, знаем, выжигали калёным железом.
Это тот самый широко известный в узких кругах OLAP для бедных.
Кароч, откройте для себя репликацию и OLAP для взрослых.
Стоило один раз показать и взрослые люди радовались как малые дети.
Самые существенные изменения в БД за последние лет 20 — они как раз в плане репликаций.
Их появилось столько режимов и столько инструментов под них — у-у-у.
Но, судя по 15-ти индексам, это всё каким-то чудесным образом тебя не коснулось.
Абсолютно во всех перечисленных типах систем главная таблица одна — это таблица движений.
Денег ли по счетам или товаров по складам.
Или две таблицы для склада, когда приход и расход разделены.
Абсолютно во всех без исключения таких системах серьезного уровня строго разделяют оперативные данные и исторические.
Причём, для опердня историческими данными является уже вчерашнее число.
Для склада или бухгалтерии чаще прошлый месяц.
Так вот, в чём суть твоего мухлежа:
— для оперативных данных много индексов не надо, их обычно ровно 3 во всех перечисленных типах систем (для упомянутой основной таблицы движений);
— для исторических данных не надо много динамических планов, бо данные неизменяемые, индексы априори пересчитаны, как я предлагал т.н. "профилирование по реальным данным" — оно вполне может быть частью операции "закрытие периода" — это одна из самых важных операций ЛЮБЫХ учётных систем более-менее серьезного уровня.
V>>При том, что про полусотню враки — большая часть вариантов откидываются как заведомо худшие еще на этапе построения всего набора планов.
S>(facepalm) с чего бы это они будут отброшены?
Да бывает такая хрень в алгоритмах Uniform Cost Search или Topological Sort.
Смирись. ))
S>Для каждого из них бывает такая комбинация параметров запроса и набора данных в таблице, когда именно этот вариант плана выиграет.
Бывает. Но это должен быть запрос соответствующий. А все запросы заранее известны. А таких специфических запросов и 1% не будет.
И про размен явной параметризации на эффективность я тебе уже говорил.
Вполне можно настраивать пороги, когда мы еще можем позволить себе генерить код вширь (распространение подстановок), а когда уже хватит.
Похоже, ты не понимаешь, как такие вещи работают.
Сначала происходит "распознавание" похожих мест — т.е. из вообще всех таблиц и всех запросов.
Если интересует конкретно — спроси меня как.
Я когда-то писал часть системы по распознаванию смысла текстов.
Тоже относительно несложные алгоритмы на графах и подобиях.
Семантику языков программирования (даже 4-го уровня) "распознавать" еще проще.
Не синтаксис, а именно семантику — т.е. "что конкретно ты имел ввиду".
Т.е. по набору примитивных операций выходить на более высокий "смысл" происходящего.
И здесь уже производить преобразования подобия.
V>>Это если плавать в предмете, сорри.
S>Сорри, нет.
V>>Если на основании предикатов exists, any/all, not in и т.д. — то та же херня что join, вид сбоку, они все через join выразимы.
S>Отож.
Ну т.е. понимаешь, что пример был не в кассу после обсуждения join?
V>>А если на основании агрегирующих математических ф-ий — то кол-во вариантов планов падает на порядок-другой сразу, бо опять же получается иерархия исполнения всех (сколько бы ни было уровней вложенности) подзапросов.
S>Возрастает. На порядок возрастает. Потому что возникают варианты "сначала join, потом агрегация", либо "агрегация, потом join".
Вот, опять нечестная манипуляция.
Я не верю что ты не понимаешь, что это зависит от конкретного запроса, т.е. где конкретно происходит агрегация и по чему именно происходит join.
Т.е. "возрастает" там только в смысле мощности порождаемых языком комбинаций, но никак не в смысле множества вариантов исполнения конкретного такого выражения. Потому для каждого конкретного выражения — многократно падает. Сама операция агрегации отрезает нахрен кучу потенциальных планов, которые имели право на жизнь в отсутствии такой агрегации. Потому что дело не в том "сначала агрегация, потом join", а в том — какие таблицы сначала сканить, именно такой выбор сужается многократно.
V>>Всё, я сдаюсь.
V>>Коллега, ну это уже упоротость какая-то. ))
S>Нет, это близкое знакомство с предметом.
В кач-ве юзверя некоей системы.
Но обсуждается принципиально другая.
V>>План запроса не хранится в виде данных.
V>>Он хранится как код, как ф-ия с параметрами.
V>>Для этого всё и затевалось.
S>Очень хорошо.
V>>Степень повторного использования можно регулировать через связывания аргументов с константами, т.е. еще на этапе бета-редукции.
V>>При минимальном связывании будет минимальный бинарник, но макимальное кол-во параметров у каждой ф-ии, при максимальном связывании — наоборот.
S>Нам не так важно, как это хранится.
Важно.
S>SQL-сервер хранит это в виде дерева физических операций, при исполнении — интерпретирует.
Верно, в современных серваках это всегда хранится как скриптовая программа — в виде AST или p-кода некоторой абстрактной машинки.
Разница тут в том, что в динамике твой сервак ну никак не может находить идентичные ветки AST или подпрограмм p-кода.
S>Ок, мы можем "улучшить" ситуацию путём генерации не объектов-описаний, а, к примеру, Expression<>. Или байткода в стиле MSIL, LLVM, или Java.
Дык, дотнет и джаву ругают как раз за то, что они принципиально не в состоянии производить описанные оптимизации.
Поэтому, их бинарник в памяти после джита занимает какое-то совсем уж неприличное кол-во байт, что джаве даже пришлось ввести сборку мусора для кода, ы-ы-ы (привет из 90-х, когда память стоила дороже золота).
Зато .Net Native — запросто может.
Стирание типов — великая весчь.
S>Или сразу вообще скомпилировать бинарь. Это повлияет только на скорость исполнения этого плана. На место, которое он занимает, это повлияет в плохую сторону.
Скажи, ты знал о том факте, что первые компляторы С++, поддерживающие шаблоны, генерили какой-то совсем уж распухший бинарник?
А знал ли ты, что когда компиляторы С++ научились склеивать шаблонный код, то почему-то под этот механизм попал и вовсе не шаблонный, а вообще весь код и это сжало бинарник средней программы (даже без всяких шаблонов) примерно втрое? А знал ли ты, что в сравнении с теми самыми первыми компиляторами с шаблонами но без сжатия, размер генерируемого бинарника ужался более чем на порядок?
А сравнение со сриптовым языком после джита я тебе уже приводил — разница до 50-ти раз.
А кеш проца ведь не бесконечный. Чем реже оттуда вытесняется код, тем эффективнее вся система.
V>>Взял бы ручками да раписал планы вокруг одной и той же комбинации join.
V>>Ты ведь никогда этого не делал, верно?
S>Зачем? Мне их сервер выписывал, когда я занимался оптимизацией SQL.
Верно. Он ведь может вообще все планы дать.
Так сколько он в среднем даёт планов по одному join?
V>>При исполнении плана дерево тут строго в другую сторону растёт — от примитивных листьев-операций к конкретной сложной операции.
V>>То бишь, каждый лист (в том числе параметрический) принадлежит куче "деревьев"-конкретных планов.
S>В том-то и дело, что нет, не принадлежит.
Давай мы сделаем паузу, пока ты не поймешь этот момент.
Потому что иначе выходит что мы обсуждаем разные предполагаемые системы.