powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связать две таблицы join'ом при связи 1:М.
25 сообщений из 56, страница 2 из 3
Связать две таблицы join'ом при связи 1:М.
    #40034632
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Во-первых, не временем исполнения, а временем загрузки CPU и IO
При одинаковых результатах запросов, чем меньше IO, тем оптимальнее?
ptr128
Если индекс по ID_Detail еще пройдет
Ага. Мимо индекса.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034645
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
При одинаковых результатах запросов, чем меньше IO, тем оптимальнее?

Однозначного ответа нет. Можно такой запрос написать, что IO будет мал, а CPU сожрет сотни секунд. А можно с IO в два раза большим, но выполняющийся за секунду.

Например, попробуйте создать native compiled процедуру в тот момент, когда используемые ей таблицы пустые. Если не рекомпилировать ее или принудительно запрос в ней, после заполнения таблиц обнаружите много приятных неожиданностей.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034667
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Однозначного ответа нет.
Ну если нет, то зачем тогда писать
ptr128
не временем исполнения, а временем загрузки CPU и IO.
?

А критерии оптимальности для каждого свои.
Для конечного пользователя - это время выполнения и ему плевать, что запрос для быстрого выполнения сожрал все ресурсы.
Для ТС - это вообще "громоздкость". И плевать ему на хранение дат как строк, саргабельность предикатов и т.п.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034670
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
зачем тогда писать

Затем, что SQL сервер, в общем случае, используется в многопользовательском режиме. И только в случае явного указания ТС об использовании сервера в монопольном режиме, подход оценки только времени выполнения запроса оправдан.

invm
Для конечного пользователя - это время выполнения и ему плевать, что запрос для быстрого выполнения сожрал все ресурсы.

Сами себе противоречите. Пользователю еще можно простить отсутствие знаний по архитектуре SQL Server. А Вам? Если Вася своим запросом "сожрал все ресурсы", то запрос Пети будет ждать, пока закончится запрос Васи, например, ожидая освобождения немерянного объема запрошенного планировщиком памяти. И конечный пользователь Петя будет возмущаться и будет при этом прав.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034674
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
invm
зачем тогда писать

Затем, что SQL сервер, в общем случае, используется в многопользовательском режиме. И только в случае явного указания ТС об использовании сервера в монопольном режиме, подход оценки только времени выполнения запроса оправдан.

invm
Для конечного пользователя - это время выполнения и ему плевать, что запрос для быстрого выполнения сожрал все ресурсы.

Сами себе противоречите. Пользователю еще можно простить отсутствие знаний по архитектуре SQL Server. А Вам? Если Вася своим запросом "сожрал все ресурсы", то запрос Пети будет ждать, пока закончится запрос Васи, например, ожидая освобождения немерянного объема запрошенного планировщиком памяти. И конечный пользователь Петя будет возмущаться и будет при этом прав.

Больные фантазии.
Чем быстрее запрос выполнится - тем быстрее петя получит свое щастье.

ЗЫ. Можно бесконечно жевать сопли ниочем.
Но это контрпродуктивно.
Чем меньше требуется времени для выполнения запроса - тем меньше ресурсов жрет этот запрос.
Ибо пожирание ресурсов ТОЖЕ требует времени.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034691
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Чем меньше требуется времени для выполнения запроса - тем меньше ресурсов жрет этот запрос.
Ибо пожирание ресурсов ТОЖЕ требует времени.


Ядра CPU это ресурс? Если нет, можно считать Вас троллем и расслабиться.
Если да, то из Вашего утверждение вытекает, что запрос с MAXDOP 0, по сравнению с MAXDOP 1, потребует времени на "пожираение ресурсов" (дополнительных ядер), а значит будет выполняться дольше?

Память это ресурс? Опять, если нет, можно считать Вас троллем и расслабиться.
Если да, то из Вашего утверждения вытекает, что запрос планировщиком 90% памяти сервера выполняется дольше, чем запрос 10% памяти сервера? Фактическое потребление памяти будем считать в обеих случаях одинаковым.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034693
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Затем, что SQL сервер, в общем случае, используется в многопользовательском режиме.
Не путайтесь в показаниях.

Для простоты исключим параллелизм и будем считать, что памяти у нас неограниченно.
Тогда затраты CPU на выполнение одного и того же запроса на одних и тех же данных при неизменном плане не зависит от количества активных пользователей.
Разница между Elapsed time и CPU time - есть суммарное время ожидания различных ресурсов, будь то IO, блокировки, передача результатов клиенту и т.п.
И ваши попытки приплести количество IO в качестве критерия бессмысленны.

Если проще - затраты на IO (без ожиданий) уже включены в CPU time.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034696
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Не путайтесь в показаниях." (с)
invm

исключим параллелизм


