Что бы сделать стол "медленным"? - PullRequest
2 голосов
/ 01 декабря 2010

Что может сделать одну таблицу существенно медленнее другой?Вероятно, проще всего это проиллюстрировать:

Запрос 1:

select top 1000 *
from call c
JOIN call_task ct ON c.call_no=ct.call_no
LEFT JOIN memo_clt m ON m.doc_ref=ct.record AND m.doc_type='CLT' AND m.line_no=1
LEFT JOIN memo_clt m2 ON m2.doc_ref=ct.record AND m2.doc_type='CLT' AND m2.line_no=2

Запрос 2:

select top 1000 *
from call c
LEFT JOIN ext_document_detail edd   ON edd.doc_type='CLH' 
                                            AND edd.doc_ext_no=21
                                            AND edd.doc_ref=c.record
LEFT JOIN ext_document_detail edSource  ON edSource.doc_type='CLH'
                                                AND edSource.doc_ext_no=22
                                                AND edSource.doc_ref=c.record

Структура таблиц аналогична, и я обращаюсь кext_document_detail с очень похожим соединением по сравнению с таблицей memo_clt.И все же второй запрос занимает 40 секунд, а второй - 0 секунд.

Оба имеют кластерный индекс по трем ключам, которые я использую для объединения.Таблица memo_clt имеет некластеризованный индекс в своем столбце записи, хотя ... это единственное отличие, которое я могу заметить, и я не думаю, что это будет иметь большое значение.

Так почему разница в скорости здесь?

РЕДАКТИРОВАТЬ: Поскольку Мартин спросил, вот результаты SET STATISTICS IO ON Query 1:

Table 'memo_clt'. Scan count 2000, logical reads 6454, physical reads 0, read-ahead reads 0, lob logical reads 2385, lob physical reads 0, lob read-ahead reads 0.
Table 'call_task'. Scan count 1, logical reads 39, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 25, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Query 2:

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 'ext_document_detail'. Scan count 1001, logical reads 1507004, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 24, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

С самого началадве вещи поражают меня.Во-первых, нет такой таблицы, как «Рабочий стол».Второе - это огромное количество логических операций чтения ... что может вызвать это?

1 Ответ

2 голосов
/ 01 декабря 2010

Не сами таблицы вызывают разницу в скорости.Это структуры соединений и поддерживающие индексы в запрашиваемых таблицах.

Чтобы дать вам вескую причину разницы в скорости, мне нужно увидеть ваш план выполнения.Я подозреваю, что в одном запросе индексы используются лучше, чем в другом.

Хорошее место для начала было бы посмотреть, есть ли у вас какие-либо таблицы сканирования.Если они у вас есть и вы можете оптимизировать, вы, скорее всего, увидите увеличение производительности.

Я бы прочитал эту статью с хорошим чтением.Это определенно стоит проверить и понять ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...