我正在尝试查找字段以值开头的文档.
使用notablescan禁用表扫描.
这有效:
db.articles.find({"url" : { $regex : /^http/ }})
Run Code Online (Sandbox Code Playgroud)
这不是:
db.articles.find({"source.homeUrl" : { $regex : /^http/ }})
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error: { "$err" : "table scans not allowed:moreover.articles", "code" : 10111 }
Run Code Online (Sandbox Code Playgroud)
两者都有索引url
和source.homeUrl
:
{
"v" : 1,
"key" : {
"url" : 1
},
"ns" : "mydb.articles",
"name" : "url_1"
}
{
"v" : 1,
"key" : {
"source.homeUrl" : 1
},
"ns" : "mydb.articles",
"name" : "source.homeUrl_1",
"background" : true
}
Run Code Online (Sandbox Code Playgroud)
对子文档索引的正则表达式查询有任何限制吗?
第一:我知道在Cassandra进行全面扫描并不是一个好主意,但是,目前,这就是我需要的.
当我开始寻找像这样做的东西时,我读到人们说不可能在卡桑德拉进行全面扫描而且他没有做这种事情.
不满意,我一直在寻找,直到找到这篇文章:http: //www.myhowto.org/bigdata/2013/11/04/scanning-the-entire-cassandra-column-family-with-cql/
看起来很合理,我试一试.因为我将只执行一次全扫描,时间和性能不是问题,我编写了查询并将其放在一个简单的Job中查找我想要的所有记录.从20亿行记录中,1000个是我预期的输出,但是,我只有100条记录.
我的工作:
public void run() {
Cluster cluster = getConnection();
Session session = cluster.connect("db");
LOGGER.info("Starting ...");
boolean run = true;
int print = 0;
while ( run ) {
if (maxTokenReached(actualToken)) {
LOGGER.info("Max Token Reached!");
break;
}
ResultSet resultSet = session.execute(queryBuilder(actualToken));
Iterator<Row> rows = resultSet.iterator();
if ( !rows.hasNext()){
break;
}
List<String> rowIds = new ArrayList<String>();
while (rows.hasNext()) {
Row row = rows.next();
Long leadTime = row.getLong("my_column");
if (myCondition(myCollumn)) {
String rowId = row.getString("key");
rowIds.add(rowId); …
Run Code Online (Sandbox Code Playgroud) 使用postgres 9.6.11,我有一个类似的架构:
所有者:
id: BIGINT (PK)
dog_id: BIGINT NOT NULL (FK)
cat_id: BIGINT NULL (FK)
index DOG_ID_IDX (dog_id)
index CAT_ID_IDX (cat_id)
Run Code Online (Sandbox Code Playgroud)
动物:
id: BIGINT (PK)
name: VARCHAR(50) NOT NULL
index NAME_IDX (name)
Run Code Online (Sandbox Code Playgroud)
在某些示例数据中:
所有者表:
| id | dog_id | cat_id |
| -- | ------ | ------ |
| 1 | 100 | 200 |
| 2 | 101 | NULL |
Run Code Online (Sandbox Code Playgroud)
动物桌:
| id | name |
| --- | -------- |
| 100 | "fluffy" |
| 101 …
Run Code Online (Sandbox Code Playgroud) sql postgresql left-join database-performance full-table-scan
每个人都警告不要在Azure表存储(ATS)中查询RowKey或PartitionKey以外的任何内容,以免被迫进行表扫描.有一段时间,当我需要查询其他内容时,这让我陷入困境,试图找到正确的PK和RK并在其他表中创建伪二级索引.
但是,在我认为合适时,我会在SQL Server中进行常见的表扫描.
所以问题就变成了,我可以多快地扫描Azure表.这是实体/秒中的常量还是取决于记录大小等.如果您需要响应式应用程序,是否有一些关于有多少记录对于表扫描来说太多的经验法则?
我正在阅读 MySql 索引优化的文档。
我找到了一个设置 --max-seeks-for-key=1000.I 在这里检查了 MySQL 的“服务器系统变量” 。
根据它
“通过将其设置为较低的值(例如 100),您可以强制 MySQL 更喜欢索引而不是表扫描”
.
我从全表扫描中了解到:
当查询需要访问大部分行时,顺序读取比通过索引读取要快。顺序读取最小化磁盘搜索,即使查询不需要所有行。
因此,如果 MySQL 正在执行全表扫描以最小化磁盘搜索,为什么要使用 --max-seeks-for-key=1000 来首选索引扫描,这可能会增加磁盘搜索。
在文档8.3.1.20 如何避免全表扫描中提到它是避免全扫描的一个步骤:使用 --max-seeks-for-key=1000 启动 mysqld
所以我很想知道 --max-seeks-for-key 是否有任何实际和有意义的用途。
我想做一些类似于http://www.bestbrains.dk/Blog/2010/03/25/HowToAssertThatYourSQLDoesNotDoFullTableScans.aspx 中描述的事情,但为此我需要 postgres 来跟踪任何全表扫描做。postgres 有这样的东西吗?
据我所知,堆表是没有聚簇索引的表,没有物理顺序.我有一个堆栈表"扫描"有120k行,我使用这个选择:
SELECT id FROM scan
Run Code Online (Sandbox Code Playgroud)
如果我为列"id"创建一个非聚集索引,我会得到223个物理读取.如果我删除非聚集索引并更改表以使"id"成为我的主键(以及我的聚集索引),我将获得515个物理读取.
如果聚集索引表是这样的图片:
为什么Clustered Index Scans像表扫描一样工作?(或者在检索所有行的情况下更糟).为什么它不使用具有较少块的"聚簇索引表"并且已经具有我需要的ID?
我在使用不同的正确查询更改PL/SQL oracle中的查询时遇到问题.当前查询:
SELECT MAX (workzone)
FROM sccd_device_uim_tab
WHERE NAME LIKE 18075009 || '%';
Run Code Online (Sandbox Code Playgroud)
我的客户需要修改查询,因为:
Full table with a % should definitely be avoided.
Run Code Online (Sandbox Code Playgroud)
这个问题有什么解决方案?
提前致谢
从包中添加查询
PROCEDURE sccd_get_impactservice_manual (
in_faultid IN VARCHAR2,
in_deviceid IN VARCHAR2,
in_status IN VARCHAR2,
in_opendate IN DATE,
in_closedate IN DATE,
out_impact_result OUT tcur,
out_count_service OUT NUMBER,
out_workzone OUT VARCHAR2,
p_ret_char OUT VARCHAR2,
p_ret_number OUT NUMBER,
p_ret_msg OUT VARCHAR2
)
IS
BEGIN
SELECT orauser.ossa_get_sto_from_device (in_deviceid)
INTO out_workzone
FROM DUAL;
IF out_workzone IS NULL
THEN
SELECT MAX (workzone) …
Run Code Online (Sandbox Code Playgroud) 在这里找到:
通常,考虑在以下任何一种情况下在列上创建索引:
我不明白为什么在这种情况下会发生全表锁.我想如果我试图删除/更新父表中的主键,那么将对子表执行全表扫描.
锁从哪里来?
我有一个表负责存储日志.DDL是这样的:
CREATE TABLE LOG(
"ID_LOG" NUMBER(12,0) NOT NULL ENABLE,
"DATA" DATE NOT NULL ENABLE,
"OPERATOR_CODE" VARCHAR2(20 BYTE),
"STRUCTURE_CODE" VARCHAR2(20 BYTE),
CONSTRAINT "LOG_PK" PRIMARY KEY ("ID_LOG")
);
Run Code Online (Sandbox Code Playgroud)
有这两个指数:
CREATE INDEX STRUCTURE_CODE ON LOG ("OPERATOR_CODE");
CREATE INDEX LOG_01 ON LOG ("STRUCTURE_CODE", "DATA") ;
Run Code Online (Sandbox Code Playgroud)
但是这个查询产生了一个完整的表扫描:
SELECT log.data AS data1,
OPERATOR_CODE,
STRUCTURE_CODE
FROM log
WHERE data BETWEEN to_date('03/03/2008', 'DD-MM-YYYY')
AND to_date('08/03/2015', 'DD-MM-YYYY')
AND STRUCTURE_CODE = '1601';
Run Code Online (Sandbox Code Playgroud)
为什么我总是看到一个FULL TABLE SCAN
列DATA
和STRUCTURE_CODE
?
(我也试过创建两个不同的索引STRUCTURE_CODE
,DATA
但我总是进行全表扫描)
full-table-scan ×10
indexing ×4
sql ×4
oracle ×3
postgresql ×2
azure ×1
cassandra ×1
database ×1
java ×1
left-join ×1
mongodb ×1
mysql ×1
regex ×1
search ×1
sql-like ×1
sql-server ×1
table-lock ×1