使用Postgres我有一个关于索引以提高效率的一般性问题。
应该为下一个查询创建哪些最好的索引?
SELECT task_name, user_name
FROM tasks
WHERE (user_id = 1 OR task_type = 'SOME_TYPE') and is_deleted = FALSE
GROUP BY task_name, user_name
WHERE子句中的列(user_id、task_type、is_deleted)是否需要与GROUP (task_name、user_name)的索引相同?
OR运算符是否意味着列需要在不同的索引上
我理解需要一个多列索引,索引顺序在请求中很重要,例如
SELECT product_id
FROM order_detail
WHERE order_id in (1, 2, 3)
但是,当WHERE子句中没有值时,我无法理解多列索引和索引顺序的必要性。
我相信,只有在WHERE子句中指定值时才使用多列索引(我可能错了)。因此,为了“优化”表order_detail,对于下面的请求,应该在product_id和order_id 上创建多列索引,还是应该创建两个单独的索引,一个在order_id上,一个在product_id上:
选择O.order_id,P
我正在为PostgreSQL数据库创建索引。我想知道用于对PostgreSQL语句中的结果进行排序的列是否应该包括在索引中。 假设我已经在PostgreSQL数据库中创建了一个标签为'table1‘的表,其中包含标签为'col1’、'col2‘和'col3’的列。 我想执行以下查询: SELECT * FROM table1 WHERE col1 = 'word1' AND col2 = 'word2' ORDER BY col3; 我知道此搜索的索引应该包括WHERE子句中引用的所有列,因此,在本例中,索引将包括col1和co
我很喜欢使用Postgres全文搜索来应用索引来跨多个列进行查询。
根据,我可以应用这样的多列索引:
CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', title || ' ' || body));
但我搞不懂什么时候会实际使用这个索引。WHERE子句中使用的to_tsvector函数是否必须与索引中使用的格式完全相同?
SELECT title FROM pgweb WHERE to_tsvector(title || ' ' || body) @@ to_tsq
假设我有一个带有(索引)列id : uuid和created : timestamp的事件表。
id列是唯一的,但created列不是唯一的。我想使用created列按时间顺序遍历该表。
就像这样:
SELECT * FROM events WHERE created >= $<after> ORDER BY created ASC LIMIT 10
这里,$<after>是一个模板参数,取自于前面的查询。
现在,我可以看到两个问题:
因为created不是唯一的,所以顺序不会被完全定义。也许这类应该是id, created?
每一行应该只在一个页面上,但
我在一个有900万行的表中使用postgres进行慢查询。
查询:EXPLAIN (ANALYZE, BUFFERS) SELECT date_point, geo, alarms, status FROM tracking_master WHERE id_asset = 151 AND date_point >= '2017-07-21 19:20:05' AND date_point <= '2017-07-21 19:25:05' ORDER BY date_point asc LIMIT 1000
这里的查询解释(ANALYZE,BUFFE
我们制作了一个控制台应用程序,它将更新表b上的y列。在服务器上运行这个查询,非常慢,我找不到原因。表t大小为21 GB,表大小l为13 GB。
SELECT DISTINCT a.x,
a.y
FROM a
JOIN b ON a.x = b.x
-- x is uuid that we use on both tables
WHERE b.y IS NULL
AND a.y IS NOT NULL
LIMIT 500;
到目前为止,我尝试过的是;
在两个表上创建具有where语句的索引,如下所示
在b(x)上创建索引idx_name,其中(y为NUL
我有以下查询:
EXPLAIN SELECT *
FROM glean2_saves
WHERE username = '1d85d5aed8b02b3d6b0c155a563293ef'
AND ses_id = 'e4fa3ae216f5033fbd16d6c66370954c'
AND save_status =1
ORDER BY id DESC
结果是:
id select_type table type possible_keys key key_len ref rows Extra
1 S
我们正在构造一个项目,其中一些表将有许多记录,我们打算使用4个数字外键和1个数字主键,我们的假设是,如果我们为每个外键创建一个索引和主键的默认索引,postgres计划将使用所有开始(总共5个)来执行查询。
95%的时间查询将至少提供4个外键。
会使用每个索引来更快地在记录的顺序部分中定位搜索吗?会让4个索引提高查询的速度,还是只需要一个父级索引(branch_id)??
谢谢你的时间和经验。
示例:如果所有外键都有索引,则为
SELECT * FROM products WHERE
account_d=1 AND
organization_id=2 AND
business_id=3
我在postgres中有一个包含以下3列的表:pk:primary key, name::text, date1::date
如果我的postgres db中有超过100万行,那么哪个sql会更快?
select * t1 order由pkselect * t1 order by date1select * t1 order by name
delayed_job定期执行这样的查询:
SELECT "delayed_jobs".*
FROM "delayed_jobs"
WHERE ((run_at <= '2012-05-23 15:16:43.180810' AND (locked_at IS NULL OR locked_at < '2012-05-23 11:16:43.180841') OR locked_by = 'host:foo pid:1') AND failed_at IS NULL)
ORDER BY priorit
好的,我在这里有一个SQL查询:
SELECT a.id,... FROM article AS a WHERE a.type=1 AND a.id=3765 ORDER BY a.datetime DESC LIMIT 1
我想按国家和id获取准确的文章,并为该索引创建两列type和id。Id也是主键。我使用EXPLAIN关键字来查看使用了哪个索引,它使用的不是多列索引,而是主键索引,但我确实在创建索引时准确地设置了where内容。
MySQL是否使用主键索引而不是多列索引,因为主键索引更快?或者我应该强制MySql使用多列索引?
附注:刚刚注意到,当只有一个结果行时,使用order是很愚
我正在运行并行Postgres查询,如下所示:
UPDATE foo SET bar = bar + 1 WHERE baz = 1234
每个查询都会影响固定的K行数,而且我找不到一种方法来强制执行行的更新顺序,最后会出现死锁。目前,我通过手工执行命令来解决这个问题,但这意味着我必须执行比通常更多的查询,同时将搜索复杂度从O(log + K)提高到O(K )。
是否有一种方法可以提高性能而又不受死锁的影响?我怀疑,如果Postgres按照扫描行的顺序更新行,用(baz)索引替换(baz, id)索引可能有效,这是一种值得采用的方法吗?
我有两个Postgres查询可以工作。
SELECT date_trunc('hour', time) t, COUNT(*) AS "SC15" FROM logfile
WHERE source = 'SC15' AND type = 'Sort'
GROUP BY t ORDER BY t;
SELECT date_trunc('hour', time) t, COUNT(*) AS "SC71" FROM logfile
WHERE source = &
我有一页清单正在缓慢加载,我想要检查我是否有好的索引在上面。
该表中有500万行。每个清单都属于一个channel_id。该网页只显示一个频道的列表,分页,所以第一个‘过滤器’总是' channel _id‘。在这些例子中,我将省略偏移量和简洁性的限制。
select * from listings where channel_id = 5;
列表还包含一个status列,默认情况下,该页面在“活动”列表上打开。
select * from listings where channel_id = 5 and status = 'active';
因此,我们创建了一个复合
在我的查询中,只有当第一个表的指定列为null时,我才希望连接表。我该怎么做呢。这是一个内部连接,有3个表。
这是我的问题。
SELECT item_id,item_name
FROM item i
INNTER JOIN supplier s ON i.item_id=s.items_id
INNER JOIN order O ON O.id=s.req_id
WHERE price>400 AND category='ALL';
只有当item表中的列'item_order_id‘为NULL时,才能使用此联接。如果该列不是null,则不执行此联接shuo
通过反复试验,我发现,如果我做了一个左联接,例如:
SELECT
firsttable.id,
secondtable.id,
secondtable.varcharColumn
FROM
firsttable
LEFT JOIN
secondtable
ON
firsttable.id=secondtable.id
对于大一点的桌子来说,这种表演太糟糕了。如果我将secondtable.varcharColumn作为结果集中的列删除,或者更改类型,那么性能将提高一个数量级。列是varchar 255,所以它不应该有那么大的区别。如果我将
好的,因为Heroku,我从mysql转到postgresql。我有一条在mysql中工作得很好的语句,但我似乎无法找到最好的PG方法/任何方法。
m = C.select("m.derp, c.id").joins("join m on m.c_id = c.id").where("m.id IN (SELECT max(id) from m group by c_id order by updated_at desc)").order("m.updated_at desc")
基本上,我需要按c分组,按最近创建的m's
我试图解释是如何存储在Postgres中的。假设我创建了这样一个索引
CREATE INDEX orders_unbilled_index ON orders (order_nr)
WHERE billed is not true
为了快速运行如下的查询
SELECT *
FROM orders
WHERE billed is not true AND order_nr > 1000000
Postgres显然将索引存储在order_nr上,该索引构建在条件表达式billed is not true定义的orders表的子集上。不过,我有几个问题要问:
Postgres是否在bill
最小示例
select a.order_id as X from orders as a
WHERE
X > 8000
查询将失败,因为X不是列,有什么解决方案吗?
其他示例
select (if (E.size > 0, E.Size, (B.height x B.width)) as sizeX from
orders as a, report as E, size as B
where
(E.id = a.id and B.id = a.id)
and
sizeX > 100
我的问题可能包含打字错误,但我希望我的问题是清楚的
只是想知道索引的事。这对我来说是一个很新的概念,我看不出在ON子句中声明列和在INCLUDE子句中声明列之间的区别。下面的例子应说明这一问题:
CREATE INDEX ix_client_info1
ON dbo.client(name, age, city)
WHERE name = 'A%';
CREATE INDEX ix_client_info2
ON dbo.client(name)
INCLUDE(age, city)
WHERE name = 'A%';
这两个指数在行为上有何不同?在哪种情况下使用哪种?
希望每个人都做得很好。 我试图通过创建索引来优化带有order by子句的N1Ql查询,我对orderby列的顺序以及列的位置应该保持不变以具有正确的索引或排序在CouchBase6.0.3中无关紧要。下面是查询 Select * from employee where type= employee and number='123' and division='456'
order by class,number 索引可以是 Create index idx_123 on employee(number,division,class) where type=&
我在编写Postgres查询时遇到了问题,这个查询非常感谢任何人的帮助。我有3张相互关联的桌子如下:
顺序:
id (pk)
updated_at (日期时间)
所有者(外键,转到OrderOwner)
OrderOwner:
id (pk)
名字
SharedOrder:
id (pk)
shared_to_owner (外键,转到OrderOwner)
order_id (外键,订购)
指数:
订单
SharedOrder
现在,我需要编写一个查询,该查询获取属于所有者或与所有者共享的订单。我的查询如下:
SELECT id, owner, updated_at FROM Order
W
我是SQL世界的新手,我搜索过很多关于索引的博客。
我有两个问题:
1-如何直接从索引表中查询并选择和显示其内容?例如,假设表A有两个索引名为A_index_1和A_index_2,.i想要这样做:select * from A.A_index_2并显示其内容并对其进行实验。
2-第二个问题是更复杂的,对于这个,行是在多列索引中排序的,它声称最左边的列的下一列也是排序的,假设我们有这个索引,列如下所示:
IDX1 on Table A : Country | Province | City | Street | Shop
假设有很多行共享相同的国家、省份和城市。现在,如果我们查询:selec
我有一个相当大的表,其中最常见的API请求如下所示:
/api/orders?status=confirmed
为该请求生成的实际SQL类似于:
SELECT * FROM orders
WHERE account_id = 'X' AND status = 'confirmed' AND versionID IS NULL
ORDER BY int_id;
对于我来说,在postgres 9.5.4上运行,我不知道什么索引会让它表现得很好。
我在(account_id, status, versionID)上创建了一个索引,去掉了ORDER BY (它使用
我有一个表,我需要从该表中获取按字段降序排序的行。运行如下所示的EXPLAIN查询时:
EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC
我在Extra列中获得了Using where; Using filesort。所以我尝试创建一个DESC索引:
CREATE INDEX name ON table (field DESC);
但是当我再次运行EXPLAIN时,我在Extra列中得到了相同的Using where; Using filesort,并且性能几乎相同。
我做错了什么?
假设我的数据库中有一个表Order,它包含Id、Name、Code列。当我执行的时候,我们说
SELECT * FROM Order
我有两条记录:
Id,Name,Code
1,FirstOrder,165y
2,SecondOrder,165y
使用相同代码的两个订单,一切正常!但当我尝试通过代码查找时:
SELECT * from ORDER where code = '165y'
我只得到了一行结果:
Id,Name,Code
1,FirstOrder,165y
没有显示第二个顺序,尽管它具有相同的代码。但如果我试着这样做:
SELECT * from Order w
我有一个postgres表,其中有一个名为"ts“的列,其中包含一个时间戳 现在,我希望从table中选择timestemp等于特定时间戳的行,因此我决定用我的python代码编写以下SQL语句 date_to_choose = '2020-04-22 06:34:08+00:00'
cur.execute("""SELECT * FROM data
ORDER BY ts DESC
WHERE ts = TO_TIMESTAMP('{0}','YYYY-MM-DD
如果我有一个表单,用户可以在其中指定一组筛选器(例如productid > 5,can = "Applicances",Price > 3),那么做一个准备好的语句似乎很自然,比如:
SELECT *
FROM Products
WHERE
(@Price IS NULL OR Price > @Price) AND
(@Category IS NULL OR @Category = Category) AND
(@ProductID IS NULL OR Price > @Product);
然后添加@Price、@Price和@Pro
我有一个表MYTABLE,大约有25列,其中两列是USERID (integer)和USERDATETIME (dateTime)。
我在这两列的这个表上有一个索引,第一列是USERID,后面是USERDATETIME。
我想获取每个用户I的最大USERDATETIME。所以:
select USERID,MAX(USERDATETIME)
from MYTABLE WHERE USERDATETIME < '2015-10-11'
GROUP BY USERID
我原本期望优化器能够找到每个唯一的USERID和最大的USERDATETIME,并且查找的数量等于唯一的U
Select * from (select tmp.userid userid, tmp.username ,tmp.likescore+tmp.commentscore+tmp.sharescore+tmp.tagscore+tmp.userscore+tmp.lsharescore+tmp.friendscore as score from
(
SELECT u.userid, u.username,
(select 10*count(1) from b_likes l where l.userid = u.userid) likescore,
(sel
我尝试使用clickhouse存储40亿个数据,部署在一台机器上,48核cpu和256 g内存,机械硬盘。
我的数据有十列,我希望通过SQL语句快速搜索任何列,例如:
select * from table where key='mykeyword'; or select * from table where school='Yale';
我使用order by来建立一个排序键,order by (key, school, ...),但是当我搜索时,只有按键排序的第一个字段具有很高的性能。在搜索其他字段时,查询速度非常慢,甚至内存溢出(内存分配已经足够大)。
因
我有下表,大约有400万行:
CREATE TABLE members (
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE,
-- other columns...
);
我使用以下查询提取最新更新的行:
SELECT *
FROM members
W
我想使用A和B列的索引检索一些行。有人告诉我,确保我的索引被用于检索行的唯一方法是使用ORDER子句,例如:
A B offset
1 5 1
1 4 2
2 5 3
2 4 4
SELECT A,B FROM TableX
WHERE offset > 0 AND offset < 5
ORDER BY A,B ASC
但是,我希望返回的行的结果仅由B列而不是A、B来排序。
A B
1 4
2 4
2 5
1 5
我如何做到这一点,但仍然确保我的索引被使用,而不是一个完整的表扫描?如果我按B来使用ORDER,那么这不