Ваше ЧСВ, вроде бы, было задето именно этим сообщением:
ptr128
Во-первых, не временем исполнения, а временем загрузки CPU и IO. Обычно, лучше иметь запрос выполняющийся на 10-20% дольше на одном ядре, чем выполняющийся быстрее, но на 32-х ядрах.

Не правда ли?

К слову, параллелятся далеко не только ядра, но и запросы ввода-вывода (IO). Что-нибудь об СХД или хотя бы RAID слышали?

Для Вас, наверное, будет открытием, но на то, чтобы получить с СХД мегабайт данных десятью запросами из десяти потоков может уйти в несколько раз меньше времени, чем при получении того же мегабайта, но одним запросом или десятью последовательными запросами из одного потока.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034700
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Вы написали фигню. И было объяснено почему именно.
Если не доходит - перечитывайте мой ответ до понимания.
Если понимание не приходит, подумайте - почему в статистике выполнения есть CPU time и Elapsed time, но нет IO time?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034708
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Вы написали фигню. И было объяснено почему именно.
Если не доходит - перечитывайте мой ответ до понимания." (С)

invm
нет IO time?

Потому что SQL сервер его не знает. Эту статистику даже система не знает, хотя и обладает возможностями ее узнать в частных случаях. Только СХД.
Косвенно эту статистику можно оценить через системные счетчики производительности. Но если СХД обслуживает несколько серверов эта информация Вам даст мало полезного.

Попробуйте все же погуглить и дать ответ на вопрос:
Различается ли нагрузка на СХД при чтении одного мегабайта одним запросом ввода-вывода от нагрузки при чтении этого же мегабайта десятью запросами ввода-вывода?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034718
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Потому что SQL сервер его не знает.
Если не знает, то как вы собрались это учитывать?

Осознайте простую вещь: единственный объективный критерий, по которому можно сравнивать производительность разных запросов, решающих одну и ту же задачу - это CPU time.
Все остальное - случайные значения на момент выполнения.

А если уж так хочется грубо оценить потенциальное влияние IO - выполните запрос в тех же тепличных условиях, но предварительно очистите BP.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034729
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Если не знает, то как вы собрались это учитывать?

Элементарно, Ватсон. Косвенным путем глядя на scan count, logical reads и physical reads.

Попробую пояснить на примере.
Есть табличка:
Код: plaintext
1.
2.
name		rows			reserved	data		index_size	unused
FactLoad	26781420            	10382184 KB	3208456 KB	7159760 KB	13968 KB
Код: sql
1.
SELECT * INTO #t FROM factload OPTION (MAXDOP 0)


Код: plaintext
1.
2.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.
Table 'FactLoad'. Scan count  33 , logical reads  404638 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Код: sql
1.
SELECT * INTO #t FROM factload OPTION (MAXDOP 1)


Код: plaintext
1.
2.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.
Table 'FactLoad'. Scan count  1 , logical reads  402392 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Во-первых, сразу видим во сколько потоков выполнялся запрос (33-1=32).

Во-вторых, видим, что параллельный план запроса в данном случае потребовал 2246 дополнительных обращений к кешу данных. То есть, при недостатке памяти дважды с диска могло читаться 0.6% страниц. Таким процентом я готов пренебречь. А было бы 6% - это уже стало бы поводом для размышлений в случае многопользовательской системы.

invm
Все остальное - случайные значения на момент выполнения.

Данный пример заодно показывает, насколько Вы заблуждаетесь. После того, как вся таблица оказалась в кеше, все значения статистик ввода-вывода стабилизировались. То есть, они совсем не "случайные". Нужно просто уметь их правильно интерпретировать )))
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034734
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Элементарно, Ватсон. Косвенным путем глядя на scan count, logical reads и physical reads.

Попробую пояснить на примере.
Не надо ничего объяснять на примерах. Вы просто физику процесса не понимаете.

IO есть физическое и логическое.
Затраты времени на логическое регистрируется в CPU time, потому что (какая неожиданность) логическим занимается CPU.
А на физическое - в ожиданиях PAGEIOLATCH*. Потому что поток ждет, когда завершатся инициированные им физические IO. Суммарно эти ожидания дадут время, затраченное на физические чтения и запись.

Именно поэтому нет отдельной статистики IO time. Именно поэтому количество IO бестолку учитывать при сравнении производительности разных запросов, ибо оно уже учтено в CPU time. А ожидания к сравнению производительности вообще никак не относятся.

Учите матчасть.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034740
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Вы просто физику процесса не понимаете." (с)

invm

Суммарно эти ожидания дадут время, затраченное на физические чтения и запись.

Они дадут погоду на Марсе, так как в общем случае, мы не знаем, что уже в кеше, а чего там нет.

В том то и дело, что для того, чтобы оценить нагрузку на СХД нам нужно проанализировать, количество страниц которые нужны запросу с одной стороны, и то, как часто наш сервер ходит на диск по sys.dm_io_virtual_file_stats.

