|
|
|
Индекс вместо сканирования
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! помогите, пожалуйста, решить задачу из курса 2073 модуль 7: я не понимаю, как же получить такие ответы. Моя преподша толком объяснить не смогла, но она говорила про то, что надо взять длину всех записей что ли и делить на длину одной записи (это 38 байт) 1 charge_no numeric_id (int) 4 0 0 member_no numeric_id (int) 4 0 0 provider_no numeric_id (int) 4 0 0 category_no numeric_id (int) 4 0 0 charge_dt datetime 8 0 0 charge_amt money 8 0 0 statement_no numeric_id (int) 4 0 0 charge_code status_code (char) 2 0 Задача: To determine selectivity In this procedure, you will execute a series of SELECT statements that select all rows from the Charge table. A table scan is performed for each SELECT statement. For each SELECT statement, you will first select the query and then view the estimated execution plan. You will modify the WHERE clause so that the query optimizer uses an index to retrieve the rows, and then you execute that query. After executing the query, you will record and evaluate the maximum number of rows that can be returned by using an index. USE credit SELECT * FROM charge WHERE charge_no BETWEEN 1 AND 100000 USE credit SELECT * FROM charge WHERE member_no BETWEEN 1 AND 10000 USE credit SELECT * FROM charge WHERE provider_no BETWEEN 1 AND 500 USE credit SELECT * FROM charge WHERE category_no between 1 AND 10 1. Select the first statement, but do not execute it. 2. In the query window, on the Query menu, click Display Estimated Execution Plan. Notice the query plan for the statement. 3. Modify the range in the SELECT statements so that the query optimizer uses an index to retrieve the rows, rather than the optimizer using a table scan or full index scan. When choosing a range, remember that: • Each page has approximately 172 charges. • Older members and providers are less active than newer ones. • All categories are equally popular. • Execute the statements. • In the following table, record the maximum number of rows that can be returned by using an index. WHERE clause Approximate number of rows WHERE charge_no BETWEEN 1 AND n 116 WHERE member_no BETWEEN 1 AND n 222 WHERE provider_no BETWEEN 1 AND n 70 WHERE category_no BETWEEN 1 AND n 0 • Repeat steps 1 through 5 for the remaining SELECT statements. Note You will notice that it is not easy to predict the selectivity of a query, even when you know the values of all of the arguments. It is best to let the query optimizer decide how to execute the query. • Is the number of rows accessed by the query optimizer the same for all indexes? Why or why not? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2006, 16:54:23 |
|
||
|
Индекс вместо сканирования
|
|||
|---|---|---|---|
|
#18+
А что именно вы не понимаете? Это упражнение предлагается вам для демонстрации - в каких случаях будет использоваться индекс, а в каких полное сканирование. Ваша задача найти тот самый диапозон, при поиске в пределах которого выгоднее индекс. Фактические числа могут немного отличаться, но порядок - такой как в ответах. Существует понятие плотности и селективности данных. Поделите количество записей, попадающих в диапозон, на общее количество записей в таблице. Чем меньше получившееся число - тем выгоднее использование индекса. Точных границ не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2006, 03:09:19 |
|
||
|
Индекс вместо сканирования
|
|||
|---|---|---|---|
|
#18+
ну вот например первый запрос. В таблице 100 тыс строк, и в запросе мы все их хотим получить. Как получить, что именно при 116 сканирование пойдет по индексу? Мне говорили, что это можно вычислить прям по формуле ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 10:54:55 |
|
||
|
Индекс вместо сканирования
|
|||
|---|---|---|---|
|
#18+
фомула есть в том же самом 2073 курсе. В этом или соседнем модуле. Идея следующая: вычисляете длину строки таблицы. прикидываете сколько строк целиком у вас влезет на одну 8 кб страницу данных. делите суммарное количество строк в таблице на количество строк, которые влезают на одну страницу и получаете количество страниц данных - т.е. количество необходимых операций чтения при полном сканировании - F. теперь разбираемся с индексом. подсчитываем количество страниц на листовом уровне индекса. для этого: вычисляем сколько ячеек индексируемого столбца слезет в 8 кб страницу. делим общее количество строк в таблице на эту величину и получаем то самое количество страниц которое искали. Дальше алгоритм ПРИМЕРНО следующий: вы просите показать все записи с 1 по 1000. Делим 1000 на количество записей на индексной странице. получаем количество страниц индекса, которое надо прочитать. и прибавляем к этой величине 1000 - потому что для каждого найденного в индексе элемента надо будет еще и на страницы данных слазать. вот вам и цифра - I. а теперь смотрите - что для диапозона больше - F или I. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 12:40:48 |
|
||
|
Индекс вместо сканирования
|
|||
|---|---|---|---|
|
#18+
оппа, спасибо, сейчас буду втыкать=) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2006, 00:05:27 |
|
||
|
|

start [/forum/topic.php?fid=34&tid=1551281]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
21ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 291ms |

| 0 / 0 |
