Для многопользовательской единой общей базы данных необходимо, чтобы поле tenantid было включено в первичный ключ и кластеризованный индекс? Или добавляет дополнительный индекс на tenantid так же, как и исполнитель?
Были проблемы с производительностью в производственной системе, единственным индексом которой является кластеризованный индекс первичного ключа.
Все операторы SELECT SELECT начинаются с tenantid в своих выражениях с объектами, такими как
invoiceitems.tenantid = thecurrenttenantid order by invoicedate
ТЕКУЩАЯ СХЕМА
Арендаторы (первичный ключ tenantid uniqueidentifier, tenantname) Внешние ключи (tenantid) Индексы (Clustered on tenantid)
Клиенты (tenantid uniqueidentifier, первичный ключ customerid uniqueidentifier, имя пользователя varchar (50)) Внешние ключи (tenantid, customerid) Индексы (кластеризованные на customerid)
Счета-фактуры (tenantid uniqueidentifier, первичный ключ уникального идентификатора invoiceid, уникальный идентификатор клиента, уникальный идентификатор клиента, дата-дата и время его выставления) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (сгруппированы по invoiceid)
InvoiceItems (tenantid uniqueidentifier, invoiceitemid uniqueidentifier primarykey, invoiceid uniqueidentifier, lineitemorder int) Иностранные ключи (tenantid, invoiceid) Индексы (сгруппированы по invoiceitemid)
SqlAzure требует, чтобы каждая таблица имела кластеризованный индекс, так что в настоящее время он находится только на primarykeyid, поскольку это значение по умолчанию. Сейчас это единственный индекс для каждой таблицы. Существуют различные внешние ключи в таблицах по всей системе, и ни одно из полей таблицы внешнего ключа не индексируется.
Мы пытаемся решить некоторые проблемы с производительностью прямо сейчас и задаемся вопросом, что будет лучшим кластеризованным индексом, и если любые другие индексы могут быть полезны. Мы надеемся, что нам не придется менять существующий кластеризованный индекс, если мы не будем абсолютно обязаны, но мы готовы это сделать. В SqlAzure AFAIK вы не можете просто настроить кластеризованный индекс в существующей таблице - вам нужно создать новую таблицу с требуемым кластеризованным индексом и вставить все записи из старой таблицы в новую таблицу (и обрабатывать все ограничения внешнего ключа и другие таблицы).
Все операторы SELECT SELECT начинаются с tenantid в своих выражениях с помощью операторов linq.
invoiceitems.tenantid = thecurrenttenantid order by invoicedate
Некоторые операторы select sql просто имеют порядок - некоторые из них имеют другие значения условия соединения при введении дочерних таблиц, например
invoiceitems.tenantid = thecurrenttenantid and invoice.invoiceid = invoiceitems.invoiceid order by invoicedate
Вот несколько идей (мы открыты для других, кроме этого) - , какой из них был бы лучшим и почему?
ВАРИАНТЫ УКАЗАТЕЛЯ ПЕРВИЧНОГО КЛЮЧА
Чтобы ускорить доступ к записям арендатора
Вариант 1 - добавьте некластеризованный индекс в tenantid
Счета-фактуры (tenantid uniqueidentifier, первичный ключ invoiceid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (сгруппированные по invoiceid, не кластеризованные на tenantid)
Вариант 2 - Измените первичный ключ от primaryid до tenantid + primaryid и измените кластеризованный индекс на tenantid + primaryid.
Счета-фактуры ( первичный ключ tenantid uniqueidentifier, первичный ключ invidentid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (кластеризованные на tenantid + invoiceid)
ВАРИАНТЫ УКАЗАТЕЛЕЙ ВНЕШНЕГО КЛЮЧА
Чтобы ускорить соединение
Вариант 3 - добавьте некластеризованные индексы во все поля внешнего ключа только на foreignkeyid.
Счета-фактуры (tenantid uniqueidentifier, первичный ключ invoiceid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (сгруппированные по invoiceid, некластеризованные на billcustomerid, некластеризованные на shipcustomerid)
Вариант 4 - Измените все внешние ключи от foreignkeyid до tenantid + foreignkeyid и добавьте индекс на tenantid + foreignkeyid
Счета-фактуры (tenantid uniqueidentifier, первичный ключ invoiceid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, tenantid + billcustomerid, tenantid + shipcustomerid) Индексы (сгруппированные по invoiceid, некластеризованные на tenantid + billcustomerid, не кластерные на tenantid + shipcustomerid)
SQL SELECT OPTIMIZATION INDEX OPTIONS
Чтобы ускорить часто используемые запросы, такие как выбор полей из счетов-фактур, где tenantid = порядок значений invoicedate
Вариант 5 - добавьте индексы для наиболее часто используемых полей порядка сортировки в каждой таблице, кроме tenantid.
Счета-фактуры (tenantid uniqueidentifier, первичный ключ invoiceid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (сгруппированные по invoiceid, не кластеризованные на invoicedate)
Вариант 6 - добавьте индексы на tenantid + "наиболее часто используемое поле порядка сортировки" в каждой таблице и добавьте некластеризованный индекс в tenantid + "наиболее часто используемое поле порядка сортировки"
Счета-фактуры (tenantid uniqueidentifier, первичный ключ invoiceid uniqueidentifier, уникальный идентификатор клиента, уникальный идентификатор shipcustomerid, invoicedate datetime) Иностранные ключи (tenantid, billcustomerid, shipcustomerid) Индексы (сгруппированные по invoiceid, не кластеризованные на tenantid + invoicedate)