Я предположу, что у Вас есть серьезные основания использовать гуиды в качестве идентификаторов.
Фрагментация является главным образом проблемой для сканирований, меньше для ищет. Фрагментация оказывает большое влияние на чтение-aheads и ищет, не используют, ни должны считать aheads. Нефрагментированный индекс с плохим выбором столбца будет всегда работать хуже, чем 99%-й индекс фрагмента с хорошим, применимым, столбцами. Если Вы имели, описал DW, сообщив о запросах стиля, которые сканируют таблицы затем, я был бы, имел, рекомендуют фокусироваться на устранении фрагментации, но для загрузки Вы описываете это, имеет больше смысла фокусироваться на эффективном (покрытие), ищет и (небольшие) сканирования диапазона.
Учитывая, что Вы - схема доступа, всегда управляется @userId, это должно быть крайним левым столбцом в кластерном индексе. Я также добавил бы setOn как второй столбец в кластерном индексе, потому что он добавляет некоторое предельное значение на большинстве запросов (я говорю крайний, потому что @userId таким образом выборочный, в худшем случае 90 записей от 90 миллиметров., то, что дополнительная фильтрация, добавленная @setOn, не очень важна). Я woudldn't добавляют любого не кластерный индекс от запросов, которые Вы описываете, нет никакой потребности ни в ком.
Единственной проблемой является удаление старых записей (хранение этих 30 дней). Я рекомендовал бы против использования вторичного индекса NC удовлетворить это. Я развернул бы еженедельную схему выделения разделов с раздвижным окном, посмотрите, Как Реализовать Автоматическое Раздвижное окно в Разделенной таблице на SQL Server 2005. С этим решением старые записи удалены переключателем раздела, который является просто самым эффективным возможным путем. Ежедневную схему выделения разделов удовлетворила бы требование хранения этих 30 дней более точно и возможно стоит попробовать и протестировать. Я смущаюсь рекомендовать 30 разделов непосредственно, потому что Вы описываете некоторые запросы, которые имеют потенциал для поиска конкретного @userId записи в каждом разделе, и 31 раздел может создать проблемы производительности под большой нагрузкой. Протестируйте и измерьте обоих лучше.
На самом деле, если бы я должен был сделать это, то я использовал бы Сценарий Lua с recursor, который искажает с данными по посттвердости.
Hoever я действительно рекомендую что-то другое: Просто используйте отдельную авторитетную Зону как internal.example.com, где Вы example.com AXFR с авторитетных Серверов и просто добавляете свои локальные данные RFC1918.
Таким образом, можно все еще отладить авторитетную Зону как он, находится в Интернете от LAN, и используйте внутренние данные.
О сценариях PowerDNS Recursor Lua: http://doc.powerdns.com/recursor-scripting.html
То, что я думаю, что Вы хотите, является расщепленным горизонтом установка DNS, однако PowerDNS непосредственно не поддерживает такой (в отличие от этого, Связывают или DJBDNS). Официальный ответ об этом от автора здесь: http://mailman.powerdns.com/pipermail/pdns-users/2006-September/003779.html
Я никогда не находил расщепленный горизонт DNS, чтобы особенно сбивать с толку, сам, особенно если файлы размечаются ясно в файловой системе, например, ./master-interal/domain.com ./master-external/domain.com
Единственная опция, которую они предлагают, состоит в том, чтобы иметь два различных экземпляра PowerDNS, работающего на сервере, слушающем на различных портах. Я предполагаю, что Вы затем усилили бы iptables для перенаправления трафика для портирования 53 на то, какой бы ни экземпляр релевантен.
Я настоятельно рекомендую не спуститься по этому пути, поскольку это чрезвычайно сбивает с толку, сложно, и трудно справиться. Вместо этого необходимо настроить отдельный внутренний домен как inside.example.com
. Затем если Ваш вне сервера DNS находится также в Вашей внутренней сети, необходимо настроить его, чтобы быть авторитетными для обоих доменов. Однако, если Ваш внешний сервер DNS не находится на Вашей внутренней сети, необходимо настроить Ваш в сервере DNS, чтобы быть авторитетными для inside.example.com. Затем Ваш в сервере DNS должен передать все другие запросы к внешнему серверу DNS.
Я понимаю, что оборотная сторона этого - Вы, должны изменить домен на всех Ваших внутренних машинах, но выполнение той первичной работы теперь сохранит Вас много беспорядка позже.
Используйте PipeBackend в PowerDNS. Я создал несколько систем на Python.
PipeBackend:
PipeBackend, прежде всего, предназначен для разрешения быстрой разработки новых бэкендов без тесной интеграции с PowerDNS. Это позволяет конечным пользователям писать бэкенды PDNS на любом языке.
После того, как я некоторое время возился с моей Fedora 20, я, похоже, заставил его работать. Я нигде не нашел полного руководства, поэтому краткая запись для минимальной настройки:
Мы хотим разрешить webserver.dyndns.org
для доступа к веб-службе на нем, как из Интернет и локальная сеть.
Машина a в Интернете разрешает webserver.dyndns.org
в IP-адрес IPisp . Behing IPisp - это маршрутизатор с NAT, который перенаправляет порт 80 на IP-адрес LAN IPx , таким образом делая веб-службу доступной в Интернете.
Естественно, это делается путем регистрации. IP-адрес IPisp на полномочном сервере имен для домена dyndns.org , который, в случае такой службы, как DynDns, выполняется с использованием ddclient , запущенного на маршрутизаторе или где-то в локальной сети, и поэтому здесь не представляет интереса.
машины b в локальной сети разрешает webserver.dyndns.org
в IP-адрес IPx , так что веб-служба становится доступной в локальной сети напрямую. Кроме того, если предположить, что все машины в локальной сети имеют имена в соответствии со строками bar.localdomain , имя webserver.localdomain
также должно разрешаться в IPx . Мы также хотим иметь обратный поиск для хорошей оценки, разрешая IPx в webserver.dyndns.org
внутри локальной сети (в Интернете, IPx , естественно, преобразуется в ничего, а IPisp преобразуется в некоторую произвольную строку, сгенерированную провайдером.)
Мы предполагаем, что pdns-recursor запущен машина с IP IPdns , но мы также можем запустить ее на веб-сервере (на том же IP-адресе, что и IPx или на псевдониме), или иметь только одну машину в локальной сети .
Машина «b» может быть настроена статически или динамически через DHCP; см. dhclient
и dnsmasq
и, возможно, avahi
. NetworkManager
также входит сюда, потому что он может перезаписать /etc/resolv.conf
; пока предположим статическую конфигурацию.
Также предположим:
IPx = 192.168.1.1
IPdns = 192.168.1.2
IPbar = 192.168.1.3
Затем:
/etc/resolv.conf
на любом компьютере:
nameserver 192.168.1.2
domain localdomain
Конфигурация для pdns-recursor :
/etc/pdns-recursor/recursor.conf
в основном сводится к:
setuid=pdns-recursor
setgid=pdns-recursor
allow-from=127.0.0.0/8, 192.168.1.0/8, ::1/128, fe80::/10
auth-zones=webserver.dyndns.org=/etc/pdns-recursor/[webserver.dyndns.org].zone, localdomain=/etc/pdns-recursor/[localdomain].zone, 168.192.in-addr.arpa=/etc/pdns-recursor/[168.192.in-addr.arpa].zone
local-address=192.168.1.2
Вышеупомянутые ссылки очень сильно сокращены в зоне файлы (их настоящие имена не важны):
В / etc / pdns-recursor / [168.192.in-addr.arpa] .zone
(обратите внимание на отсутствие точки в конце имени записи - это относительное имя, а не абсолютное: 1.1
означает 1.1.168.192.in-addr.arpa
). Это работает как с «IN», так и без него.
1.1 IN PTR webserver.dyndns.org.
2.1 IN PTR dns.localdomain.
3.1 IN PTR b.localdomain.
В / etc / pdns-recursor / [webserver.dyndns.org] .zone
(обратите внимание на точку в конце имени записи - это абсолютное имя, а не относительное)
webserver.dyndns.org. IN A 192.168.1.1
В / etc / pdns-recursor / [localdomain] .zone
webserver IN A 192.168.1.1
dns IN A 192.168.1.2
b IN A 192.168.1.3
После перезапуска pdns-recursor
, можно проверить с помощью dig
, выполнив следующие команды:
PDNS=192.168.1.2
# Test unknwon domain resolution and webserver resolution
dig @$PDNS www.cnn.com | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS webserver.dyndns.org | grep -A1 ";; ANSWER SECTION:"
# Test responses for localdomain
dig @$PDNS unknown.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS webserver.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS b.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS dns.localdomain A | grep -A1 ";; ANSWER SECTION:"
# Test responses for localdomain if the domain is omitted
dig +search @$PDNS webserver | grep -A1 ";; ANSWER SECTION:"
# Test reverse resolution
dig @$PDNS -x 192.168.1.1 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.2 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.3 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.4 | grep -A1 ";; ANSWER SECTION:"