169 похожих чатов

19 ответов

14 просмотров

drop table if exists dbo.t1, dbo.t2; drop view if exists dbo.v_tables; create table dbo.t1 (a int, b int, c int); insert into dbo.t1 values (1, 1, 1); create table dbo.t2 (a int, b int, c int); insert into dbo.t2 values (2, 2, 2); go create view dbo.v_tables as select 't1' as table_name, a, b, c from dbo.t1 union all select 't2' as table_name, a, b, c from dbo.t2 go select a, b, c from dbo.v_tables where table_name = 't1'; select a, b, c from dbo.v_tables where table_name = 't2';

Александр Ройтман
drop table if exists dbo.t1, dbo.t2; drop view if ...

это жопа ж будет с производительностью

И почему же?

Александр Ройтман
И почему же?

у меня есть предположение, что если добавится and a<4 то там всё станет грустно

Александр Ройтман
Ну добавьте и посмотрите план

такие дела. пока там константа - всё хорошо, когда там параметр, то всё плохо

Petr Ivanov
screenshot такие дела. пока там константа - всё хорошо, когда...

Когда параметр, то тоже хорошо. См. фильтры - это startup expression predicate. Погуглите что это

Александр Ройтман
Когда параметр, то тоже хорошо. См. фильтры - это ...

Саша, на картинке сканируются две таблички. Потом объединяются. Только потом работает фильтр. Что вы хотите спросить у гугла ?

Александр Ройтман
План выполняется слева направо

It depends Читайте статью. https://www.sqlpassion.at/archive/2015/08/24/how-to-read-an-execution-plan/#:~:text=Therefore%20the%20resulting%20data%20flow,flow%20within%20the%20execution%20plan.

Petr Ivanov
screenshot такие дела. пока там константа - всё хорошо, когда...

Optimized for unknown может помочь, особенно когда нет нормального распределения.

Dmitriy Ivanov
It depends Читайте статью. https://www.sqlpassion....

План выполняется слева направо, данные возвращаются справа налево Процесс выполнения плана можно рассматривать как раскручивание рекурсии. optimize for unknown в данном случае вообще не при делах

Александр Ройтман
План выполняется слева направо, данные возвращаютс...

Чтение плана слева направо требует очень хорошего понимания физической работы операторов и методов которые они используют. Если вы конечно один из разработчиков SQL engine с опытом 10+, то для вас не составит труда раскрутить план с 30-40 операторами. Такой способ чтения, по моему мнению, применяется очень редко. Другой подход, он кстати мне ближе, это логическое выполнение плана. В данном подходе вы не задумываетесь о физической стороне вопроса, какой метод и как вызывает нижестоящий метод по плану, а читаете поток данных. Он более прост для восприятия и быстрого анализа. Теперь про optimize for unknown. На каком основании вы определили, что это не подходит?

Dmitriy Ivanov
Чтение плана слева направо требует очень хорошего ...

План можно читать в любом направлении, хоть снизу вверх или сверху вниз. Но без понимания как план выполняется и возникают казусы как с @blackskif И для достижения такого понимания достаточно всего лишь изучить статью документации, в которой описан принцип работы любого итератора. Знать при этом как работают сами итераторы вовсе не обязательно. Касаемо Optimized for unknown - если найдете в обсуждаемом запросе место, где переменная влияет на оценку строк, то да, может помочь. Кстати, даже если бы было место где переменная влияет на оценку, Optimized for unknown все равно бесполезен, ибо нет снифинга параметров.

Александр Ройтман
План можно читать в любом направлении, хоть снизу ...

Если вы об этой статье https://docs.microsoft.com/ru-ru/sql/relational-databases/showplan-logical-and-physical-operators-reference?view=sql-server-ver15 То прочитав ее вы получите знания по тому какой из операторов что делает, но ни как что-то подправить или улучшить. Про хинт, прочитайте коммент под планом.

Dmitriy Ivanov
Если вы об этой статье https://docs.microsoft.com...

Еще раз - что бы понимать в каком порядке выполняются итераторы в плане, не нужно знать о том как выполняется конкретный итератор. Про хинт. Обсуждаемый запрос. use tempdb; go drop table if exists dbo.t1, dbo.t2; drop view if exists dbo.v_tables; create table dbo.t1 (a int, b int, c int); insert into dbo.t1 values (1, 1, 1); create table dbo.t2 (a int, b int, c int); insert into dbo.t2 values (2, 2, 2); go create view dbo.v_tables as select 't1' as table_name, a, b, c from dbo.t1 union all select 't2' as table_name, a, b, c from dbo.t2 go set statistics xml, io on; declare @tn varchar(100) = 't1' select a, b, c from dbo.v_tables where table_name = @tn; set statistics xml, io off; Рекомендую посмотреть на сам план, а не на его изображение. А потом объяснить как на него повлияет optimize for unknown Так же очень сильно рекомендую посмотреть на результат statistics io - на предмет того, из каких же таблиц читались данные.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта