2016-07-10 5 views
0

У меня есть запрос DB2 по схеме TPC-H, которую я пытаюсь оптимизировать с помощью индексов. Я могу сказать из вывода db2expln, что оценочные затраты значительно ниже (300%) при наличии индексов. Тем не менее, я также пытаюсь измерить время выполнения и существенно не изменяется при выполнении запроса с использованием индексов.Оптимизация запроса DB2 - почему вывод bash «time» остается неизменным?

Я работаю в SSH терминал, выполняя мои запросы и писать вывод в файл, как

(time db2 "SELECT Q.name FROM 
(SELECT custkey, name FROM customer WHERE nationkey = 22) Q WHERE Q.custkey IN 
(SELECT custkey FROM orders B WHERE B.orderkey IN 
(SELECT orderkey FROM lineitem WHERE receiptdate BETWEEN '1992-06-11' AND '1992-07-11'))") &> output.txt 

Я сделал 10 измерений каждый: 1) без индексов, 2) с индексом на lineitem.receiptdate, 3) с индексами на lineitem.receiptdate и customer.nationkey, рассчитанное среднее время и стандартное отклонение, все находятся в одном диапазоне. Я выполнил RUNSTATS ON TABLE schemaname.tablename AND DETAILED INDEXES ALL после создания индекса.

Я прочитал this сообщение о выходе команды time, от того, что я понимаю sys + user время должно иметь значение для моего измерения. Нет изменений в добавленных sys + user времени, а не в real.

sys + пользователь составляет около 44 мс, реальный составляет около 1 с.

Любые подсказки, почему я не вижу изменения во времени? Я интерпретирую time выход неправильно? Являются ли оценки оптимизаторов в db2expln вводящими в заблуждение?

Отказ от ответственности: Я должен представить презентацию об этом в университете, поэтому это технически домашнее задание, но поскольку это скорее вопрос понимания, а не «просьба сделать мой код работы», я надеюсь, что это целесообразно разместить здесь. Кроме того, я знаю, что запрос может быть упрощен, но мой вопрос не в этом.

+1

Как долго длится запрос? «время» не будет надежным ни для чего, кроме нескольких сотен мс. –

+0

отредактирован, поэтому, возможно, мой запрос слишком короткий. это потому, что время выполнения собственного времени слишком велико, как описано [здесь] (http://stackoverflow.com/questions/9006596/is-the-unix-time-command-accurate-enough-for-benchmarks)? –

+0

Вам также необходимо понять, что «время» измеряет системное время + пользовательское время процессора для выполняемого им процесса. В этом случае он измеряет время процессора для процесса 'db2' переднего конца. Этот процесс связывает (через IPC) с другим процессом (DB2 Backend Process - 'db2bp'), который связывается через TCP/IP или IPC с механизмом базы данных DB2.Никакое процессорное время, затрачиваемое на бэкэнд-процесс или механизм базы данных, не будет указано в '' sys''''' пользователя'. –

ответ

1

Оптимизатор оценивает таймеры (измерение внутренних затрат), и эти таймеры не могут быть переведены один в один во время выполнения запроса. Таким образом, разница в 300% в таймеронах не означает, что вы увидите разницу во времени выполнения на 300%.

Измерение времени для одного или нескольких операторов SQL, я рекомендую использовать db2batch с опцией

-i завершить

-1

`ВЫБОР f1.name ОТ клиента f1 WHERE f1.nationkey = 22 и существует (

выбрать * из заказов f2 внутреннее соединение lineitem f3 на f2.orderkey = f3.orderkey где f1.custkey = f2.custkey и f3.receiptdate BETWEEN '1992-06 -11 'И' 1992-07-11 '

)

Смежные вопросы