2013-09-24 24 views
7

olarak bir sütun değeri kullanarak CONTAINS yüklemi kullanan varolan bir işlemin yeniden yazılmasıyla ilgili bir sorun yaşıyorum. Varolan işlem bir CURSOR kullanarak çalışıyor, ancak gerçekten yavaş ve daha fazla veri eklendikçe yavaşlıyor.SQL Server KONTROLLER Predicate - <include_condition>

İki tablo içeren basit bir örnek (aşağıdaki kodu) kadar yapmış - Bir Tam Metin Endeksli ve diğer birinci satırları seçmek için bir CONTAINS koşulu tanımlayan bir sütun vardır.

Geçerli saklı yordam, @filter değişkenini ayarlayarak ikinci tabloya geçiş yapmak için CURSOR kullanır, ardından eşleşen ilk tablodaki satırları bulmak için CONTAINS kullanır. Sorun saatlerce çalıştığı ve daha da kötüye gitmesi.

İşlemi hızlandırmak için, CONTAINS yüklemini doğrudan imlecin ağrısından geçmek yerine sütun değerinde kullanmayı denedim ... ancak bir sözdizimi hatası alıyorum. Benim örneğim aşağıda.

CROSS APPLY'u uygulamayı denedim ve ayrıca şans tanımayan Kullanıcı Tanımlı Bir İşlev (fnCONTAINS) yazmayı denedim.

IF (object_id('Players') IS NOT NULL) 
    DROP TABLE Players 

go 

IF (object_id('TeamNeeds') IS NOT NULL) 
    DROP TABLE TeamNeeds 

go 

-- create fulltext catalog ft as default 
go 

CREATE TABLE Players 
    (
    PlayerID  INT IDENTITY(1, 1), 
    PlayerName  VARCHAR(20), 
    PlayerPositions VARCHAR(60) 
) 

go 

CREATE UNIQUE INDEX IXPlayerID 
    ON Players(PlayerID) 

go 

CREATE fulltext INDEX ON Players(PlayerPositions) KEY INDEX IXPlayerID 

go 

INSERT Players 
     (PlayerName, 
     PlayerPositions) 
VALUES('Patrick Travers', 
     'Pitcher,Left Field,Center Field,Right Field,Shortstop') 

go 

CREATE TABLE TeamNeeds 
    (
    TeamID INT, 
    Keywords VARCHAR(50) 
) 

go 

INSERT TeamNeeds 
     (TeamID, 
     Keywords) 
VALUES(1, 
     '"Center Field" and "Shortstop" and "Pitcher"') 

go 

WAITFOR delay '00:00:05' 

go -- Give the Full Text Index process time to populate the catalog 
SELECT PlayerID, 
     PlayerName, 
     PlayerPositions 
FROM Player, 
     TeamNeeds 
WHERE CONTAINS(PlayerPositions, Keywords) 

go -- Syntax error on Keywords... 
SELECT PlayerID, 
     PlayerName, 
     PlayerPositions 
FROM Players, 
     TeamNeeds 
WHERE CONTAINS(PlayerPositions, '"Center Field" and "Shortstop" and "Pitcher"') 

go -- Works just fine, but requires setting an explicit search expression for every search, which is terribly slow 
+0

Yorum ayırıcısını kaldırdım, böylece kodunuzu daha okunabilir hale getirin. – Khan

+0

Bu soruyu cevaplamak için de arıyorum. Stackoverflow ve ms belgelerine baktım ama CONTAINS yapılamıyor gibi görünüyor (table1.col, table2.col). Sadece CONTAINS (table1.col, 'text') veya CONTAINS (table1.col, @some_text) yapabilirsiniz. Umarım birileri gelir ve yanlış olduğunu kanıtlar. – Nico

+0

Bu sorunun nasıl çözüleceğini anladınız mı? Bende aynı problemi yaşıyorum. –

cevap

2

Bu, yalnızca görebildiğim kadarıyla çok bildirimli bir TVF ile mümkündür. inline versiyonu "satır içi işlevi 'bir kullandığından x' korelasyon parametreleri veya alt sorgular alamaz ile başarısız olsa

aşağıdaki Ardından aşağıdaki işlevi

CREATE FUNCTION [dbo].[ft_test] (@Keywords VARCHAR(50)) 
RETURNS @ReturnTable TABLE (
    PlayerID  INT, 
    PlayerName  VARCHAR(20), 
    PlayerPositions VARCHAR(60)) 
AS 
    BEGIN 
     INSERT INTO @ReturnTable 
     SELECT PlayerID, 
      PlayerName, 
      PlayerPositions 
     FROM Players 
     WHERE CONTAINS(PlayerPositions, @Keywords) 

     RETURN 
    END 

oluşturma ince

SELECT * 
FROM TeamNeeds 
     CROSS APPLY [dbo].[ft_test] (Keywords) CA 

işleri tam metin operatörü.