Question

J'ai créé une vue indexée:

CREATE VIEW LogValueTexts WITH SCHEMABINDING AS
SELECT ISNULL(LRVS_SLOG_ID*256+LRVS_IDX,0) AS ID,LRVS_VALUE AS Value
FROM dbo.LRVS_LogRecordedValues WHERE LEN(LRVS_VALUE)>4

CREATE UNIQUE CLUSTERED INDEX IX_LogValueTexts ON LogValueTexts (ID)

Sous SQL 2005 Standard SP3, le remplissage d'un index de texte intégral sur cette vue prend une éternité, car l'indexation de texte intégral exécute la requête suivante pour chaque ligne de la vue:

SELECT COLUMN FULLTEXTALL FROM[dbo].[LogValueTexts] WHERE COLUMN FULLTEXTKEY = @p1

Je suppose que COLUMN FULLTEXTALL et COLUMN FULLTEXTKEY sont en réalité Valeur et ID , mais c'est ce que SQL Server Profiler montre. Le problème est que le plan de requête utilise une analyse d'index en cluster sur environ 11 millions de lignes / 1 Go de données car il n'utilise pas l'index de la vue. J'ai essayé de créer un repère de plan pour cette requête, mais comme ce n'est pas une requête T-SQL standard, elle ne le permet pas ( Syntaxe incorrecte à proximité du mot clé 'FULLTEXTKEY' ).

Existe-t-il un moyen de faire fonctionner cet index de texte intégral autrement que:

  • la mise à niveau vers SQL 2008 (ou SQL 2005 Enterprise) où tout fonctionne correctement.
  • créer un identifiant unique et un index couvrant sur la table sous-jacente.

La mise à niveau nécessiterait des temps d'arrêt sur le serveur et probablement de nouvelles licences SQL Server, tandis que la création de l'ID unique et un index couvrant perdrait beaucoup d'espace car seul un sous-ensemble des 11 lignes nécessitait une indexation de texte intégral ( LRVS_VALUE est souvent NULL ou a une valeur de texte très courte).

Était-ce utile?

La solution

Je ne connais pas vos données. pourquoi ne pouvez-vous pas mettre l'index de texte intégral sur la table d'origine? Vous pouvez ajouter la colonne calculée dans la structure de votre tableau. De cette façon, vous n’auriez pas l’opération de reconstruction d’index (je pense que c’est la cause de votre analyse)

Si vous ne pouvez pas le faire, la modification la plus facile à suivre créera probablement une table de recherche remplie d'un sp ou d'un déclencheur, ce qui vous permet de modifier l'indexation de la table afin qu'elle ait un sens pour votre requête.

Votre dernière option (et celle sur laquelle vous auriez besoin de passer un peu de temps pour bien faire les choses) serait d’utiliser des tables partitionnées. Vous pourriez avoir une partition qui couvre les données filtrées sur la vue. Texte intégral indexe la table entière; votre requête au moment de l'exécution frapperait la table partitionnée contenant les données pertinentes qu'elle contient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top