На практике, мне еще приходилось порой гонять с завидной регулярностью fio, чтобы можно было аргументированно разбираться с администраторами СХД по поводу обещанных и фактических IOPS.

Впрочем мы начинали с того, как различается нагрузка на СХД при MAXDOP 0 и MAXDOP 1. И это я уже наглядно показал. Если все таблицы, используемые в запросе не могут поместиться в кеше - различается, так как читается разное количество страниц. А сколько реально прочиталось в процессе эксплуатации - смотрим уже в sys.dm_exec_query_stats и делаем выводы об этих запросах.

В DWH параллельное выполнение запросов - хорошо. В высоконагруженной многопользовательской системе - не факт. Потому что может быть важно не столько то, сколько ждет результата запроса конкретный Вася. А сколько в среднем времени ожидают выполнения своих запросов все пользователи включая тех, кто ждет завершения Васиного запроса.

"Учите матчасть." (С)
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40034798
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Они дадут погоду на Марсе, так как в общем случае, мы не знаем, что уже в кеше, а чего там нет.
1. Внимательно перечитайте мой ответ. Можно несколько раз, пока не поймете.
2. И еще раз - учите матчасть.

Дальнейшая дискуссия не имеет смысла, пока не осознаете разницу между анализом быстродействия одного запроса и сравнением быстродействия разных запросов.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035432
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

гаданием на SQL метриках Вы не получите предсказание нагрузки СХД. Для получения ясной картины составьте нагрузочные сценарии, и по выполнению этих сценариев замеряйте нагрузку СХД.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035496
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

и даже нагрузочным сценарием не получу, если СХД обслуживает несколько серверов.
Но сравнивая метрики двух запросов смогу оценить вероятность того, что один из запросов создаст больше нагрузку на СХД, чем другой. С точки зрения оптимизации запросов, это может быть полезным. Не более того.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035673
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Но сравнивая метрики двух запросов смогу оценить вероятность того, что один из запросов создаст больше нагрузку на СХД, чем другой.
О, уже какой-то прогресс. По крайней мере, нет речи об общем времени IO.
И по какой методике собрались определять эти вероятности?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035674
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Может хватит клоунады? Об общем времени IO спич вели исключительно Вы, тогда как я изначально вел речь только об оценке нагрузки на СХД при помощи статистик IO, что Вы считали и считаете бессмысленным.

P.S. Мы же вроде бы договорились о прекращении дискуссий о размере пиписек как здесь, так и в будущем?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035691
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Об общем времени IO спич вели исключительно Вы, тогда как я изначально вел речь только об оценке нагрузки на СХД при помощи статистик IO
Ваши слова:
ptr128
Во-первых, не временем исполнения, а временем загрузки CPU и IO.
И где тут СХД? Или для вас logical reads/writes не IO? Тогда дайте какой-нибудь пруф, что это так. Или объясните почему результаты statistics io содержат не только physical но и logical reads?
ptr128
Вы считали и считаете бессмысленным.
Ну так продемонстрируйте смысл и методику его определния. Именно при сравнении быстродействия двух запросов.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035697
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
ptr128
Во-первых, не временем исполнения, а временем загрузки CPU и IO.
И где тут СХД?

А где тут время IO?
Или если я скажу, что схожу за хлебом в зависимости "от времени в пути и настроения", Вы решите, что я говорю об измерении настроения временем?
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035703
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Ну так продемонстрируйте смысл и методику его определния. Именно при сравнении быстродействия двух запросов.

22261187
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035766
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
А где тут время IO?
Я про время спрашивал? Я спрашивал как из Ваших слов понять, что речь ведется о СХД?
ptr128
И где там стравнение быстродействия двух запросов? Там сравнение сериального и параллельного плана одного и того же запроса. Причем, есть подозрение, что Вы не в курсе как вычитываются таблицы/индексы в параллельных планах.

Итого, ответа на
ptr128
Но сравнивая метрики двух запросов смогу оценить вероятность того, что один из запросов создаст больше нагрузку на СХД, чем другой.
Так и нет.
Только не нужно писать, что на самом деле тут идет речь о сравнении сериального и параллельного запроса.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035778
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

ответы все был даны выше. Дополнительные консультации за отдельную плату. До свидания.
...
Рейтинг: 0 / 0
Связать две таблицы join'ом при связи 1:М.
    #40035838
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
ответы все был даны выше. Дополнительные консультации за отдельную плату. До свидания.

Итак, ответов на поставленные вопросы как не было, так и нет. Есть только много гонора...

Попытка втюхать 22261187 как ответ и нечто полезное и высокомудрое - несостоятельна.
Ибо на заданный вопрос не отвечает и Вашу всезнающую голову так и не посетил банальный вопрос - каким образом параллельное полное сканирование таблицы может дать, при прочих равных, большее количество физических чтений, чем такое же сериальное?
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Связать две таблицы join'ом при связи 1:М.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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