# Set Attribute
y is a list or dictionary and atom
- an item from the list
ywith the corresponding attribute set
- the null symbol
ywith all attributes removed
`s#2 2 3 sorted items in ascending order list, dict, table `u#2 4 5 unique each item unique list `p#2 2 1 parted common values adjacent simple list `g#2 1 2 grouped make a hash table list
Setting or unsetting an attribute other than sorted causes a copy of the object to be made.
g are preserved on append in memory, if possible.
s is preserved on append to disk.
q)t:([1 2 4]y:7 8 9);`s#t;attr each (t;key t) ``s
The sorted attribute can be set on a simple or mixed list, a dictionary, table, or keyed table.
q)`s#1 2 3 `s#1 2 3 q)`#`s#1 2 3 1 2 3
Setting the sorted attribute on an unsorted list signals an error.
q)`s#3 2 1 's-fail  `s#3 2 1 ^
Setting/unsetting the sorted attribute on a list which is already sorted will not cause a copy to be made, and hence will affect the original list in-place.
Setting the sorted attribute on a table sets the parted attribute on the first column.
q)meta `s#( ti:00:00:00 00:00:01 00:00:03; v:98 98 100.) c | t f a --| ----- ti| v p v | f
Setting the sorted attribute on a dictionary or table, where the key is already in sorted order, in order to obtain a step-function, sets the sorted attribute for the key but copies the outer object.
The unique attribute can be set on simple and mixed lists where all items are distinct.
Grouped and parted
Attributes parted and grouped are useful for simple lists (where the datatype has an integral underlying value) in memory with a lot of repetition.
The parted attribute asserts all common values in the list are adjacent. The grouped attribute causes kdb+ to create and maintain an index (hash table).
If the data can be sorted such that
p can be set, it effects better speedups than grouped, both on disk and in memory.
The grouped attribute implies an entry’s data may be dispersed – and possibly slow to retrieve from disk.
The parted attribute is removed by any operation on the list.
q)`p#2 2 2 1 1 4 4 4 4 3 3 `p#2 2 2 1 1 4 4 4 4 3 3 q)2,`p#2 2 2 1 1 4 4 4 4 3 3 2 2 2 2 1 1 4 4 4 4 3 3
The grouped attribute is presently unsuitable for cycling through a small window of a domain, due to the retention of keys backing the attribute.
q)v:\`g#1#0 q)do[1000000;v+:1]; q)0N!.Q.w\`used; v:\`g#\`#v; .Q.w\`used 74275344 332368
s-fail not sorted ascending type tried to set u, p or g on wrong type u-fail not unique or not parted
Some q functions use attributes to work faster:
- Where-clauses in
exectemplates run faster with
distinct, Find and
in(if the right argument has an attribute)
Setting attributes consumes resources and is likely to improve performance only on lists with more than a million items. Test!
Applying an attribute to compressed data on disk decompresses it.