Версия 23.4 от Alexandr Fokin на 2022/06/15 13:58

Скрыть последних авторов
Alexandr Fokin 2.1 1
2 **Задача:**
Alexandr Fokin 3.1 3 Имеется таблица с записями Таблица1 (При этом размеры таблицы не малы)
4 Имеется список ключей List1 (Кол-во элементов в списке превышает 500)
Alexandr Fokin 2.1 5
6 Необходимо отобрать из Таблица1 значения, у которых поле key попадает в список List1.
7
8 **Варианты реализации:**
9 1) Использование оператора IN, в параметрах у которого перечислены все значения из List1.
10 2) Созданием временной таблицы в рамках запроса, наполнение таблицы значениями из List1, выполнить join между временной таблицой и Таблица1
Alexandr Fokin 4.1 11 (!При этом одна операция INSERT может вставить не более 1000 строк и если элементов больше, то потребуется несколько операций)
Alexandr Fokin 8.1 12 Реализация происходит в рамках sql запросов ado.net, без хранимых процедур. Время, затрачиваемое на построение текста запроса, не учитывается.
Alexandr Fokin 9.1 13 3) Использование xml переменной, данные из которой используются для операции join с Таблица1.
Alexandr Fokin 2.1 14
Alexandr Fokin 3.1 15 {{html}}
16 <table style="height: 179px; width: 620px;">
17 <tbody>
Alexandr Fokin 9.1 18 <tr>
19 <td>Кол-во записей с в Таблица1</td>
20 <td>Кол-во элементов в List1</td>
Alexandr Fokin 10.1 21 <td>Кол-во запусков</td>
Alexandr Fokin 9.1 22 <td>№</td>
Alexandr Fokin 12.1 23 <td>Среднее время выполнения (мс)</td>
Alexandr Fokin 16.1 24
25
Alexandr Fokin 9.1 26 </tr>
27 <tr>
28 <td>20000</td>
29 <td>1000</td>
Alexandr Fokin 11.1 30 <td>50</td>
Alexandr Fokin 9.1 31 <td>1</td>
Alexandr Fokin 11.1 32 <td>97</td>
33 </tr>
34 <tr>
35 <td>&nbsp;</td>
36 <td>&nbsp;</td>
37 <td>&nbsp;</td>
38 <td>2</td>
39 <td>70</td>
40 </tr>
41 <tr>
42 <td>&nbsp;</td>
43 <td>&nbsp;</td>
44 <td>&nbsp;</td>
45 <td>3</td>
46 <td>34</td>
47 </tr>
48
Alexandr Fokin 16.1 49
Alexandr Fokin 11.1 50 <tr>
Alexandr Fokin 13.1 51 <td>&nbsp;</td>
Alexandr Fokin 11.1 52 <td>2000</td>
Alexandr Fokin 14.1 53 <td>50</td>
Alexandr Fokin 11.1 54 <td>1</td>
Alexandr Fokin 14.1 55 <td>202</td>
Alexandr Fokin 9.1 56 </tr>
57 <tr>
58 <td>&nbsp;</td>
59 <td>&nbsp;</td>
Alexandr Fokin 10.1 60 <td>&nbsp;</td>
Alexandr Fokin 9.1 61 <td>2</td>
Alexandr Fokin 11.1 62 <td>126</td>
Alexandr Fokin 9.1 63 </tr>
64 <tr>
65 <td>&nbsp;</td>
66 <td>&nbsp;</td>
Alexandr Fokin 10.1 67 <td>&nbsp;</td>
Alexandr Fokin 9.1 68 <td>3</td>
Alexandr Fokin 11.1 69 <td>60</td>
70 </tr>
Alexandr Fokin 15.1 71
Alexandr Fokin 16.1 72
Alexandr Fokin 15.1 73 <tr>
74 <td>&nbsp;</td>
75 <td>4000</td>
76 <td>50</td>
77 <td>1</td>
78 <td>423</td>
79 </tr>
80 <tr>
81 <td>&nbsp;</td>
82 <td>&nbsp;</td>
83 <td>&nbsp;</td>
84 <td>2</td>
85 <td>247</td>
86 </tr>
87 <tr>
88 <td>&nbsp;</td>
89 <td>&nbsp;</td>
90 <td>&nbsp;</td>
91 <td>3</td>
92 <td>82</td>
93 </tr>
Alexandr Fokin 16.1 94
95
96 <tr>
97 <td>1000000</td>
Alexandr Fokin 18.1 98 <td>15</td>
99 <td>50</td>
100 <td>1</td>
101 <td>12</td>
102 </tr>
103 <tr>
104 <td>&nbsp;</td>
105 <td>&nbsp;</td>
106 <td>&nbsp;</td>
107 <td>2</td>
108 <td>15</td>
109 </tr>
110 <tr>
111 <td>&nbsp;</td>
112 <td>&nbsp;</td>
113 <td>&nbsp;</td>
114 <td>3</td>
115 <td>19</td>
116 </tr>
117
118
119 <tr>
120 <td>&nbsp;</td>
Alexandr Fokin 16.1 121 <td>1000</td>
Alexandr Fokin 21.1 122 <td>50</td>
Alexandr Fokin 16.1 123 <td>1</td>
Alexandr Fokin 19.1 124 <td>112</td>
Alexandr Fokin 16.1 125 </tr>
126 <tr>
127 <td>&nbsp;</td>
128 <td>&nbsp;</td>
129 <td>&nbsp;</td>
130 <td>2</td>
Alexandr Fokin 19.1 131 <td>70</td>
Alexandr Fokin 16.1 132 </tr>
133 <tr>
134 <td>&nbsp;</td>
135 <td>&nbsp;</td>
136 <td>&nbsp;</td>
137 <td>3</td>
Alexandr Fokin 19.1 138 <td>30</td>
Alexandr Fokin 16.1 139 </tr>
140
Alexandr Fokin 20.1 141
142 <tr>
143 <td>&nbsp;</td>
Alexandr Fokin 22.1 144 <td>4000</td>
Alexandr Fokin 21.1 145 <td>50</td>
Alexandr Fokin 20.1 146 <td>1</td>
Alexandr Fokin 22.1 147 <td>530</td>
Alexandr Fokin 20.1 148 </tr>
149 <tr>
150 <td>&nbsp;</td>
151 <td>&nbsp;</td>
152 <td>&nbsp;</td>
153 <td>2</td>
Alexandr Fokin 22.1 154 <td>328</td>
Alexandr Fokin 20.1 155 </tr>
156 <tr>
157 <td>&nbsp;</td>
158 <td>&nbsp;</td>
159 <td>&nbsp;</td>
160 <td>3</td>
Alexandr Fokin 22.1 161 <td>71</td>
Alexandr Fokin 20.1 162 </tr>
163
Alexandr Fokin 3.1 164 </tbody>
165 </table>
166 {{/html}}
Alexandr Fokin 5.1 167
Alexandr Fokin 16.1 168 Выводы
Alexandr Fokin 17.1 169 При малом размере списка List1 < 100, имеет IN выдает более быстреый результат.
Alexandr Fokin 16.1 170 При большем размере join показывает себя лучше
171
Alexandr Fokin 5.1 172 Ссылки:
173 https://metanit.com/sql/sqlserver/10.4.php
174 https://metanit.com/sql/sqlserver/10.3.php
175 https://info-comp.ru/programmirovanie/567-table-variables-in-ms-sql-server.html
Alexandr Fokin 6.1 176 https://www.cyberforum.ru/ado-net/thread1948686.html