|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Вопрос об использовании временных таблиц в .NET приложении. Пример: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Запросы 1 и 2 будут выполнены как "ad hoc", а запрс 3 как "parameterized" - с использованием sp_executesql. Однако, я нигде не нашел, что такое поведение описано в документации. Если MS когда нибудь изменит поведение SqlCommand так, что запросы 1 и 2 будут упауованы в sp_executesql, то использование временных таблиц из .NET кода станет новозможным, а приложение станет неработоспособным. Т.е.:
... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 13:41 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us, Интегрируйте всю логику в хранимки, тогда проблем точно не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:21 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Критик Alexander Us, Интегрируйте всю логику в хранимки, тогда проблем точно не будет. Думаю, Вы слишком оптимистичны. В хранимку конечно можно передать табличный параметер, но для больного объёма данных табличный параметер тормозот жутко. Для передачи больного объёма данных (как параметра) единственный хороший способ (в смысле быстрый) это использование временной таблицы и заливка в неё балком. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:36 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us, Между коннекшинами они потеряются. Используй либо глобальные ##temp, либо постоянные таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:43 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin, - это понятно, поэтому я и использую один коннекшн - если создание временной таблицы происходит парамеиризорованном запросе (фактически в в sp_executesql) то такая таблица умирает с его окончанием. Что с одним, что с двумя ##. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:48 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us a_voronin, - это понятно, поэтому я и использую один коннекшн - если создание временной таблицы происходит парамеиризорованном запросе (фактически в в sp_executesql) то такая таблица умирает с его окончанием. Что с одним, что с двумя ##. А набить в StringBuilder одну мегапартянку и запустить одним махом -- не вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:49 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin, логика, которую я описал у меня прекрасно работает на "моих" некритичных приложениях. Но я не знаю, насколько она "кошерна" в том плане, что я не могу явно влиять на то, чтобя запрос выполнялся как ad hoc. Ещё раз, я делаю так: В .NET 1) открываем коннекшн 2) создаём временную таблицу ( только ad hoc командой!!! ) 3) заливаем в неё кучу данных через SqlBulkCopy 4) выполняем запрос на выборку/изменение с джоином ко временной таблице (этот запрос уже может быть параметризированный) 5) закрываем коннекшн ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 14:59 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin ...А набить в StringBuilder одну мегапартянку... Для человека, раз вкусившего скорость, прелесть и удобство SqlBulkCopy, это если и вариант, то с горючими, горючими слезами. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 15:02 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
В исходном коде от MS для SqlCommand написано : Код: c# 1. 2.
Будет ли это достаточным основанием считать, что так будет и в следующих версиях .Framework? Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2020, 17:02 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us Будет ли это достаточным основанием считать, что так будет и в следующих версиях .Framework? Ни это, ни вообще что-либо не будет достаточным основанием считать, что в следующиих версиях будет и это, и сама SqlCommand, и вообще что угодно. Прецедент с выпиливанием DataTable в Core 1.0 уже был - в 2.0, правда, вернули. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 09:27 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us 2) создаём временную таблицу ( только ad hoc командой!!! ) 3) заливаем в неё кучу данных через SqlBulkCopy 4) выполняем запрос на выборку/изменение с джоином ко временной таблице (этот запрос уже может быть параметризированный) Вот для такой последовательности действий очень хорошо подходить IN-MEMORY SCHEMA_ONLY. Чего вы ходите вокруг временной таблицы, непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 09:53 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin для такой последовательности действий очень хорошо подходить IN-MEMORY SCHEMA_ONLY. Чего вы ходите вокруг временной таблицы, непонятно. Дык это для SQL2008 R2 Enterprise :( Но спасибо за совет, буду иметь ввиду для более новых версий. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 11:51 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin Вот для такой последовательности действий очень хорошо подходить IN-MEMORY SCHEMA_ONLY. Чего вы ходите вокруг временной таблицы, непонятно. Ради интереса проверил: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Код: plaintext 1. 2. 3.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.
Результат: Код: plaintext 1. 2. 3.
Я, пожалуй, пока буду пользоваться SqlBulkCopy. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2020, 13:40 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Я, пожалуй, пока буду пользоваться SqlBulkCopy. А вы сделали совсем не то, что я рекомендовал Я имел ввиду попробовать using(var bc = new SqlBulkCopy(cnn)) 1) на физической таблице 2) на InMemory таблице SqlBulkCopy в обоих случаях. причем попробуйте в 10 - 15 потоках. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2020, 18:04 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin 2) на InMemory таблице А если данных больше чем доступная Memory? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2020, 18:10 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
a_voronin 1) на физической таблице 2) на InMemory таблице И как в таком случае быть с конкурентным доступом? В тесте я для простоты использовал постоянную таблицу, но вообще предполагалось, что как и у ТС, заливка будет делаться во временную, которая видна только тому, кто делает заливку. А что будет с in-memory? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2020, 18:23 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
hVostt a_voronin 2) на InMemory таблице А если данных больше чем доступная Memory? А что, если данных больше чем доступно места на дисках? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 17:28 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us Alexander Us ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 17:31 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
ЕвгенийВ hVostt пропущено... А если данных больше чем доступная Memory? А что, если данных больше чем доступно места на дисках? Дисковое пространство можно расширить до десятков ТБ очень дёшево. Вопрос актуален. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2020, 22:39 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
hVostt a_voronin 2) на InMemory таблице А если данных больше чем доступная Memory? Конечно это зависит от логики Вашего приложения. Я обычно использую TempTable в комбинации с SqlBulkcopy для копирования / преобразования данных порциями. Так что для меня память не стала бы проблемой. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 15:35 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us Конечно это зависит от логики Вашего приложения. Я обычно использую TempTable в комбинации с SqlBulkcopy для копирования / преобразования данных порциями. Так что для меня память не стала бы проблемой. Порции конечно решают... ) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 15:43 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us Вопрос об использовании временных таблиц в .NET приложении. Пример: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Запросы 1 и 2 будут выполнены как "ad hoc", а запрс 3 как "parameterized" - с использованием sp_executesql. Однако, я нигде не нашел, что такое поведение описано в документации. Если MS когда нибудь изменит поведение SqlCommand так, что запросы 1 и 2 будут упауованы в sp_executesql, то использование временных таблиц из .NET кода станет новозможным, а приложение станет неработоспособным. Т.е.:
Что в вашем понимании "следующий фреймворк"? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 18:05 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Ролг Хупин Что в вашем понимании "следующий фреймворк"? То,что больше 4.8 выпущенной в апреле 2019. Хотелось бы, чтобы код сохранил работоспособность и с ними. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 20:47 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Alexander Us Ролг Хупин Что в вашем понимании "следующий фреймворк"? То,что больше 4.8 выпущенной в апреле 2019. Хотелось бы, чтобы код сохранил работоспособность и с ними. Не помню, чтобы такие несовместимости были в новых фреймворках, ну, это ладно. "Следующий": В ноябре выдйет 5.0, основанный на Core В вашем примере, что означает "parameterized query" и что такое "Х"? Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 09:02 |
|
Временные таблицы и SqlCommand: "ad hoc" vs. "parameterized"
|
|||
---|---|---|---|
#18+
Ролг Хупин В вашем примере, что означает "parameterized query" и что такое "Х"? parameterized query: имеется ввиду, что объект SqlCommand получит параметры, следовательно, на SQL Server запрос прийдёт упакованный в sp_executesql. что такое "Х": да, пример корявый. Прости имелось ввиду, что запрос, который использует временную таблицу для выборки или актуализации данных, может иметь параметры. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 10:49 |
|
|
start [/forum/topic.php?fid=20&msg=39969607&tid=1398518]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 128ms |
0 / 0 |