Thanks Umberto,
I have an index set up on the TimeStamp field, but looking at the query
plans it won't affect performance as SQL Server still has to get all the
records in the table to order them, before applying WHERE clauses in the
outer query.
What would be ideal is a LAYER property such as ORDER which would allow
a field to be set to order records for rendering (similar to FILTER
which is added to the outer query).
I'll have to look at how Postgres handles subqueries to see if it is
also affected by the same issues.
Note SQL Server simply (and silently) ignores the ORDER BY clause when
using SELECT TOP 100 PERCENT.
This introduced hard to find logical errors in my application which were
only spotted by someone who knew the data well, so I'd suggest anyone
who relies on features being rendered in a specific order to
double-check their apps!
On 28/04/2014 11:53, Umberto Nicoletti wrote:
If you don't have an index yet on TimeStamp, you could try creating
one with an ORDER clause and see if this improves performance (with a
properly created index you can avoid running separate order operation
for every query):
http://technet.microsoft.com/en-us/library/ms181154(v=sql.105).aspx
<http://technet.microsoft.com/en-us/library/ms181154%28v=sql.105%29.aspx>
HTH,
Umberto
On Mon, Apr 28, 2014 at 10:50 AM, geographika <[email protected]
<mailto:[email protected]>> wrote:
Hi list,
I recently came across a problem with the order features are
rendered by Mapserver. I am displaying road surveys done at
various times, and have a WMS layer that displays the latest
survey results. Rather than trying to do complicated segmentation,
I simply display features ordered by survey date, with the most
recent records on top.
Initially my layer DATA clause was similar to the following:
SELECT ID, GEOM, Rating, YEAR([TimeStamp]) AS [YEAR] from
mydata) as tbl USING UNIQUE ID USING SRID=29902 ORDER BY
[TimeStamp] DESC
I hadn't realised that anything outside after the USING...
statement was ignored, so the records were displayed unordered.
I then tried using:
SELECT ID, GEOM, Rating, YEAR([TimeStamp]) AS [YEAR] from mydata
ORDER BY [TimeStamp] DESC) as tbl USING UNIQUE ID USING SRID=29902
However when the data for the WMS is prepared this SQL becomes a
subquery, and a WHERE clause is added to get the data for the
requested extent.
SQL Server doesn't allow ORDER BY in a subquery, so an error is
thrown:
"The ORDER BY clause is invalid in views, inline functions,
derived tables, subqueries, and common table expressions, unless
TOP or FOR XML is also specified."
My current workaround is to change the SQL to:
SELECT TOP 1000000 ID, GEOM, Rating, YEAR([TimeStamp]) AS [YEAR]
from mydata ORDER BY [TimeStamp] DESC) as tbl USING UNIQUE ID
USING SRID=29902
However this causes slow queries as all data needs to be fetched
in order before filtering.
So my question is is there a way to order records using another
LAYER property (similar to the FILTER property), so ordering is
done only on the records returned for rendering?
Thanks for any advice,
Seth
--
web:http://geographika.co.uk
twitter: @geographika
_______________________________________________
mapserver-users mailing list
[email protected]
<mailto:[email protected]>
http://lists.osgeo.org/mailman/listinfo/mapserver-users
_______________________________________________
mapserver-users mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/mapserver-users