Definieren Sie den SQL-Index programmgesteuert
NCache ermöglicht die Abfrage des Caches basierend auf SQL-Abfragen wie bei einer Datenbank. Im Gegensatz zu einer Datenbank sind jedoch jedes durchsuchbare Objekt und seine Felder in NCache müssen zunächst indiziert werden. In diesem Zusammenhang NCache ermöglicht Entwicklern die einfache programmgesteuerte Definition von SQL-Indizes. Damit können Sie alle öffentlichen, privaten und geschützten primitiven Felder und Eigenschaften indizieren. Sehen NCache unterstützte Datentypen für weitere Details.
Tipp
Alternativ können Sie SQL-Indizes über konfigurieren NCache Management Center or Powershell.
Note
Ein Referenztypfeld kann nicht indiziert werden.
Voraussetzungen für die programmgesteuerte Definition von SQL-Indizes
Stellen Sie vor der Definition der SQL-Indizes sicher, dass folgende Voraussetzungen erfüllt sind:
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Durchsuchbare Objekte und ihre Attribute müssen von beiden indiziert werden Konfigurieren von Indizes or Indizes programmgesteuert definieren.
- Einzelheiten zur API finden Sie unter: QueryIndexedAttribute, NonQueryIndexedAttribute, QueryIndexable.
NCache Bietet die Flexibilität, Indizes über verschiedene Ansätze zu erstellen. Sie können je nach Bedarf Indizes für ausgewählte Felder oder die gesamte Klasse erstellen. In der Zwischenzeit können bestimmte Felder von der Indizierung ausgeschlossen werden, wenn die Klasse indiziert wird. Darüber hinaus wird die Indexierung auch für mehrsprachige Clients unterstützt. Speziell, NCache verfügt über die folgenden benutzerdefinierten Felder zum programmgesteuerten Definieren von Indizes:
QueryIndexed
: Wird zum Indizieren ausgewählter Felder verwendet.QueryIndexed["indexName"]
: Wird zum Indizieren eines Felds anhand eines vom Benutzer bereitgestellten Indexnamens verwendet.QueryIndexable
: Wird zum Indizieren der gesamten Klasse verwendet.NonQueryIndexed
: Wird verwendet, um Felder von der Indizierung auszuschließen, wenn eine Klasse indiziert wird.
Wichtig
Es wird empfohlen, die Indizierung unnötiger Felder zu vermeiden, da die Indizierung Speicher- und Leistungsaufwand verursacht.
Hier diskutieren wir verschiedene Ansätze zum Erstellen von Indizes NCache Verwendung dieser Felder.
Selektive Indizierung
Sie können einen Index für eine bestimmte Eigenschaft oder ein bestimmtes Feld einer Klasse erstellen, indem Sie die verwenden QueryIndexed
Attribut. Es wird auf der primitiven Eigenschafts- oder Feldebene definiert, um anzuzeigen, dass die markierte Eigenschaft oder das markierte Feld indiziert werden kann. Die annotierten Eigenschaften oder Felder werden automatisch indiziert.
Note
Verwenden Sie immer QueryIndexed
wenn Sie nur wenige Eigenschaften oder Felder einer Klasse indizieren müssen, da dies Leistung und Speicherkosten spart.
Dieser Ansatz kann zum Erstellen von Indizes verwendet werden, wenn relativ wenige Eigenschaften oder Felder Ihrer Klasse eine Indizierung erfordern. Es bietet die Flexibilität, selektive Felder zu indizieren, wobei Sie nur die gewünschten Eigenschaften oder Felder manuell auswählen können.
Warnung
Wenn Sie ein Referenzfeld explizit als markieren QueryIndexed
, wird eine Ausnahme „Index wird nicht unterstützt für <Ref Type Name>
". Indizes werden nur für Werttypen unterstützt.
Das folgende Beispiel zeigt, wie Sie selektive Felder mit indizieren QueryIndexed
ohne die gesamte Klasse zu indizieren. NCache erstellt automatisch Indizes für die Felder ID und Name und Vorname nur.
public class Product
{
[QueryIndexed]
public int ID { get; set} // explicitly indexed
[QueryIndexed]
public string Name { get; set} // explicitly indexed
public Decimal UnitPrice { get; set } // will not be indexed
public Customer Customer { get; set; } // will not be indexed
}
Note
Um sicherzustellen, dass der Vorgang ausfallsicher ist, wird empfohlen, alle potenziellen Ausnahmen in Ihrer Anwendung zu behandeln, wie in erläutert Umgang mit Fehlern.
Im obigen Beispiel ist der Indexname mit dem Feldnamen identisch, da dies das Standardverhalten bei der Verwendung von ist QueryIndexed
Attribut zur selektiven Indizierung. Jedoch, NCache ermöglicht es Ihnen, benutzerdefinierte Namen für Ihre Felder oder Eigenschaften zu definieren, die über indexiert werden sollen QueryIndexed ("indexName")
Anmerkung. In diesem Fall wird der vom Benutzer angegebene Name im Konstruktor verwendet, während ein Index erstellt wird.
Dies kann nützlich sein, wenn Sie einen Anwendungscode in verschiedenen Sprachen entwickeln und die Feldnamen variieren können. Beispielsweise verfügt eine E-Commerce-Anwendung über .NET- und Java-Clients, wobei der .NET-Client ein Feld benennt Produkt Klasse als Stückpreis, während ein Java-Client dasselbe Feld wie benennt Preis pro Einheit. Für die Indizierung dieses Felds kann sowohl in .NET als auch in Java ein benutzerdefinierter Name angegeben werden QueryIndexed("price")
Attribut. Das markierte Feld wird mit dem Namen indiziert Preis für alle Kunden. Jetzt können verschiedene Clients die Abfrage durchführen Preis in der WHERE-Klausel oder als Projektion.
Warnung
Wenn ein Feld mit indiziert ist QueryIndexed["indexName"]
, wird beim Abfragen von Daten basierend auf dem Feldnamen eine Ausnahme "Index nicht definiert für Feldname" ausgelöst.
Das folgende Beispiel zeigt, wie Sie ausgewählte Felder einer Klasse mit dem Indexnamen Ihrer Wahl indizieren.
public class Product
{
[QueryIndexed]
public int ID { get; set} // explicitly indexed with index name ID
[QueryIndexed]
public string Name { get; set} // explicitly indexed with index name
[QueryIndexed("price")]
public Decimal UnitPrice { get; set } // will not be indexed
public Customer Customer { get; set; } // will not be indexed
}
Klassenindizierung
Sie können Ihre Klasse mithilfe des Attributs indizieren QueryIndexable
. Es wird auf Klassenebene definiert, um anzugeben, dass die gesamte Klasse indiziert werden kann. Wenn Sie eine Klasse markieren als QueryIndexable
, werden alle öffentlichen Eigenschaften und Felder automatisch indiziert. Wenn Ihre Klasse ein privates Feld hat, das indiziert werden muss, müssen Sie es explizit mit dem markieren QueryIndexed
Attribut zum Erstellen seines Index.
Dieser Ansatz sollte nur verwendet werden, wenn Sie entweder alle oder die meisten Eigenschaften oder Felder einer Klasse indizieren möchten. Andernfalls wird dies nicht empfohlen, da die Möglichkeit besteht, dass unnötige Eigenschaften indiziert werden. Letztendlich wird dies die Leistung Ihrer Anwendung aufgrund des zugrunde liegenden Speicher- und Leistungsaufwands der Indizierung beeinträchtigen.
Warnung
- Es wird nicht empfohlen, zu verwenden
QueryIndexable
, es sei denn, alle oder die meisten Eigenschaften oder Felder erfordern eine Indizierung, da die Indizierung Speicher- und Leistungskosten verursacht. - Eine Klasse markieren als
QueryIndexable
Indiziert keine privaten Felder. In diesem Fall müssen Sie jedes private Feld einzeln als markierenQueryIndexable
um es zu indizieren.
Das folgende Beispiel veranschaulicht die Indizierung der Felder einer benannten Klasse Produkt Verwendung der QueryIndexable
, Attribut. Dadurch wird die indiziert ID, Name und Vorname und Stückpreis Felder. Das Feld Kategorie ist explizit gekennzeichnet als QueryIndexed
da es privat ist. Indizierung Kundenfälle wird ignoriert, da es sich um ein Referenzfeld handelt, das auf das Objekt von zeigt Kundenfälle Klasse, während NCache erlaubt keine Indizierung von Referenzfeldern.
[QueryIndexable]
public class Product
{
public int ID { get; set} // auto index
public string Name { get; set} // auto index
public Decimal UnitPrice { get; set } // auto index
[QueryIndexed]
private string Category { get; set } // explicitly marked for indexing
public Customer Customer { get; set; } // will not be indexed
}
Felder von der Indizierung ausschließen
Sie können die Verwendung NonQueryIndexed
Attribut, um die Indizierung nicht erforderlicher Eigenschaften oder Felder zu verhindern, wenn Ihre Klasse indiziert wird. Das Attribut NonQueryIndexed
wird auf der Ebene der primitiven Eigenschaft oder des Felds definiert, um anzugeben, dass die Eigenschaft oder das Feld von der Indizierung ausgeschlossen werden soll, wenn die Klasse selbst als markiert ist QueryIndexable
. Alle öffentlichen Eigenschaften und Felder werden automatisch indiziert. Die mit gekennzeichneten Felder NonQueryIndexed
Das Attribut wird von der Indizierung ausgeschlossen. Sie können eine Kombination aus verwenden QueryIndexable
und NonQueryIndexed
wenn die meisten Eigenschaften außer einigen wenigen eine Indizierung erfordern.
Das folgende Beispiel zeigt, wie das Feld ausgeschlossen wird Stückpreis aus der Indizierung entfernen, indem Sie es explizit als markieren NonQueryIndexed
wenn die Klasse selbst indiziert wird. Dadurch wird die Indizierung des mit Anmerkungen versehenen Felds ignoriert.
[QueryIndexable]
public class Product
{
public int ID { get; set} // auto index
public string Name { get; set} // auto index
[NonQueryIndexed]
public Decimal UnitPrice { get; set } // will not be indexed
public Customer Customer { get; set; } // will not be indexed
}
Note
NCache ermöglicht es Ihnen, alle Fehler zu unterdrücken, die mit der Erstellung von Indizes über verbunden sind NCacheServer.SuppressIndexNotDefinedException
Tag in der NCache Dienstkonfigurationsdateien.
Weitere Informationen
NCache stellt eine Beispielanwendung für SQL-Abfragen bereit GitHub.
Siehe auch
.NETZ: Alachisoft.NCache.Klient Namespace.
Java: com.alachisoft.ncache.Klient Namespace.