Der Abfrage-Prozessor konnte keinen Abfrage-plan erzeugen, weil die Hinweise in dieser Abfrage. Übermitteln Sie die Abfrage und ohne SET FORCEPLAN
Läuft bei mir folgende:
DECLARE @g geography;
declare @point nvarchar(50) =''
declare @i int =0,
@lat decimal(8,6) =0.0,
@long decimal(8,6) =0.0,
@start datetime = getdate()
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
set @point = (select 'POINT('+CONVERT(varchar(10), @lat)+ ' '
+CONVERT(varchar(10), @long)+')')
SET @g = geography::STGeomFromText(@point, 4326);
SELECT TOP 1000
@lat,
@long,
@g.STDistance(st.[coord]) AS [DistanceFromPoint (in meters)]
, st.[coord]
, st.id
FROM Temp st with(index([SpatialIndex_1]))
diese Abfrage nur unzureichend durchgeführt, da keine räumlichen index, so fügte ich with(index([SpatialIndex_1]))
zu erzwingen.
Geographie index sieht folgt aus:
CREATE SPATIAL INDEX [SpatialIndex_1] ON [dbo].Temp
(
[coord]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = LOW,LEVEL_2 = MEDIUM,LEVEL_3 = LOW,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95)
ON [PRIMARY]
Nun, es gibt mir Fehlermeldung
Msg 8622, Ebene 16, Status 1, Zeile 15 Abfrageprozessor konnte nicht
erzeugen einer query-plan aufgrund der Hinweise in dieser Abfrage.
Übermitteln Sie die Abfrage ohne Angabe von hinweisen und ohne SET
FORCEPLAN.
Ich kann Lesen und verstehen, dass es mir sagt, zu entfernen, Hinweis, Frage, ist, warum es gelingen, bei der Kompilierung scheitert aber auf run-time? Gibt es etwas falsch mit meinen index?
Was muss ich ändern für SQL zu verwenden zu beginnen Räumlichen index?
generieren, einige Daten könnte man folgenden Skript.
CREATE TABLE dbo.Temp
(
Id int NOT NULL IDENTITY (1, 1),
Coord geography NOT NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Temp ADD CONSTRAINT
PK_Temp PRIMARY KEY CLUSTERED
(
Id
)
WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
declare @i int =0
declare @lat decimal(8,6) =0.0
declare @long decimal(8,6) =0.0
while (@i < 47000)
begin
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
insert into Temp
select geography::Point(@lat, @long,4326)
set @i =@i+1
end
go
CREATE SPATIAL INDEX [SpatialIndex_1] ON [dbo].Temp
(
[coord]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = LOW,LEVEL_2 = MEDIUM,LEVEL_3 = LOW,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95)
ON [PRIMARY]
GO
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom hier:
Folgende Anforderungen müssen erfüllt sein für eine Nearest Neighbor query zu verwenden, die einen räumlichen index:
die STDistance () - Methode verwenden müssen, die Spalte in der WHERE-und ORDER
BY-Klauseln.
Prädikat STDistance () - Methode muss angeschlossen werden, ein-UND
Verbindung zu den anderen Prädikaten. Die STDistance () - Methode kann nicht
werden in einem optionalen Teil der WHERE-Klausel.
STDistance () - Methode.
Klausel muss ASC.
So, das sollte funktionieren:
Können Sie überprüfen, dass es mit dem räumlichen index sogar die
WITH INDEX
Hinweis ist entfernt.