Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 вперед Ctrl→ все |
Cammomile Member Откуда: Сообщений: 1214 |
SET STATISTICS IO ON ;WITH CTE AS (SELECT * FROM sys.internal_tables) SELECT * FROM CTE
Что-то я не вижу попыток заехать в тембдб. СТЕ есть, а "Объекта СТЕ" в тембдебе нету, миииистикааааа. |
||
21 дек 17, 17:41 [21053024] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Бы ли бы Вы хоть на йоту образованней, то использовали CTE в таком запросе, где его использование оправдано, а не пытались придумать настолько тупой запрос, который оптимизатор спокойно развернул без CTE. |
||
21 дек 17, 18:19 [21053162] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
Ого, сначала у него " итак понятно что объект не объект , а данные для запроса". Теперь у него " итак понятно, что СТЕ не СТЕ". С таким |
21 дек 17, 18:27 [21053186] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Самокритично Вы про себя ) Насколько Тапок есть флудер и дитя бескультурное, но даже он написал с CTE запрос, создающий и Worktable И Workfile ))) |
||
21 дек 17, 18:31 [21053196] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
рыбка, тебе же уже сказали про 0 или уже забыла? |
||||
21 дек 17, 18:37 [21053211] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
А Вам сказали, что если на автомобиле не ездить, то для него и топливо не нужно? Или про то, что если его толкать или тянуть буксиром, то можно ездить без топлива? Следует ли из этого, что автомобиль не использует топливо? ))) |
||
21 дек 17, 18:44 [21053231] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
|
||
21 дек 17, 19:11 [21053307] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Так я же писал:
Вот его запрос:
И он честно выдает: Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'spt_values'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Workfile и Worktable в tempdb созданы. Но из-за простоты запроса не понадобились. Если же использовать CTE "по назначению", то есть для рекурсивного запроса, взяв образец, например, из документации: -- Create an Employee table. CREATE TABLE dbo.MyEmployees ( EmployeeID smallint NOT NULL, FirstName nvarchar(30) NOT NULL, LastName nvarchar(40) NOT NULL, Title nvarchar(50) NOT NULL, DeptID smallint NOT NULL, ManagerID int NULL, CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC) ); -- Populate the table with values. INSERT INTO dbo.MyEmployees VALUES (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL) ,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1) ,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273) ,(275, N'Michael', N'Blythe', N'Sales Representative',3,274) ,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274) ,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273) ,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285) ,(16, N'David',N'Bradley', N'Marketing Manager', 4, 273) ,(23, N'Mary', N'Gibson', N'Marketing Specialist', 4, 16); WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS ( SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel FROM dbo.MyEmployees WHERE ManagerID IS NULL UNION ALL SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1 FROM dbo.MyEmployees AS e INNER JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID ) SELECT ManagerID, EmployeeID, Title, EmployeeLevel FROM DirectReports ORDER BY ManagerID; То увидим уже активную работу с Worktable в tempdb: Table 'Worktable'. Scan count 2, logical reads 55, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'MyEmployees'. Scan count 2, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. |
||||||||
21 дек 17, 19:24 [21053346] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
ptr128, Так что есть признак "неразворачиваемости"? |
21 дек 17, 21:04 [21053683] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Вам надо, Вы и исследуйте. Мне уже эта тема изрядно поднадоела. Если дети хотят использовать где ни попадя CTE - пусть используют. Тех, которые прийдут ко мне, сам переучу, продемонстрировав его ущербность на больших объемах данных. А остальные пусть работают на конкурентов ) |
||
21 дек 17, 21:14 [21053712] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
|
||||||
21 дек 17, 22:16 [21053875] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31784 |
Ещё раз спрошу: я не понимаю, почему в фразе "Объекты CTE, ..., вложенных запросов и т.п. размещаются в tempdb" вами не упомянуты обычные запросы из одной таблицы, даже без группировок? Фраза была бы вполне закончена: "Объекты CTE, всех запросов и т.п. размещаются в tempdb" И она бы по крайней мере хоть немножко бы соответствовала действительности, пусть с корявой формулировкой. Вложенные запросы, и их разновидность "CTE", не отличаются в этом смысле от каких либо других запросов. CTE и вложенные запросы не отличаются от оператора join. Для сервера нету никаких особых "CTE" и "вложенных запросов", нет операторов database engine для них, есть просто синтаксис "SQL", его семантика после синтаксического анализа преобразуется в операторы обработки множеств, потом оптимизатор из этого делает исполняемые операторы для database engine, он выполняет эти операторы, и если памяти маловато, то он использует для промежуточного хранения tempdb. |
||||
21 дек 17, 22:35 [21053926] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Я не вижу вопросов и аргументов от Вас по интересующей меня теме. В упор. Вы очень захотели знать, по какому признаку можно узнать, использована будет tempdb при CTE запросе или нет. Каким образом это относится к моему утверждению мне совершенно не понятно. "Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb." Я нигде не писал, что "всегда размещаются", или "обязательно размещаются". Я просто привел ссылки на MS, доказывающие мое утверждение. Мне совершенно не интересны частные случаи когда CTE не используют tempdb, из-за того, что такие случаи имеют нулевую практическую ценность. Вашу просьбу "А можете привести пример запроса, который оптимизатор не "разворачивает без CTE"." я удовлетворил. И что происходит даже на примитивном рекурсивном запросе с CTE - я Вам продемонстрировал. Вы и так уже признались, что были не в курсе того, что tempdb использует оперативную память, пока ее достаточно и то, что не знали, что CTE, табличные переменные и вложенные запросы размещают создаваемые ими внутренние объекты в tempdb. (Я перефразировал фразу "Объекты CTE, табличных переменных, вложенных запросов...", так как Вы признались, что у Вас проблемы с русским языком и Вы искренне считаете CTE, переменные и запросы внутренними объектами SQL) Короче, или по теме, или общайтесь сами с собой. Я Вам ничего не обязан. И обучать того, кто учиться не желает тоже не собираюсь. |
||
21 дек 17, 22:36 [21053928] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31784 |
Выполните то же самое без CTE: SELECT TOP 1 a.number FROM master..spt_Values a INNER HASH JOIN master..spt_Values b ON a.number = b.number HASH - вот волшебное слово, а не CTE Уберите слово HASH из вашего запроса с CTE - и будет без worktable |
||
21 дек 17, 22:53 [21053961] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
[quot alexeyvg]
Я уже извинился:
Во-первых, приведите доказательство того, что "обычный запрос из одной таблицы [...] без группировок" размещает внутренний объект в tempdb. И без сортировки, пожалуйста ) Во-вторых, там еще очень много что не упомянуто: курсоры, почта, события, индексы, версионирование строк, триггеры и т.п. Совершенно не вижу смысла перечислять все. Речь была вообще то исключительно о том, что CTE создает объекты в tempdb. Остальное просто к слову пришлось )
Ну а как же курсоры, индексы и версионирования строк? ))) Еще раз, речь шла именно о CTE. Кстати, что интересно, вложенные запросы только Вас возбудили. Хотите извинюсь? Они ведь тоже не всегда порождают что-то в tempdb. Но уж если создают объект - размещают его именно там. )))
Увы, и те, и другие, различаются, причем очень существенно. А именно тем, что не предоставляют возможность создать по результату их выполнения необходимых индексов.
Наоборот, я уже приводил цитату и ссылку: "If memory is available, both table variables and temporary tables are created and processed while in memory (data cache)." Но даже это не так уж важно. Для меня важно то, что для временных таблиц я легко могу создать необходимые мне индексы, а для CTE, табличных переменных и подзапросов - нет. И именно поэтому на больших объемах данных эти механизмы проигрывают в производительности старым добрым временным таблицам. Которые, к тому же, можно размещать, при большом желании, in-memory. |
||||||||||||
21 дек 17, 22:54 [21053962] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Это не мой запрос. И вы пропустили развитие тему. Там как раз явно было сказано, что HASH JOIN точно создаст объект в tempdb. ))) |
||
21 дек 17, 22:56 [21053966] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31784 |
Может, я что то пропустил, я просто смотрю на эти фразы:
и конкретный пример с статистикой и HASH. И сравниваем с цитируемой фразой:
В которой тоже не говорится, что CTE и вложенные запросы - объекты, хранимые в tempdb, а всего лишь то, что выполнение этого может потребовать использовать tempdb Согласитесь уже, что реальность, а так же цитируемые источники имеют совершенно противоположный смысл вашим утверждениям. Ещё раз, сравните: - "Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb" и - "некоторые операторы database engine, например, hash joins, hash aggregates, или sorting, могут использовать tempdb" Тут собрались люди, достаточно хорошо знающие сиквел, почитывающие блоги писателей ядра сиквела, и даже заходят те, кто сами пишет об этом книги, и им режет взгляд такая вольная интерпретация. |
||||||||||
21 дек 17, 23:11 [21053985] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
И особенно интересно узнать, где свои "внутренние объекты" размещают "невложенные" запросы? Наверное в секретном месте...
ЗЫ: Не пытайтесь сохранить лицо, неся полнейший бред. Эффект ровно противоположный - выглядете еще большим идиотом. |
||||||||||||||||
21 дек 17, 23:11 [21053986] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Ну и интересуйтесь. Я тут при чем? Мне достаточно того, что объект, создаваемый CTE "материализуется" в иерархическом запросе, что я, кстати, доказал. Table '[b]Worktable[/b]'. Scan count [b]2[/b], logical reads [b]55[/b], physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'MyEmployees'. Scan count 2, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Я в шоке! То есть Вы и вправду относитесь к тем, кто
У Вас галлюцинации? Найдите там слова "всегда" или "обязательно". Можно с трех попыток )))
Выделите, пожалуста, в моей фразе слово "всех" )))
Глаза протрите! Второй запрос в посте 21053346 после фразы "Если же использовать CTE "по назначению"..."
Вот уж точно вы про себя )))
Извините, но если среди Вашего "словоблудия" и был конкретный вопрос, то я его пропустил. Пожалуйста, повторите его. Если он будт по теме - я на него отвечу. Но именно вопрос, а не просьба провести какие-то эксперименты или обучить Вас различать CTE запросы, создающие временные объекты в tempdb, от тех, которые такие запросы не создают.
Вот тут я соглашусь что погорячился и был не прав. MS под словосочетанием "in-memory OLTP" сейчас понимает совершенно отдельную компоненту внутри SQL сервера, несмотря на то, что ранее средства кеширования в памяти tempdb он тем же самым словосочетанием называл. |
||||||||||||||||||||||||||
21 дек 17, 23:58 [21054028] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Выделите, пожалуйста, в нем слово HASH: -- Create an Employee table. CREATE TABLE dbo.MyEmployees ( EmployeeID smallint NOT NULL, FirstName nvarchar(30) NOT NULL, LastName nvarchar(40) NOT NULL, Title nvarchar(50) NOT NULL, DeptID smallint NOT NULL, ManagerID int NULL, CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC) ); -- Populate the table with values. INSERT INTO dbo.MyEmployees VALUES (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL) ,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1) ,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273) ,(275, N'Michael', N'Blythe', N'Sales Representative',3,274) ,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274) ,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273) ,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285) ,(16, N'David',N'Bradley', N'Marketing Manager', 4, 273) ,(23, N'Mary', N'Gibson', N'Marketing Specialist', 4, 16); WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS ( SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel FROM dbo.MyEmployees WHERE ManagerID IS NULL UNION ALL SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1 FROM dbo.MyEmployees AS e INNER JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID ) SELECT ManagerID, EmployeeID, Title, EmployeeLevel FROM DirectReports ORDER BY ManagerID;
Явно пропустили. Где тут сказано, что всегда или обязательно? Да, внутренние объекты SQL сервера, создаваемые при использовании CTE "размещал" и "размещаются" в tempdb. Если CTE, вложенные запросы и т.п. объектов не создают, то и размещать нечего. Или Вы опять будете требовать от меня извинений за то, что считаете "строительство" объектом? Ну пожалуйтта, ну проститете! )))
Во-первых, в оригинале эта фраза звучала, как
Даже слова CTE в ней не было. Потому что она совсем из другой строки таблицы по ссылке. Во-вторых, действительно, не любой запрос, содержащий "SELECT, INSERT, UPDATE, and DELETE" будет создавать "internal objects" и хранить их в tempdb. Для этого, у него, как минимум, должна возникнуть необходимость такой объект создать. А одно из необходимых (но не достаточное!) условий, для того, чтобы такой объект создался, как раз и есть "вложенный запрос". К которому цитата и относилась. 21051662
О господи! А уже подумал, что Вы хоть что-то понимаете в обсуждаемом вопросе. А Вы вдруг, как дите малое решили пиписьками меряться ))) |
||||||||||||||||||
22 дек 17, 00:17 [21054041] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Сообщение было отредактировано: 22 дек 17, 02:05 |
||
22 дек 17, 01:03 [21054073] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Приношу публично извинения за "пиписьками меряться". Вы меня не оскорбляли, в отличии от некоторых. Поэтому считаю, что я явно погорячился. Но мериться регалиями с незнакомыми людьми, право, не стоит. Так же считаю эту тему закрытой. Несмотря на обилие постов, почему-то, почти никто кроме меня не приводил никаких доказательств своих утверждений, что загадило тему флудом и догматизмом. Все, что я хотел донести, так это то, что при использовании CTE, табличных переменных и вложенных запросов, MS SQL не предоставляет возможности индексации результирующего набора данных. Что может привести (на больших объемах данных и сложных запросах) к худшей производительности, чем при явном использовании временных таблиц с разумно созданными индексами. Если кто-то с этим не согласен - мне, по большому счету, безразлично. Жаль только тех, кто почитав весь этот прессинг на меня решит, что CTE, табличные переменные и вложенные запросы можно смело использовать на терабайтных БД и миллиардах записей. Желающие могут дальше придираться к словам, стилическим и синтаксическим ошибкам и даже к конкретным буквам ))) |
||
22 дек 17, 02:25 [21054124] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
declare @t table (Id int primary key);В зависимости от версии сиквела и поведения оптимизатора, такая добавка может очень сильно улучшить ситуацию. Ваша проблема в том, что вы, со своими терабайтными объемами, зачем-то пришли в раздел форума, в котором, если явно не сказано иное, по умолчанию подразумевается OLTP-нагрузка. Т.е. точечные запросы. Вы уже второй олапер, за последнее время, кто приходит сюда и начинает мудро вещать, основываясь на своих умолчаниях. Именно этим обусловлена такая реакция профессионалов. |
||
22 дек 17, 06:09 [21054160] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Простите, у меня язык не повернулся назвать это возможностью индексирования. Это все же, скорее, ограничение (constraint). Да, это частный случай индексирования, но его возможности настолько уступают возможностям CREATE INDEX, что, лично для меня, этого уже достаточно для того, чтобы отказаться от использования табличных переменных. Благо временной таблицей их заменить можно всегда.
И это Вы называете "реакцией профессионалов"? )))
|
||||||
22 дек 17, 09:03 [21054261] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
ptr128,
дарагуля, давай пример замены в функции? Или как всегда скажешь, что не то имел ввиду? |
||
22 дек 17, 09:08 [21054269] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |