$ .has('selecor')和$ .filter('selector')方法有什么区别,哪个更好.因为它们都执行相同的操作.
我有这个查询......运行速度非常慢(差不多一分钟):
select distinct main.PrimeId
from PRIME main
join
(
select distinct p.PrimeId from PRIME p
left outer join ATTRGROUP a
on p.PrimeId = a.PrimeId or p.PrimeId = a.RelatedPrimeId
where a.PrimeId is not null and a.RelatedPrimeId is not null
) mem
on main.PrimeId = mem.PrimeId
Run Code Online (Sandbox Code Playgroud)
PRIME表有18k行,并且在PrimeId上有PK.
ATTRGROUP表有24k行,在PrimeId上有复合PK,col2,然后是RelatedPrimeId,然后是cols 4-7.RelatedPrimeId上还有一个单独的索引.
查询最终返回8.5k行 - PRIME表上的PrimeId的不同值,与ATTRGROUP表上的PrimeId或RelatedPrimeId匹配
我有相同的查询,使用ATTRADDRESS而不是ATTRGROUP.ATTRADDRESS具有与ATTRGROUP相同的密钥和索引结构.它只有11k行,不过可以肯定它是小的,但在这种情况下,查询运行大约一秒钟,并返回11k行.
所以我的问题是:
尽管结构相同,但查询如何在一个表上比另一个表慢得多.
到目前为止,我已经在SQL 2005上尝试了这一点,并且(使用相同的数据库,已升级)SQL 2008 R2.我们两个人独立地获得了相同的结果,将相同的备份恢复到两台不同的计算机.
其他详情:

但是,该表上的实际行数略多于24k,而不是320M!
如果我在括号内重构查询的一部分,那么它使用UNION而不是OR,因此:
select distinct main.PrimeId
from PRIME main
join
(
select distinct p.PrimeId from PRIME p
left outer join ATTRGROUP …Run Code Online (Sandbox Code Playgroud) 我有一个要求,我必须强制sql不要使用表上存在的特定索引.
例如,
create table t1(id varhcar2(10),data1 varchar2(3000));
create table t2(id varhcar2(10),data2 varchar2(3000));
create index id1 on t1(id);
select * from t1,t2 where t1.id=t2.id;
Run Code Online (Sandbox Code Playgroud)
我不能删除索引id1,也不能删除它,因为我没有权限.因此我想添加一些提示,以避免使用它..
是否有任何此类提示,或者是否有任何解决方法.
提前致谢
我有一个大约800万行的数据库,我想从中随机选择n行.首先,我在StackOverflow和MSDN上的文章中阅读了流行的和类似的问题,但我觉得答案仍然不适合我的需求.
如果我想在没有额外条件的情况下随机选择一定百分比的行,那么所提供的解决方 但是我想要随机选择n行(例如最多5行),所有这些都匹配某个条件.
我的数据库包含包含词性,标签,引理和令牌等信息的单词.现在我想执行查询以选择5个与查询中的单词类似的随机单词(例如,给我5个类似于模糊的单词),这是通过仅查看具有相同词性和单词的值来确定的. levenshtein距离超过一定阈值.我在sql server中有一个函数可以计算levenshtein距离.
上述方法的问题在于它们要么必须遍历所有记录并计算levenshtein距离(这需要花费很多时间!),或者它们只能让我选择百分比而不是n行.
一个运行得很好的查询是:
SELECT DISTINCT TOP 5 lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun'
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].edit_distance('monarchie', Words.Token) > 0.5
Run Code Online (Sandbox Code Playgroud)
然而,只有顶部我总是得到相同的结果.我需要我的上衣是随机的.像使用NEWID()这样的方法将首先遍历整个数据库,然后随机选择,这不是我想要的行为,因为它们占用时间太长.
有没有人有想法在庞大的数据库上快速选择n个随机行?
编辑:
有人(不在StackOverflow上)可能为我提供了一个OPTION子句和fast关键字的解决方案,该关键字检索它找到的前n行.
使用OPTION(快5)我到目前为止获得了最佳性能(在800万行表上有10秒).我还将Levenshtein函数从SQL实现更改为ac#编写的库实现,这大大加快了性能.
Select top 5 * from (
SELECT DISTINCT lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG
FROM Words …Run Code Online (Sandbox Code Playgroud) 我在我正在检查的应用程序中找到了一些SQL查询:
SELECT DISTINCT
Company, Warehouse, Item,
SUM(quantity) OVER (PARTITION BY Company, Warehouse, Item) AS stock
Run Code Online (Sandbox Code Playgroud)
我很确定这会得到与以下结果相同的结果:
SELECT
Company, Warehouse, Item,
SUM(quantity) AS stock
GROUP BY Company, Warehouse, Item
Run Code Online (Sandbox Code Playgroud)
在第一种方法中使用第一种方法是否有任何好处(性能,可读性,编写查询的额外灵活性,可维护性等)?
我有一个DELETE查询,我需要在PostgreSQL 9.0.4上运行.我发现它是高性能的,直到它在subselect查询中遇到524,289行.
例如,在524,288,没有使用物化视图,成本看起来很不错:
explain DELETE FROM table1 WHERE pointLevel = 0 AND userID NOT IN
(SELECT userID FROM table2 fetch first 524288 rows only);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Delete (cost=13549.49..17840.67 rows=21 width=6)
-> Index Scan using jslps_userid_nopt on table1 (cost=13549.49..17840.67 rows=21 width=6)
Filter: ((NOT (hashed SubPlan 1)) AND (pointlevel = 0))
SubPlan 1
-> Limit (cost=0.00..12238.77 rows=524288 width=8)
-> Seq Scan on table2 (cost=0.00..17677.92 rows=757292 width=8)
(6 rows)
但是,一旦我达到524,289,物化视图就会发挥作用,DELETE查询变得更加昂贵:
explain DELETE FROM table1 WHERE pointLevel = 0 AND userID NOT IN …
database postgresql materialized-views query-performance sql-delete
我们在MySql中有一个表有大约3000万条记录,以下是表结构
CREATE TABLE `campaign_logs` (
`domain` varchar(50) DEFAULT NULL,
`campaign_id` varchar(50) DEFAULT NULL,
`subscriber_id` varchar(50) DEFAULT NULL,
`message` varchar(21000) DEFAULT NULL,
`log_time` datetime DEFAULT NULL,
`log_type` varchar(50) DEFAULT NULL,
`level` varchar(50) DEFAULT NULL,
`campaign_name` varchar(500) DEFAULT NULL,
KEY `subscriber_id_index` (`subscriber_id`),
KEY `log_type_index` (`log_type`),
KEY `log_time_index` (`log_time`),
KEY `campid_domain_logtype_logtime_subid_index` (`campaign_id`,`domain`,`log_type`,`log_time`,`subscriber_id`),
KEY `domain_logtype_logtime_index` (`domain`,`log_type`,`log_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)
以下是我的查询
我正在做UNION ALL而不是使用IN操作
SELECT log_type,
DATE_FORMAT(CONVERT_TZ(log_time,'+00:00','+05:30'),'%l %p') AS log_date,
count(DISTINCT subscriber_id) AS COUNT,
COUNT(subscriber_id) AS total
FROM stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
WHERE DOMAIN='xxx'
AND …Run Code Online (Sandbox Code Playgroud) mysql sql aggregate-functions query-performance mysql-variables
我想检索另一组点的给定范围内的所有点.比方说,找到距离任何地铁站500米范围内的所有商店.
我写了这个查询,这很慢,并且想要优化它:
SELECT DISCTINCT ON(locations.id) locations.id FROM locations, pois
WHERE pois.poi_kind = 'subway'
AND ST_DWithin(locations.coordinates, pois.coordinates, 500, false);
Run Code Online (Sandbox Code Playgroud)
我正在使用最新版本的Postgres和PostGis(Postgres 9.5,PostGis 2.2.1)
这是表元数据:
Table "public.locations"
Column | Type | Modifiers
--------------------+-----------------------------+--------------------------------------------------------
id | integer | not null default nextval('locations_id_seq'::regclass)
coordinates | geometry |
Indexes:
"locations_coordinates_index" gist (coordinates)
Table "public.pois"
Column | Type | Modifiers
-------------+-----------------------------+---------------------------------------------------
id | integer | not null default nextval('pois_id_seq'::regclass)
coordinates | geometry |
poi_kind_id | integer |
Indexes:
"pois_pkey" PRIMARY KEY, btree (id)
"pois_coordinates_index" gist (coordinates)
"pois_poi_kind_id_index" …Run Code Online (Sandbox Code Playgroud) 有谁知道具体的时钟何时$upstream_response_time开始和结束?
该文档似乎有点含糊:
记录从上游服务器接收响应所花费的时间;时间以秒为单位,精度为毫秒。多个响应的时间由逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。
还有一个$upstream_header_time值,它增加了更多的混乱。
我假设$upstream_connect_time连接建立后但在上游接受之前停止?
这之后包括什么$upstream_response_time?
我已经观察到,将数据插入内存优化表比在5-SSD条带集上对基于磁盘的表进行等效的并行插入要慢得多。
--DDL for Memory-Optimized Table
CREATE TABLE [MYSCHEMA].[WIDE_MEMORY_TABLE]
(
[TX_ID] BIGINT NOT NULL
, [COLUMN_01] [NVARCHAR](10) NOT NULL
, [COLUMN_02] [NVARCHAR] (10) NOT NULL
--etc., about 100 columns
--at least one index is required for Memory-Optimized Tables
, INDEX IX_WIDE_MEMORY_TABLE_ENTITY_ID HASH (TX_ID) WITH (BUCKET_COUNT=10000000)
)
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY)
--DDL for Disk-Based Table
CREATE TABLE [MYSCHEMA].[WIDE_DISK_TABLE]
(
[TX_ID] BIGINT NOT NULL
, [COLUMN_01] [NVARCHAR](10) NOT NULL
, [COLUMN_02] [NVARCHAR] (10) NOT NULL
--etc., about 100 columns
--No indexes
) ON [PRIMARY] …Run Code Online (Sandbox Code Playgroud) sql-server performance query-performance memory-optimized-tables
sql ×5
performance ×4
sql-server ×4
postgresql ×2
database ×1
distinct ×1
group-by ×1
hints ×1
jquery ×1
mysql ×1
nginx ×1
oracle ×1
postgis ×1
random ×1
sql-delete ×1